Matlab 常微分方程组

Matlab 常微分方程组,matlab,ode,runge-kutta,Matlab,Ode,Runge Kutta,我试图用Runge kutta解一个ode系统,我为RK2(f,h,x0,y0,xfinal)做了一个函数,并试图用指定的IC解下面所示的系统。有人能帮我修复代码,因为我得到错误和代码不工作。 beta=1/3; γ=1/7; syms R S I%符号数学工具箱 N=S+I+R; ode1=-(β*I*S)/N; ode2=-(β*I*S)/N-γ*I; ode3=伽马*I; odes=[ode1,ode2,ode3]; 对于j=常微分方程 RK2(j,0.2,0,8e6,7); 结束 函数

我试图用Runge kutta解一个ode系统,我为
RK2(f,h,x0,y0,xfinal)
做了一个函数,并试图用指定的IC解下面所示的系统。有人能帮我修复代码,因为我得到错误和代码不工作。

beta=1/3;
γ=1/7;
syms R S I%符号数学工具箱
N=S+I+R;
ode1=-(β*I*S)/N;
ode2=-(β*I*S)/N-γ*I;
ode3=伽马*I;
odes=[ode1,ode2,ode3];
对于j=常微分方程
RK2(j,0.2,0,8e6,7);
结束
函数[xs,ys]=RK2(f,h,x0,y0,xfinal)
ffnc=matlabFunction(f);
fprintf('\n x y');
o=1;

为什么要使用符号数学工具箱?您可以立即定义MATLAB函数
ode1=@(R,S,I)-(beta*I*S)/(S+I+R)
。。。顺便说一句,在
RK2
中调用函数句柄时,您从未移交输入
S
,您确定这是RK2吗?通常,序列RK2、RK3、RK4具有中点求值。使用二阶Heun方法。(如果正确定义了
f
)请注意,在计算
S
数据系列时,您试图使用尚未计算的
I
系列的值。你的计算机需要一个时间隧道设备和Matlab时间旅行库才能这样工作。你为什么要使用符号数学工具箱呢?您可以立即定义MATLAB函数
ode1=@(R,S,I)-(beta*I*S)/(S+I+R)
。。。顺便说一句,在
RK2
中调用函数句柄时,您从未移交输入
S
,您确定这是RK2吗?通常,序列RK2、RK3、RK4具有中点求值。使用二阶Heun方法。(如果正确定义了
f
)请注意,在计算
S
数据系列时,您试图使用尚未计算的
I
系列的值。你的计算机需要一个时间隧道设备和Matlab时间旅行库才能这样工作。
beta = 1/3;
gamma = 1/7;
syms R S I % Symbolic Math Toolbox
N = S+I+R;
ode1 = -(beta*I*S)/N;
ode2 = -(beta*I*S)/N-gamma*I;
ode3 = gamma*I;
odes = [ode1,ode2,ode3];
for j = odes
    RK2(j,0.2,0,8e6,7);
end


function [xs,ys] = RK2(f,h,x0,y0,xfinal)
ffnc = matlabFunction(f);
fprintf('\n x        y ');
o = 1;
while x0 <= xfinal
    fprintf('\n%4.3f  %4.3f ',x0,y0); %values of x and y
    xs(o) = x0;
    ys(o) = y0;
    k1 = h*ffnc (x0,y0); 
    x1 = x0+h; 
    k2 = h*ffnc (x1,y0+k1);
    y1 = y0+(k1+k2)/2;           
    x0 = x1;
    y0 = y1;  
    o = o+1;
end
end