0

我正在爲我的一個類的任務,我應該寫一個代碼使用我選擇的程序(我選擇了Matlab)來解決貝塞爾函數微分方程使用4階Runge-Kutta方法。作爲參考,貝塞爾函數DE是:使用龍格庫塔解決貝塞爾函數

x^2 *(J_n)''+ x *(J_n)'+(x^2-n^2)* J_n = 0。

我能夠通過此分離成兩個耦合的第一順序的DE:

(J_n) '= Z_n和

(Z_n)' +(1/X)* Z_n + [(X^2-正^ 2)/ X^2] * J_n = 0。

我沒有使用Matlab的經驗,也沒有任何其他編程語言之前,這項任務。我知道Matlab有'ode45'命令,但我應該自己編寫代碼,而不是依賴Matlab的命令。到目前爲止,我一直在研究貝塞爾函數的n = 0情況,但當我嘗試繪製函數時,我一直收到錯誤。當前的錯誤我說:「未定義的函數或方法'J'輸入參數的類型'雙'。」但我不知道如何解決這個錯誤,如果我的代碼甚至是正確的。有人能告訴我哪裏出了問題,或者寫這段代碼的正確方法是什麼?

h=0.01;    %step size 

J_0(1)=1;   %initial condition for J_0 

Z_0(1)=1;   %initial condition for Z_0-This value should be zero 
        %but Matlab gives me an error. To fix this, I input 
        %Z_0(1)-1 to use the correct value for Z_0(1). 

x(1)=0.001;   %first value of x 

dZ(Z_0,J_0)=(-1/x)*(Z_0-1)-J_0; 

for i=[1:1:10] 

    dZ1=(-1/x)*(Z_0-1)-J_0; 
    dJ1=(Z_0(1)-1)*h; 

    dZ2=(-1/x)*(Z_0-1+0.5*h)-(J_0+0.5*h*dJ1); 
    dJ2=((Z_0(1)-1)+dZ1)*h; 

    dZ3=(-1/x)*(Z_0-1+0.5*h)-(J_0+0.5*h*dJ2); 
    dJ3=((Z_0(1)-1)+dZ1+dZ2)*h; 

    dZ4=(-1/x)*(Z_0-1+h)-(J_0+h*dJ3); 
    dJ4=((Z_0(1)-1)+dZ1+dZ2+dZ3)*h; 

    J(i+1)=J(i)+(h/6)*(dJ1+2*dJ2+2*dJ3+dJ4); 
end 

plot(J_0); 

預先感謝任何幫助

回答

0

你的問題就行了:

J(i+1)=J(i)+(h/6)*(dJ1+2*dJ2+2*dJ3+dJ4); 

在你的賦值運算符的右邊使用變量J,它永遠不會設置之前i取值1.看起來像我的錯字(應該是J_0而不是?)

另外,別忘了喲你的指數i當計算你的dJdZ東西在for循環。

+0

明白了,這是有道理的。再次感謝您的幫助。 – John