在MatLab里面用隐式欧拉法(backward euler)解决常微分方程。初学matlab 好多都不会,知道的帮下忙
发布网友
发布时间:2022-05-14 05:44
我来回答
共2个回答
热心网友
时间:2023-10-05 04:01
1.新建一个m文件,编写隐式Euler法的程序:
function [x,y]=Implicit_Euler(odefun,xspan,y0,h,varargin)
% 隐式Euler公式求解常微分方程
% 输入参数:
% ---odefun:微分方程的函数描述
% ---xspan:求解区间[x0,xn]
% ---y0:初始条件
% ---h:迭代步长
% ---p1,p2,…:odefun函数的附加参数
% 输出参数:
% ---x:返回的节点,即x=xspan(1):h:xspan(2)
% ---y:微分方程的数值解
x=xspan(1):h:xspan(2);
y(1)=y0;
for k=1:length(x)-1
z0=y(k)+h*feval(odefun,x(k),y(k),varargin{:});
z1=inf;
while abs(z1-z0)>1e-4
z1=y(k)+h*feval(odefun,x(k+1),z0,varargin{:});
z0=z1;
end
y(k+1)=z1;
end
x=x;y=y;
2.在命令窗口直接调用上面的程序,求解常微分问题:
(1)
f=@(t,x)-2*x;
[t,x]=Implicit_Euler(f,[0 5],1,0.1);
t1=0:0.1:5;
x1=exp(-2*t);
plot(t1,x1)
hold on
plot(t,x,'k.-','markersize',16)
legend('解析解','隐式Euler求解结果')
xlabel('t');ylabel('x');
(2)此题你给出的初值好像有问题吧,x0=0的话,求解的结果都是为0,所以我改用x0=1求解试了一下:
>> f=@(t,x)x*sin(t)-2*x^2;
>> [t,x]=Implicit_Euler(f,[0 1],1,0.01);
>> [t1,x1]=Implicit_Euler(f,[0 1],1,0.001);
>> e=x1(end)-x(end)
e =
-0.0029
>> plot(t,x,'r:')
>> hold on
>> plot(t1,x1,'g--')
>> xlabel('t');ylabel('x')
>> legend('积分步长为0.01','积分步长为0.001')
>>
热心网友
时间:2023-10-05 04:02
matlab里的euler法数值积分是过时的积分算法,不知道还能用吗。