解常微分方程的多步法(有admas外插法,admas内插法,一般多步法(Milne法))

解常微分方程的多步法(有admas外插法,admas内插法,一般多步法(Milne法))

admas外插法

%admas外插法,具有k-1阶的精度,下面编写k等于3的外插公式
clear
clc
syms x y
f=3*x^2;
a=0;
b=10;
y0=0;
y1=0.001;
y2=0.008;
y3=0.027;
h=0.1;
n=(b-a)/h+1;
xx=zeros(n,1);
yy=zeros(n,1);
yy=zeros(n,1);
yy(1)=y0;
yy(2)=y1;
yy(3)=y2;
yy(4)=y3;
for i=1:n
    xx(i)=a+h*(i-1); 
end
for i=5:n
   k1=55/24*h*(subs(f,{x,y},{xx(i-1),yy(i-1)}));
   k2=-59/24*h*(subs(f,{x,y},{xx(i-2),yy(i-2)})); 
   k3=37/24*h*(subs(f,{x,y},{xx(i-3),yy(i-3)}));
   k4=-9/24*h*(subs(f,{x,y},{xx(i-4),yy(i-4)}));
   yy(i)=k1+k2+k3+k4+yy(i-1);
end
ff1=[xx,yy];

admas内插法

%admas内插法,具有k阶的精度,但是为隐式方程,所以需要求解方程,下面编写当p等于1,k=4的admas内插法
clear
clc
syms x y
f=3*x^2;
a=0;
b=10;
y0=0;
y1=0.001;
y2=0.008;
y3=0.027;
h=0.1;
n=(b-a)/h+1;
xx=zeros(n,1);
yy=zeros(n,1);
yy=zeros(n,1);
yy(1)=y0;
yy(2)=y1;
yy(3)=y2;
yy(4)=y3;
for i=1:n
    xx(i)=a+h*(i-1); 
end
for i=5:n
   syms p
   k1=subs(f,{x,y},{xx(i),p})*h*251;
   k2=subs(f,{x,y},{xx(i-1),yy(i-1)})*h*646;
   k3=subs(f,{x,y},{xx(i-2),yy(i-2)})*h*(-264);
   k4=subs(f,{x,y},{xx(i-3),yy(i-3)})*h*106;
   k5=subs(f,{x,y},{xx(i-4),yy(i-4)})*h*(-19);
   yy(i)=double(solve(p==yy(i-1)+k1+k2+k3+k4+k5,p));
end
ff1=[xx,yy];

一般多步法(Milne法)

%一般线性多步法,下面介绍Milne法
clear
clc
syms x y
f=3*x^2;
a=0;
b=10;
y0=0;
y1=0.001;
y2=0.008;
y3=0.027;
h=0.1;
n=(b-a)/h+1;
xx=zeros(n,1);
yy=zeros(n,1);
yy=zeros(n,1);
yy(1)=y0;
yy(2)=y1;
for i=1:n
    xx(i)=a+h*(i-1); 
end
for i=3:n
   syms p
   k1=h/3*(subs(f,{x,y},{xx(i),p})+4*subs(f,{x,y},{xx(i-1),yy(i-1)})+subs(f,{x,y},{xx(i-2),yy(i-2)}));
   yy(i)=double(solve(p==yy(i-2)+k1,p));
end
ff1=[xx,yy];
  • 2
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Adam-Moulton方是一种多步法,可以用于求常微分方程初值问题。下面是使用Adams-Moulton(AM)来求常微分方程初值问题的MATLAB代码。 假设我们要求常微分方程是dy/dt = f(t,y),y(t0) = y0,求区间为[t0, tf]。 ``` % 定义常微分方程和求区间 f = @(t,y) ... % 定义方程f(t,y) tspan = [t0, tf]; % 定义步长和初始条件 h = ... % 定义步长 y0 = ... % 定义初始条件 y = y0; % 计算需要的初始值 t = tspan(1):h:tspan(1)+3*h; % 计算需要的初始值 w = zeros(size(t)); % 初始化w w(1:4) = y; % 填充前4个初始值 % 计算Adams-Moulton的系数 alpha = ... % 计算AM系数 % 迭代求 for i = 4:length(t)-1 % 计算预测值 wp = ... % 计算预测值 % 计算校正值 f1 = f(t(i+1), wp); % 计算f(t_{i+1}, w_{i+1}) f2 = f(t(i), w(i)); % 计算f(t_i, w_i) f3 = f(t(i-1), w(i-1)); % 计算f(t_{i-1}, w_{i-1}) f4 = f(t(i-2), w(i-2)); % 计算f(t_{i-2}, w_{i-2}) wc = ... % 计算校正值 % 更新w w(i+1) = ... % 更新w end % 输出结果 t = tspan(1):h:tspan(2); % 重新计算t y = w(1:length(t)); % 截取w的前n个值作为y的 ``` 在上面的代码中,需要计算AM系数alpha,可以使用以下代码: ``` % 计算AM系数 alpha = zeros(4,4); % 初始化系数矩阵 alpha(1,1) = ... % 填充系数矩阵 alpha(2,1:2) = ... % 填充系数矩阵 alpha(3,1:3) = ... % 填充系数矩阵 alpha(4,:) = ... % 填充系数矩阵 ``` 在计算预测值和校正值时,可以使用以下代码: ``` % 计算预测值 wp = w(i) + h*sum(alpha(4,:).*f(t(i-3:i), w(i-3:i))); % 计算校正值 wc = w(i) + h*sum(alpha(4,:).*f(t(i-3:i), w(i-3:i+1))) + ... h*alpha(4,1)*f(t(i+1), wp); ``` 其中,alpha(4,:)是AM系数的第4行,f(t(i-3:i), w(i-3:i))是取前4个点的f值。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值