使用Runge Kutta解决贝塞尔函数问题

时间:2013-04-13 22:26:38

标签: matlab differential-equations bessel-functions runge-kutta

我正在为我的一个班级工作,我应该使用我选择的程序编写代码(我选择了Matlab)使用4阶Runge-来求解贝塞尔函数微分方程库塔方法。作为参考,贝塞尔函数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-N ^ 2)/ X ^ 2] * J_n = 0。

在此作业之前,我没有使用Matlab或任何其他编程语言的经验。我知道Matlab有'ode45'命令,但我应该自己编写代码,而不是依赖于Matlab的命令。到目前为止,我一直在研究贝塞尔函数的n = 0情况,但是当我尝试绘制函数时,我一直收到错误。我当前的错误说:“未定义的函数或方法'J'表示'double'类型的输入参数。”但我不知道如何修复此错误,也不知道我的代码是否正确。有人能告诉我哪里出错了或者编写这段代码的正确方法是什么?

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);

提前感谢您提供任何帮助

1 个答案:

答案 0 :(得分:0)

你的问题就行了:

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

在赋值运算符的右侧,您使用的变量Ji取值1之前从未设置过。看起来像是一个错字(我应该是{{ 1}}而不是?)

另外,在J_0循环中计算idJ内容时,请不要忘记索引dZ