2015-10-14 41 views
0

好吧,所以我想寫一個實現四階runge kutta方法的數值近似的微分方程,作爲我的數學課程的一部分但也要學習一些編程,但問題是它在近似的每一步中使用這些係數。所以我們從x值和y值開始,它想要爲後面的x值找到y值,我給它一個步長,通常爲0.1,它在x中向上移動0.1,並給出了一個新的近似值y值,並在這些步驟中的每一個步驟中執行4個近似值,我稱之爲k1,k2,k3和k4。那麼它需要這4個近似值的加權平均值,並給出我應該相當準確的最終近似值。問題在於,對於每一步我得到k1 = k2 = k3,但是k4是不同的。這看起來不正確。我測試它的功能,供給它的F(X,Y)= 2X-3Y + 1,使用步長小時,我的K公司的如下:我的rk4實現的加權平均的明顯approximatons都是一樣的

k1=f(x,y) 
k2=f(x+.5h,y+.5hk1) 
k3=f(x+.5h,y+.5hk2) 
k4=f(x+h,y+hk3) 

所以只檢查此代數到有k1 = k2 I以9y = 1-6x結束,但我給它的初始值是(x0,y0)=(1,5),45顯然!= 1-6

所以這個一切似乎都錯了。根據教科書我沒有得到正確的答案,這些k實際上不應該是相同的。所以無論如何這裏是我的代碼。 k之間的打印語句只是作爲測試,看看k在我們循環n時實際上正在變化。

import numpy 

def rk4(x0,y0,xf,h,f): 
    y=[] 
    x=numpy.linspace(x0,xf,(xf-x0)/h+1) 
    y.insert(0,y0) 
    for n in range(len(x)-1): 
     k1=f(x[n],y[n]) 
     print k1 
     k2=f(x[n]+(1/2)*h,y[n]+(1/2)*h*k1) 
     print k2 
     k3=f(x[n]+(1/2)*h,y[n]+(1/2)*h*k2) 
     print k3 
     k4=f(x[n]+h,y[n]+h*k3) 
     print k4 
     y.insert(n+1,y[n]+(h/6)*(k1+2*k2+2*k3+k4)) 
     print y[n]+(h/6)*(k1+2*k2+2*k3+k4) 

    print x 
    print y 

def twoxminusthreeyplusone(x,y): 
    return 2*x-3*y+1 

rk4(1,5,1.5,0.1,twoxminusthreeyplusone) 

於是我得到這個輸出

/usr/bin/python2.7 /home/t/PycharmProjects/untitled/chunk.py 
-12.0 
-12.0 
-12.0 
-8.2 
3.86333333333 
-8.39 
-8.39 
-8.39 
-5.673 
3.06961666667 
-5.80885 
-5.80885 
-5.80885 
-3.866195 
2.52110925 
-3.96332775 
-3.96332775 
-3.96332775 
-2.574329425 
2.14792644708 
-2.64377934125 
-2.64377934125 
-2.64377934125 
-1.65064553888 
1.900100743 
[ 1. 1.1 1.2 1.3 1.4 1.5] 
[5, 3.8633333333333333, 3.0696166666666667, 2.5211092500000003, 2.1479264470833335, 1.9001007429979169] 

Process finished with exit code 0 

所以我不明白這一點。 k的一樣似乎是主要問題。我已經嘗試了幾種不同的方式,像以前一樣,而不是僅僅將k定義爲x [n],y [n]的函數,我已經將每個k都作爲一個像y這樣的空列表開始並在每個步驟之後填充它對於使用.insert(n,x)或可能插入(n-1,x)的n進行循環循環,具體取決於我如何定義每個步驟,但這看起來不必要的複雜,而且我認爲實際上最終會出現相同的問題

+0

嗨托比亞斯,歡迎來到SO!你提供了許多與python無關的信息。你應該考慮,a)不是每個人都是數學家,或者b)對潛在的數學問題感興趣。所以你應該簡化你的例子和解釋。 –

+0

@DonQuestion謝謝,對不起。我真的不知道如何解釋這個問題,而沒有多餘的數學問題,但是幸好現在無論如何都解決了。 –

回答

0

你通常在意想不到的地方遇到了一個典型的問題。 (或(1/2)*h,h/2,但儘可能避免分裂)。整數除法結果爲0,因此在觀察到的行爲。


但請注意,與python 3你的代碼將工作,反過來,整數行爲必須被迫。

+0

YERRRRRRSSS我現在有一個工作rk4實現。多謝,夥計。我猜,典型的數學家可以避免小數。 –

+0

但是在你的短rk4描述中,你使用浮點數就好了?請注意0​​.5作爲2的冪在(二進制)浮點中是精確的。 – LutzL

+0

是的,我知道,這只是一種沒有任何實際理由的本能,在描述中,我想我用它來避免含糊不清,或者不得不寫一組額外的括號。 –