有限差分法Eluer算法(求解常微分方程)

有限差分法C++实现

几种Eluer算法


在MATLAB 里面写一个程序:要求用 隐式欧拉法(backward euler) 去解决常微分方程。
 下面是两个例题,
 1. x' = - 2x ; 还给出准确值是: x= e^(-2t) 要求: 求出t=0, 这是一个初始值,然后算出在区间[0,5] 的值。
 还给出 步长(step size) h=0.1 
 2. x' = xsint - 2x^2; 给出初始条件 x(0) = 0 
 要求: 求出在区间[0,1] 的值,比较 h=0.01 和 h=0.001 在 t = 1 这里。


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










利用Matlab实现用:
    向前Euler方法
    向后Euler方法
    改进的Euler方法
    梯形公式

求方程
        y'=y-2x/y,   0


你可能感兴趣的:(Matlab学习)