MATLAB运用(4)-常微分方程的性态和初值问题

一、实验一: 常微分方程形态和R-K法稳定性试验

考察下面微分方程右端项中函数y前面的参数a对方程性态的影响(它使得方程为好条件的或坏条件的)和研究计算步长h对4阶经典R-K法计算稳定性的影响。
{ y ′ = a y − a x + 1 , 0 < x < 1 y ( 0 ) = 1 \begin{cases} y'=ay-ax+1,0<x<1 \\ y(0)=1 \end{cases} {y=ayax+1,0<x<1y(0)=1
其中,-50≤a≤50,其精确解为 y ( x ) = e a x + x y(x)=e^{ax}+x y(x)=eax+x

1、步骤

(1)对参数a分别取4个不同的数值:一个大的正值,一个小的正值,一个绝对值小的负值,一个绝对值大的负值。取步长h=0.01,分别用经典R-K法计算,将四组计算结果画在同一张图上,进行比较并说明相应初值问题的形态。
(2)取参数a为一个绝对值不大的负值和两个计算步长,一个步长使参数ah在经典R-K法的稳定域内,另一个步长在经典R-K法的稳定域外,分别用经典R-K法计算并比较计算结果。取全域等距的10个点上的计算值,列表说明。
(备注:经典R-K法的绝对稳定域区间: − 2.785 ≤ λ h ≤ 0 , λ = f y ′ , f = y ′ -2.785≤λh≤0,λ=f'_y,f=y' 2.785λh0,λ=fy,f=y
在这里插入图片描述

2、程序

function test_5_1
%输入参数a和步长h
%利用经典4阶R-K法计算,并做图
result=inputdlg({'请输入[-50,50]之间的整数'},'text_5_1',1,{'-50'});
a=str2num(char(result));
if (a<-50)|| (a>50)
    errordlg({'超出范围,请重新输入参数a'});
    return;
end
result=inputdlg({'请输入(0,1)之间的步长h'},'text_5_1',1,{'0.01'});
h=str2num(char(result));
if (h<=0)|| (h>=1)
    errordlg({'超出范围,请重新输入参数a'});
    return;
end
x=0:h:1;
y=1;
N=length(x);
fun=@(x,y)a*y-a*x+1;
for i=1:N-1
    k1=fun(x(i),y(i));
    k2=fun(x(i)+h/2,y(i)+h*k1/2);
    k3=fun(x(i)+h/2,y(i)+h*k2/2);
    k4=fun(x(i)+h,y(i)+h*k3);
    y(i+1)=y(i)+h/6*(k1+2*k2+2*k3+k4);
end
plot(x,y,'r-')%将plot改为semilogy,y就是对数坐标轴
hold on
y0=exp(a*x)+x;
plot(x,y0,'b*')
xlabel('x');
ylabel('y');
legend('R-K近似值','精确值')
r=abs((y(101)-y0(101))/y0(101));%误差分析
sprintf('当h是%e,a是%d时的绝对误差是%e',h,a,r)

3、结果

第一问:

由于步长选取为h=0.01,而4阶经典R-K法的绝对稳定域是-2.785≤λh≤0。因此,当h=0.01时,-278.5≤a≤0,该方法才稳定。又要求-50≤a≤50,因此a的稳定区域为-50≤a≤0。当a处于稳定性范围内时,结果收敛,为好条件。反之则为换条件。
下面为分别选取a=-45,-1,1,45下的图形。
在这里插入图片描述
在这里插入图片描述
从上图上并不能直接看出产生多少误差(不明显)。因此程序中加入一段绝对误差的计算。我们假设一开始的初值没有误差,最后迭代到101次产生了的绝对误差如下:
a=-45,r=0
a=-1,r=2.2600e-11
a=1,r=6.0416e-11
a=45,r=1.0535e-02
可见在稳定区域内或靠近稳定区域内,误差很小。但是远离稳定区域会带来较大的误差。

第二问

取a=-10,则h的稳定区域为0<h≤0.2785。取步长h分别为0.1和0.3,作图如下
在这里插入图片描述
在这里插入图片描述
由表中等距的10个点的计算值和图像可以看出,h值超过稳定区域时结果发散,与精确值相差很大。而h在稳定区域内时,计算结果和精确值几乎一样。

二、实验二:比较同阶精度的单步法和预测-校正多步法的计算精度和所花费计算机CPU时间

对于常微分方程:
{ y ′ = − y + c o s 2 x − 2 s i n 2 x + 2 x e − x , 0 < x < 2 y ( 0 ) = 1 \begin{cases} y'=-y+cos2x-2sin2x+2xe^{-x},0<x<2 \\ y(0)=1 \end{cases} {y=y+cos2x2sin2x+2xex,0<x<2y(0)=1
有精确解 y ( x ) = x 2 e − x = c o s 2 x y(x)=x^2e^{-x}=cos2x y(x)=x2ex=cos2x
1、比较4阶经典R-K算法和4阶Adams预测-校正修正法的计算精度,以及所花费的时间。
要求选择一个步长h使得4阶经典R-K算法和4阶Adams预测-校正修正法均稳定,分别用这两种方法计算初值问题,列出10个等距节点上的计算值和精确值并比较。其中多步法所需要的初值由R-K法提供。
2、再取h=0.001,比较这两种方法的时间。

1、思路

4阶Adams预测-校正修正法在这里插入图片描述
经典R-K法的绝对稳定域区间: − 2.785 ≤ λ h ≤ 0 -2.785≤λh≤0 2.785λh0
4阶Adams预测-校正法的绝对稳定域区间: − 0.75 ≤ λ h ≤ 0 -0.75≤λh≤0 0.75λh0
因此本实验两算法的绝对稳定域区间: 0 ≤ h ≤ − 0.75 0≤h≤-0.75 0h0.75

2、程序

function test_5_2
result=inputdlg({'请输入步长h'},'test_5_2',1,{'0.1'});
h=str2num(char(result));
fun=@(x,y)-y+cos(2*x)-2*sin(2*x)+2*x.*exp(-x);

%经典R-K法
tic;
[x,y1]=R_K(fun,h,0,2,1);
time_RK=toc;

%4阶Adams预测-校正法
tic;
N=length(x);
y=x;%x与y同维,将x赋值给y,随后运算中逐个替换为相应的元素。这样比重新构造一个向量再逐次插入元素快。
f=x;
y(1)=y1(1);y(2)=y1(2);y(3)=y1(3);y(4)=y1(4);%以R-K法获得的初值
ycn=0;ypn=0;
f(1)=fun(x(1),y(1));f(2)=fun(x(2),y(2));f(3)=fun(x(3),y(3));
for n=4:N-1
    f(n)=fun(x(n),y(n));
    ypn1=y(n)+h/24*(55*f(n)-59*f(n-1)+37*f(n-2)-9*f(n-3));
    ypmn1=ypn1+251/270*(ycn-ypn);
    ycn1=y(n)+h/24*(9*fun(x(n+1),ypmn1)+19*f(n)-5*f(n-1)+f(n-2));
    y(n+1)=ycn1-19/270*(ycn1-ypn1);
    ycn=ycn1;
    ypn=ypn1;
end
time_Ad=toc;

y0=x.^2.*exp(-x)+cos(2*x);
subplot(1,2,1);
plot(x,y1,'b--')
hold on
plot(x,y0,'g*')
xlabel('x');ylabel('y');legend('R-K法','精确值');
subplot(1,2,2);
plot(x,y,'b--')
hold on
plot(x,y0,'g*')
xlabel('x');ylabel('y');legend('Adams预测-校正法','精确值');

d=floor(N/10);
disp(['十个等距节点:                ',num2str(x(1:d:N))]);
disp(['对应的R-K法计算值:           ',num2str(y1(1:d:N))]);
disp(['对应的Adams预测-校正法计算值:',num2str(y(1:d:N))]);
disp(['精确值:                      ',num2str(y0(1:d:N))]);
disp(['对应的R-K法计算时间:           ',num2str(time_RK)]);
disp(['对应的Adams预测-校正法计算时间:',num2str(time_Ad)]);


function [x,y]=R_K(fun,h,a,b,y0)
x=a:h:b;
y=y0;
N=length(x);
for i=1:N-1%R-K法得到初值y(n)
    k1=fun(x(i),y(i));
    k2=fun(x(i)+h/2,y(i)+h*k1/2);
    k3=fun(x(i)+h/2,y(i)+h*k2/2);
    k4=fun(x(i)+h,y(i)+h*k3);
    y(i+1)=y(i)+h/6*(k1+2*k2+2*k3+k4);
end

3、结果

当h=0.1时:

在这里插入图片描述
在这里插入图片描述
从理论推到上:
显式Adams预测-校正法的局部截断误差: T ( n ) = 251 720 h 5 y ( 5 ) ( ξ ) T(n)={251\over720 }h^5y^{(5)}(\xi) T(n)=720251h5y(5)(ξ),因此有4阶精度
R-K算法的局部截断误差: T ( n + 1 ) = h 3 [ 1 6 y ′ ′ ( n ) + ( 1 6 − λ 2 c 2 2 2 ) ( f x x + 2 f x y y ′ + f y y ( y ′ ) 2 ) ] + O ( h 4 ) T(n+1)=h^3[{1\over 6}y''(n)+({1\over 6}-{λ^2c_2^2\over2})(f_{xx}+2f_{xy}y'+f_{yy}(y')^2)]+O(h^4) T(n+1)=h3[61y(n)+(612λ2c22)(fxx+2fxyy+fyy(y)2)]+O(h4),也具有4阶精度。
从实验结果上看,理论可得到验证。而仔细观察数据,可得出经典R-K算法比4阶Adams预测-校正法精度稍微高一点。
从计算时间上看,则是4阶Adams预测-校正法会比经典R-K法快。

当h=0.001

对应的R-K法计算时间: 0.0068151
对应的Adams预测-校正法计算时间:0.0048398

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

闲谈社

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值