好吧,所以我想寫一個實現四階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進行循環循環,具體取決於我如何定義每個步驟,但這看起來不必要的複雜,而且我認爲實際上最終會出現相同的問題
嗨托比亞斯,歡迎來到SO!你提供了許多與python無關的信息。你應該考慮,a)不是每個人都是數學家,或者b)對潛在的數學問題感興趣。所以你應該簡化你的例子和解釋。 –
@DonQuestion謝謝,對不起。我真的不知道如何解釋這個問題,而沒有多餘的數學問題,但是幸好現在無論如何都解決了。 –