5.Adams方法,可实现1至6阶的外插/内插:
5.1主函数,Adams外插法或内插法下的逐点误差,及误差对数函数图像:
clc;clear;close all;
%% y'=y-2*x/y用Adams来求解验证
%要求匿名函数支持向量化
func=@(x,y) y-2*x./y;
y_exa=@(x) sqrt(2.*x+1);
x0=0;
h=1/10;
xmax=1;
y0=1;
x=x0:h:xmax; %自变量
if x(end)~=xmax
x=[x,x(end)+h];
end
method='in'; %out 外插法 ;in 内插法
if strcmp(method,'out')
stra='外插法';
elseif strcmp(method,'in')
stra='内插法';
end
accuracy=5;
%% h=1/10下逐点误差
%参数:外插/内插,导函数,因变量初值,自变量左端点,步长,自变量右端点,精度
y=Adams_auto(method,func,y0,x0,h,xmax,accuracy);
y_rel=y_exa(x);
err=abs(y_rel-y);
figure(3);
plot(x,y,'r-',x,y_rel,'b:');
title(['Adams',stra,'下的数值解图像与解析解图像']);
legend('数值解','解析解');
disp('逐点误差:');
disp(err);
%% 求误差与步长的函数
h=1/10*2.^(linspace(-3,-7,5)); %步长过大过小精度都会降低
hl=length(h);
err=zeros(1,length(h));
for j=1:hl
x1=x0:h(j):xmax;
y1=Adams_auto(method,func,y0,x0,h(j),xmax,accuracy);
y_rel_1=y_exa(x1);
err(j)=mean(abs(y_rel_1-y1));
end