基于MATLAB的微分方程的定步长与动步长算法对比解法(附完整代码)

目录

一.  四阶定步长Runge-Kutta算法

 二.  四阶五级Runge-Kutta-Felhberg算法

三. 微分方程求解函数

3.1 求解格式

3.2 描述微分方程组

例题1

例题2


一.  四阶定步长Runge-Kutta算法

令h代表计算步长,该算法的主题思想如下:
 

下一个步长的状态变量值,可计算如下:

x_{k+1}=x_k+\frac{1}{6}(k_1+2k_2+2k_3+k_4)

形成MATLAB代码如下:

function [tout,yout]=rk_4(odefile,tspan,y0) %y0初值列向量
t0=tspan(1);
th=tspan(2);
if length(tspan)<=3,h=tspan(3); %tspan=[t0,th,h]
else h=tspan(2)-tspan(1);
    th=tspan(end);
end %等间距的数组
tout=[t0;h;th]';
yout=[];
for t=tout'
 k1=h*eval([odefile'(t,y0)']); %odefile是一个字符串变量,为表示微分方程f()的文件名
 k2=h*eval([odefile'(t+h/2,y0+0.5*k1)']);
 k3=h*eval([odefile'(t+h/2,y0+0.5*k2)']);
 k4=h*eval([odefile'(t+h,y0+k3)']);
 y0=y0+(k1+2*k2+2*k3+k4)/6;
 yout=[yout;y0'];
end
end
%实际上该算法不是一个较好的方法

 二.  四阶五级Runge-Kutta-Felhberg算法

假设当前的步长为h_k,定义6个k_i变量,如下:

k_i=h_kf(t_k+\alpha_ih_k,x_k+\sum_{j=1}^{i-1}\beta_{ij}k_j),\quad i=1,2,\cdots,6

下一步的状态向量可计算如下:

x_{k+1}=x_k+\sum_{i=1}^6\gamma_ik_i

定义一个误差向量,如下:

\epsilon_k=\sum_{i=1}^6(\gamma_i-y_i^*)k_i

通过误差向量调节步长,这个过程就被称之为自动变步长方法。实际上,四阶五级RKF算法有自己的参量系数表。

三. 微分方程求解函数

3.1 求解格式

利用ode45()函数,主要由三种格式。

格式1:直接求解

[t,x]=ode45(Fun,[t0,tf],x0)

格式2:带有控制参数

[t,x]=ode45(Fun,[t0,tf],x0,options)

格式3:带有附加参数

[t,x]=ode45(Fun,[t0,tf],x0,options,p1,p2,···)

以上格式中[t0,tf]代表求解区间,x0代表初值问题的初始状态变量。

3.2 描述微分方程组

如果不附加变量,格式如下:

function xd=funname(t,x)

也可以附加变量,格式如下:

function xd=funname(t,x,flag,p1,p2,···)
%t是时间变量或者是自变量,是必须要给的
%x为状态向量
%xd为返回状态向量的导数
%flag用来控制求解过程,指定初值,即使初值不用指定,也必须要有该变量占位

options是唯一结构体变量,可以用odeset()修改。

%格式1
options=odeset('RelTol',1e-7)

%格式2
options=odeset;
options.RelTol=1e-7;

例题1

求解Lorenz模型的状态方程。

参数值如下:

\beta=\frac{8}{3},\rho=10,\sigma=28

初值如下:

x_1(0)=x_2(0)=0,x_3(0)=\epsilon,\epsilon=10^{-10}

微分模型如下:

解:

此题代码由两个部分组成

(1)原方程文件

function xdot=lorenzeq(t,x)
xdot=[-8/3*x(1)+x(2)*x(3);-10*x(2)+10*x(3);-x(1)*x(2)+28*x(2)-x(3)];

 (2)主运行文件

clc;clear;

t_final=100;
x0=[0;0;1e-10]; %t_final为设定的仿真终止时间
[t,x]=ode45('lorenzeq',[0,t_final],x0);
plot(t,x)
figure; %打开新图形窗口
plot3(x(:,1),x(:,2),x(:,3));
axis([5 50 -25 25 -25 30]); %根据实际数值手动设置坐标系

figure;
comet3(x(:,1),x(:,2),x(:,3)) %绘制动画式的轨迹

运行结果:

 

备注:图3实际上是一个动画的形式

例题2

带有附加参数的微分方程求解:洛伦茨方程。

编写有附加参数的函数描述Lorenz方程。

求解一组参数\beta=2,\rho=5,\sigma=20下,方程的数值解

解:

此题有两个代码文件。

(1)原微分方程文件

function xdot=lorenz1(t,x,flag,beta,rho,sigma) %flag变量是不能省略的
xdot=[-beta*x(1)+x(2)*x(3);-rho*x(2)+rho*x(3);-x(1)*x(2)+sigma*x(2)-x(3)];

 (2)主运行文件

clc;clear;

%求微分方程
t_final=100;
x0=[0;0;1e-10];
b2=2;r2=5;s2=20;
[t2,x2]=ode45('lorenz1',[0,t_final],x0,[],b2,r2,s2);
%options位置为[],表示不需要修改控制项
plot(t2,x2)
figure;
plot3(x2(:,1),x2(:,2),x2(:,3));
axis([0 72 -20 22 -35 40]);

运行结果:

 

 

  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: MATLAB微分方程高效解法:谁方法原理与实现 MATLAB微分方程高效解法的谁方法原理与实现取决于所使用的具体方法。一些常见的方法包括欧拉方法、龙格-库塔方法、变步长法等。这些方法的原理是基于离散化微分方程,将微分方程转换为差分方程组,并使用数值方法求解该方程组,从而得到微分方程的近似解。 具体实现时,可以使用MATLAB中的ode45、ode23和ode15s等函数进行求解。同时,也可以根据实际需要编写自己的求解程序。在编写程序时应注意算法的稳性和精确性,以保证求解结果的正确性。 ### 回答2: MATLAB是一个强大的科学计算软件,用于解决几乎所有科学领域中的问题。其中一个重要的应用是在数学中用于解决微分方程微分方程是模拟和分析物理和工程系统的重要工具。谱法是一种常用的高效解决微分方程的方法之一。 谱方法旨在通过计算傅里叶系数来近似微分方程解的连续函数。它是一种离散化技术,将解决微分方程的问题转化为计算简单的傅里叶转换,从而使解决微分方程的复杂度降低到可以接受的水平。如果一个微分方程在一条件下可以具有正交函数的傅里叶展开,那么该方程的解可以用离散傅里叶变换来近似。 谱方法的实现通常涉及以下几个步骤: 1. 将求解微分方程的区间分割成一组均匀分布的多个区间。 2. 在每个区间中使用某些类型的基函数,如三角函数或连续拉格朗日基函数。 3. 将微分方程转换为超越方程组(通常是多项式)。 4. 使用多项式插值技术求解超越方程组。 5. 计算系统的傅里叶系数,从而获得微分方程的解。 谱方法有很多优点,如精度高、计算速度快、易于实现等。但是它也有一些局限性,如难以适应非连续或不规则边界的问题。 在MATLAB中,用户可以使用已经编写好的函数,如chebfun和pdepe等来实现谱方法。使用这些函数,用户只需要输入微分方程和区间的初始条件,以及所需的精度级别即可获得显示的解。由于它在解决微分方程方面的高效性和易于使用性,谱法在MATLAB中使用非常广泛。 总之,谱方法是MATLAB中用于解决微分方程的一种高效技术。谱方法用于将微分方程连续的解转换为离散的傅里叶系数,从而降低微分方程的解决复杂度。在MATLAB中,用户可以轻松地使用现有的函数库来实现谱方法。谱方法是MATLAB中学习和理解微分方程求解方法的重要一环。 ### 回答3: 谱方法是一种高效的数值解微分方程的方法,它在matlab中的实现也非常简单。在matlab中,可以使用fft2函数进行快速傅里叶变换,然后进行谱方法的计算。 谱方法的原理是基于傅里叶级数展开的思想,它将微分方程在空间域上展开为一组傅里叶级数,并利用傅里叶变换将微分方程在频率域上求解。在谱方法中,由于傅里叶级数展开的收敛速度非常快,所以谱方法具有较高的计算效率和精度。 在matlab中,可以使用fft2函数将微分方程在空间域上展开,然后将其转换到频率域上进行求解。由于在频率域上进行计算,所以计算量较小,可以极大地提高计算速度。 谱方法在matlab中还有一个很重要的应用,就是求解偏微分方程。在实际应用中,很多偏微分方程难以应用常规的数值方法求解,而谱方法在求解偏微分方程时非常有效。在matlab中,可以使用pdepe函数求解偏微分方程,该函数内部就是使用了谱方法。 总之,谱方法是一种高效的数值解微分方程的方法,在matlab中的实现也非常简单。它可以极大地提高微分方程的求解速度和精度,并在求解偏微分方程方面具有很大的优势。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

唠嗑!

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

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

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

打赏作者

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

抵扣说明:

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

余额充值