【出错原因及编程错误】
1、主程序
1)时间区间设定错误,t=12000值设定偏大,不符合微分方程题意,所以t应取1.2。所以 tspan=[0 1.2]; 而不是tspan=[0 12000];
2) for i=[1: (size(y,5))];.......end 该循环语句没有作用
2、自定义微分方程函数
1)dTUdt=TMfunc(t,y)定义有误,与主程序 @TMfunc3函数名不统一
2)S+R=A0*(1-1/ (exp(t/tm)));赋值错误,不能同时用赋值给双变量的和
【解决思路】
1、将tspan=[0 12000];更改为tspan=[0 1.2];
2、for i=[1: (size(y,5))];.......end 该循环语句没有作用,可以取消
3、自定义微分方程函数名,可以定义成 dTUdt=TMfunc3(t,y)
4、S+R=A0*(1-1/ (exp(t/tm)));赋值错误,表达式只能赋值给一个变量,应改为
S=A0*(1-1/(exp(t/tm)))-R;其中R值应给出,如R=0.1;
5、如R是变量的话,则给出微分方程的缺失dR/dt的关系式
【修改后的代码】
1、主程序:
clc,close all
U0=-0.5;R0=0;S0=0;H0=0.5;
tspan=[0 1.2];
y0=[U0,H0,S0];
[t,y]=ode45(@TMfunc3,tspan,y0);
U=y(:,3)-y(:,2);
figure(1)
plot(t,y(:,1),'r'),hold on
plot(t,y(:,2),'g'),hold on
plot(t,y(:,3),'b')
xlabel('t');ylabel({'U(t)';'H(t)';'S(t)'});
legend('U(t)','H(t)','S(t)')
figure(2)
plot(t,U,'k')
xlabel('t');ylabel('ΔU(t)');
2、自定义微分方程函数
function dTUdt=TMfunc3(t,y)
U=y(1);H=y(2);S=y(3);
R=0.1;
H=R-U;
K2=143.31;tm=0.5;X=0.5;A0=0.0255;
S=A0*(1-1/(exp(t/tm)))-R;
dU=(A0-U)/tm+2*K2*U^2*R;
dH=-S/tm-3*K2*U^2*R;
dS=-S/tm+K2*U^2*R;
dTUdt=[dU;dH;dS];
end
【执行结果】
【本题主要函数及算法】
1、ode45函数。ode45,常微分方程的数值求解。MATLAB提供了求常微分方程数值解的函数。当难以求得微分方程的解析解时,可以求其数值解,Matlab中求微分方程数值解的函数有七个:ode45,ode23,ode113,ode15s,ode23s,ode23t,ode23tb 。
ode45表示采用四阶-五阶Runge-Kutta算法,它用4阶方法提供候选解,5阶方法控制误差,是一种自适应步长(变步长)的常微分方程数值解法,其整体截断误差为(Δx)^5。解决的是Nonstiff(非刚性)常微分方程。
ode45函数的语法
[T,Y] = ode45(odefun,tspan,y0)
[T,Y] = ode45(odefun,tspan,y0,options)
[T,Y,TE,YE,IE] = ode45(odefun,tspan,y0,options)
sol = ode45(odefun,[t0tf],y0...)
[T,Y] = ode45(odefun,tspan,y0)
odefun 是函数句柄,可以是函数文件名,匿名函数句柄或内联函数名
tspan 是区间 [t0 tf] 或者一系列散点[t0,t1,...,tf]
y0 是初始值向量
T 返回列向量的时间点
Y 返回对应T的求解列向量
[T,Y] = ode45(odefun,tspan,y0,options)
options 是求解参数设置,可以用odeset在计算前设定误差,输出参数,事件等
[T,Y,TE,YE,IE] =ode45(odefun,tspan,y0,options)
在设置了事件参数后的对应输出
TE 事件发生时间
YE 事件发生时之答案
IE 事件函数消失时之指针i
sol =ode45(odefun,[t0 tf],y0...)
sol 结构体输出结果
2、龙格库塔法(Runge-Kutta算法)
这样,下一个值y(n+1)由现在的值y(n)加上时间间隔(h)和一个估算的斜率的乘积所决定。该斜率是以下斜率的加权平均:
k₁是时间段开始时的斜率;
k₂是时间段中点的斜率,通过欧拉法采用斜率k1来决定y在点tn+h/2的值;
k₃也是中点的斜率,但是这次采用斜率k2决定y值;
k₄是时间段终点的斜率,其y值用k3决定。
当四个斜率取平均时,中点的斜率有更大的权值:
上述就是RK₄算法的迭代式内容。