matlab使用ode45函数一直报错,哪位大佬能帮帮忙?

如题所述

【出错原因及编程错误】

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₄算法的迭代式内容。

温馨提示:答案为网友推荐,仅供参考
相似回答