基于MATLAB的微分方程的解析解与欧拉算法的数值解(附完整代码)

这篇具有很好参考价值的文章主要介绍了基于MATLAB的微分方程的解析解与欧拉算法的数值解(附完整代码)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一. 解析解方法

正常的求解微分方程的MATLAB格式如下:

y=dsolve(f1,f2,...,fm)

如果需要指明自变量,则如下:

y=dsolve(f1,f2,...,fm,'x')

格式中的fi既可以描述微分方程,又可以描述初始条件边界条件

  • 描述微分方程的MATLAB格式为:D4y=7
  • 描述条件的MATLAB格式为:D2y(2)=3

例题1

输入信号u(t)如下:

基于MATLAB的微分方程的解析解与欧拉算法的数值解(附完整代码)

求解如下微分方程的通解

基于MATLAB的微分方程的解析解与欧拉算法的数值解(附完整代码)

解:

此题需要分两步解决。

第一步MATLAB代码如下:

clc;clear;
syms t;
u=exp(-5*t)*cos(2*t+1)+5;
uu=5*diff(u,t,2)+4*diff(u,t)+2*u %等式右边

运行结果:

uu =87*exp(-5*t)*cos(2*t + 1) + 92*exp(-5*t)*sin(2*t + 1) + 10

第二步MATLAB代码如下:

clc;clear;
syms t y;
y=dsolve(['D4y+10*D3y+35*D2y+50*Dy+24*y=87*exp(-5*t)*cos(2*t+1)+92*exp(-5*t)*sin(2*t+1)+10'],...
'y(0)=3','Dy(0)=2','D2y(0)=0','D3y(0)=0')

运行结果如下:
y =(exp(-5*t)*(37960*exp(2*t) - 53820*exp(3*t) + 29640*exp(4*t) + 650*exp(5*t) - 1029*cos(2*t + 1) - 1641*sin(2*t + 1) - 9750*exp(t) + 975*exp(2*t)*sin(1) - 6120*exp(3*t)*sin(1) + 2522*exp(4*t)*sin(1) - 14092*cos(1)*exp(t) + 4264*exp(t)*sin(1) + 34905*cos(1)*exp(2*t) - 26700*cos(1)*exp(3*t) + 6916*cos(1)*exp(4*t)))/1560

例题2

求解如下微分方程组

基于MATLAB的微分方程的解析解与欧拉算法的数值解(附完整代码)

解:

MATLAB代码如下:

clc;clear;
[x,y]=dsolve('D2x+2*Dx=x+2*y-exp(-t)','Dy=4*x+3*y+4*exp(-t)')

运行结果:

x =exp(t*(6^(1/2) + 1))*(6^(1/2)/5 - 1/5)*(C2 + exp(- 2*t - 6^(1/2)*t)*((11*6^(1/2))/3 - 37/4)) - exp(-t)*(C1 + 6*t) - exp(-t*(6^(1/2) - 1))*(6^(1/2)/5 + 1/5)*(C3 - exp(6^(1/2)*t - 2*t)*((11*6^(1/2))/3 + 37/4))
 
y = exp(-t)*(C1 + 6*t) + exp(t*(6^(1/2) + 1))*((2*6^(1/2))/5 + 8/5)*(C2 + exp(- 2*t - 6^(1/2)*t)*((11*6^(1/2))/3 - 37/4)) - exp(-t*(6^(1/2) - 1))*((2*6^(1/2))/5 - 8/5)*(C3 - exp(6^(1/2)*t - 2*t)*((11*6^(1/2))/3 + 37/4))

写成数学形式:

基于MATLAB的微分方程的解析解与欧拉算法的数值解(附完整代码)

例题3

求解以下微分方程的解析解。

(1)

(2)基于MATLAB的微分方程的解析解与欧拉算法的数值解(附完整代码)

解:

MATLAB代码如下:

clc;clear;
syms t x X;

%第一题
x=dsolve('Dx=x*(1-x^2)')

%第二题
X=dsolve('DX=X*(1-X^2)+1')

%实际上第二题没有解析解
%只有部分非线性方程有解析解

 第一题运行结果:

x =
 
                              0
                              1
                             -1
 (-1/(exp(C1 - 2*t) - 1))^(1/2)

第二题运行结果:

警告: Unable to find explicit solution. Returning implicit solution instead. 

X =
 root(z^3 - z - 1, z, 1)
 root(z^3 - z - 1, z, 2)
 root(z^3 - z - 1, z, 3)

二. 微分方程的算法分析

微分方程的通式如下:

上式子中为状态向量,可以是任意非线性函数。

以下以Euler算法为例子,进行分析。

2.1 数学分析

时刻系统状态向量表示为如下:

微分方程左侧的导数可近似表示为如下:

基于MATLAB的微分方程的解析解与欧拉算法的数值解(附完整代码)

基于MATLAB的微分方程的解析解与欧拉算法的数值解(附完整代码)时刻微分方程的近似解可表示为如下:

基于MATLAB的微分方程的解析解与欧拉算法的数值解(附完整代码)

基于MATLAB的微分方程的解析解与欧拉算法的数值解(附完整代码)时刻系统的状态向量可表示为如下:

基于MATLAB的微分方程的解析解与欧拉算法的数值解(附完整代码)

在时刻系统的状态向量表示为如下:

所以,在基于MATLAB的微分方程的解析解与欧拉算法的数值解(附完整代码)时Euler算法的数值解为如下:

基于MATLAB的微分方程的解析解与欧拉算法的数值解(附完整代码)

图像形式表示为如下:

基于MATLAB的微分方程的解析解与欧拉算法的数值解(附完整代码)

理论上讲,h越小,微分效果越好。但是不能无限制地减小h的值,其中有两个原因:

  • 减慢计算速度
  • 增加累积误差

在对微分方程求解过程中,有以下三个技巧:

  • 选择适当的步长
  • 改进近似算法精度
  • 采用变步长方法

2.2代码分析

构建函数代码算法如下:


function [outx,outy]=MyEuler(fun,x0,xt,y0,PointNum)
%fun表示f(x,y) 
%x0,xt代表自变量的初值和终值
%y0:函数在x0处的值,也可以是向量的形式
%PointNum 代表自变量在[x0,xt]上取的点数

if nargin<5|PointNum<=0
    PointNum=100; %PointNum默认值为100
end
if nargin<4
    y0=0; %y0默认值为0
end

h=(xt-x0)/PointNum; %计算步长h
x=x0+[0:PointNum]'*h; %自变量数组
y(1,:)=y0(:)'; %将输出存为行向量,输出为列向量形式
for k=1:PointNum
    f=feval(fun,x(k),y(k,:));
    f=f(:)'; %计算f(x,y)在每个迭代点的值
    y(k+1,:)=y(k,:)+h*f; %对于所取的点x,迭代计算y值
end
outy=y;
outx=x;
plot(x,y)  %画出方程解的函数图

例题4

求以下微分方程组的h=0.2和h=0.4的数值解。

基于MATLAB的微分方程的解析解与欧拉算法的数值解(附完整代码)

解:

此MATLAB文件分成三个部分:

(1)欧拉算法文件

function [outx,outy]=MyEuler(fun,x0,xt,y0,PointNum)
%fun表示f(x,y) 
%x0,xt代表自变量的初值和终值
%y0:函数在x0处的值,也可以是向量的形式
%PointNum 代表自变量在[x0,xt]上取的点数

if nargin<5|PointNum<=0
    PointNum=100; %PointNum默认值为100
end
if nargin<4
    y0=0; %y0默认值为0
end

h=(xt-x0)/PointNum; %计算步长h
x=x0+[0:PointNum]'*h; %自变量数组
y(1,:)=y0(:)'; %将输出存为行向量,输出为列向量形式
for k=1:PointNum
    f=feval(fun,x(k),y(k,:));
    f=f(:)'; %计算f(x,y)在每个迭代点的值
    y(k+1,:)=y(k,:)+h*f; %对于所取的点x,迭代计算y值
end
outy=y;
outx=x;
plot(x,y)  %画出方程解的函数图

文件命名:MyEuler.m

(2)函数文件

function f=myfun01(x,y)
f=sin(x)+y;

文件命名:myfun01.m

(3)主运行文件

clc;clear;
[x1,y1]=MyEuler('myfun01',0,2*pi,1,16); %欧拉法所得的解
h1=2*pi/16 %计算取16的步长

[x11,y11]=MyEuler('myfun01',0,2*pi,1,32); %欧拉法所得的解
h2=2*pi/32 %计算取32点的步长

y=dsolve('Dy=y+sin(t)','y(0)=1');
for k=1:33
    t(k)=x11(k);
    y2(k)=subs(y,t(k)); %求其对应点的离散解
end
plot(x1,y1,'+b',x11,y11,'og',x11,y2,'*r')
legend('h=0.4的欧拉法解','h=0.2的欧拉法解','符号解');

运行结果:

h1 =0.392699081698724
h2 =0.196349540849362

基于MATLAB的微分方程的解析解与欧拉算法的数值解(附完整代码)

观察图像可以发现,此Euler方法和解析法相比,精准度还有一定的距离。于是提出以下改进版的欧拉方法

此时此题将有四个文件:
(1)原函数文件

function f=myfun01(x,y)
f=sin(x)+y;

(2)欧拉算法文件

function [outx,outy]=MyEuler(fun,x0,xt,y0,PointNum)
%fun表示f(x,y) 
%x0,xt代表自变量的初值和终值
%y0:函数在x0处的值,也可以是向量的形式
%PointNum 代表自变量在[x0,xt]上取的点数

if nargin<5|PointNum<=0
    PointNum=100; %PointNum默认值为100
end
if nargin<4
    y0=0; %y0默认值为0
end

h=(xt-x0)/PointNum; %计算步长h
x=x0+[0:PointNum]'*h; %自变量数组
y(1,:)=y0(:)'; %将输出存为行向量,输出为列向量形式
for k=1:PointNum
    f=feval(fun,x(k),y(k,:));
    f=f(:)'; %计算f(x,y)在每个迭代点的值
    y(k+1,:)=y(k,:)+h*f; %对于所取的点x,迭代计算y值
end
outy=y;
outx=x;
plot(x,y)  %画出方程解的函数图

(3)改进版欧拉算法文件

function [Xout,Yout]=MyEulerPro(fun,x0,xt,y0,PointNumber) 
%用改进的欧拉法解微分方程

if nargin<5|PointNumber<=0 %PointNumber默认值为100
    PointNumber=100;
end
if nargin<4  %y0默认值为0
    y0=0;
end

h=(xt-x0)/PointNumber; %计算所取的两离散点之间的距离
x=x0+[0:PointNumber]'*h; %表示出离散的自变量x
y(1,:)=y0(:)';
for i=1:PointNumber %迭代计算过程
    f1=h*feval(fun,x(i),y(i,:));
    f1=f1(:)';
    f2=h*feval(fun,x(i+1),y(i,:)+f1);
    f2=f2(:)';
    y(i+1,:)=y(i,:)+1/2*(f1+f2);
end
Xout=x;
Yout=y;

 (4)主运行文件

clc;clear;

%此处对比改进版欧拉法,简单欧拉法以及微分方程的符号解
[x3,y3]=MyEulerPro('myfun01',0,2*pi,1,128); 

[x,y1]=MyEuler('myfun01',0,2*pi,1,128);%欧拉法所得的解

y=dsolve('Dy=y+sin(t)','y(0)=1'); %该微分方程的符号解
for k=1:129 %点数
    t(k)=x(k); %代入
    y2(k)=subs(y,t(k)); %求其对应点的离散解,也就是计算y
end
plot(x,y1,'-b',x3,y3,'og',x,y2,'*r')
legend('简单欧拉法解','改进欧拉法解','符号解');

运行结果:

基于MATLAB的微分方程的解析解与欧拉算法的数值解(附完整代码)文章来源地址https://www.toymoban.com/news/detail-407226.html

到了这里,关于基于MATLAB的微分方程的解析解与欧拉算法的数值解(附完整代码)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MATLAB-常微分方程求解

    MATLAB中可以用来求解常微分方程(组)的函数有ode23、 ode23s、 ode23t、 ode23tb 、ode45、ode15s和odel13等,见下表。它们的具体调用方法类似,为了方便后面的描述, 在后面的介绍中将使用solver统一代替它们。 函数的具体调用方法如下。 [T,Y] =solver( odefun, tspan,y0) [T,Y] = solver( odefun,

    2024年02月02日
    浏览(50)
  • matlab解微分方程:方向场

    在微分方程中,常见的形式是: x ′ = f ( x , t ) x\\\'=f(x,t) x ′ = f ( x , t ) 方向场的每一个矢量可以形象地刻画一阶微分方程的解。在方向场中的每个点处,都会出现一条其斜率等于通过该点的微分方程解的矢量。给定一个初值,微分方程对应一条curve曲线,点上的方向矢量和相

    2024年02月13日
    浏览(38)
  • matlab使用教程(29)—微分方程实例

            此示例说明如何使用 MATLAB® 构造几种不同类型的微分方程并求解。MATLAB 提供了多种数值算法来求解各种微分方程:         vanderpoldemo 是用于定义 van der Pol 方程的函数 function dydt = vanderpoldemo(t,y,Mu) %VANDERPOLDEMO Defines the van der Pol equation for ODEDEMO. % Copyright 1984-2

    2024年02月10日
    浏览(46)
  • 【Matlab】一、解常微分方程ODE

    ​ 在matlab中,我们可以求解常微分方程的 解析解 ,和 数值解 ,一般使用 dsolve 来求解常微分方程的解析解,使用类似于 ode45 的求解器来求解常微分方程的数值解。 求解解析解 ,例如求解该方程的解析解 d y d x = 3 x 2 + 1 frac{dy}{dx}=3x^2 + 1 d x d y ​ = 3 x 2 + 1 只需要在命令行中

    2024年02月07日
    浏览(47)
  • Matlab偏微分方程拟合 | 完整源码 | 视频教程

    作者简介:工学博士,高级工程师,专注于工业软件算法研究 本文已收录于专栏:《 复杂函数拟合案例分享 》本专栏旨在提供 1.以 案例 的形式讲解各类复杂函数拟合的程序实现方法,并提供所有案例 完整源码 ;2. 复杂函数 包含:分段函数、积分函数、常/偏微分函数、隐

    2024年04月10日
    浏览(92)
  • matlab使用教程(25)—常微分方程(ODE)选项

            解算 ODE 经常要求微调参数、调整误差容限或向求解器传递附加信息。本主题说明如何指定选项以及每个选项与哪些微分方程求解器兼容。         使用 odeset 函数创建 options 结构体,然后将其作为第四个输入参数传递给求解器。例如,要调整相对和绝对误差容

    2024年02月11日
    浏览(58)
  • matlab求解时变系统的Riccati矩阵微分方程

    对于代数Riccati方程的求解网上能找到很多的资源,matlab也有成熟的函数,但是对于时变系统的Riccati矩阵微分方程,能找到的资料还比较少。 可以在网上找到很多资料,如 https://blog.csdn.net/m0_62299908/article/details/127807014 matlab也有相应的一系列函数 lqr、icare等。 对于这些函数不

    2024年02月05日
    浏览(46)
  • 用MATLAB求一阶微分方程(组)数值解

    标准形式要先写成左边是y的导数右边是本身函数或者自变量,然后写成.m文件类似: 如果有多个微分方程,dy=zeros(3,1);% 一定要写成列向量 3、[0,1,1]都是方程(组)的初始值,并且初始值的x=0; 就会得到一系列x,y值; ode45(最常用) **问题类型:**非刚性 **精准度:**中等 ode15s

    2024年02月11日
    浏览(57)
  • 【数学建模\MATLAB】掌握用Matlab求解微分方程问题

    d y d t = a y 2 cfrac{dy}{dt}=ay^2 d t d y ​ = a y 2 结果 d 3 y d t 3 = b y cfrac{d^3y}{dt^3}=by d t 3 d 3 y ​ = b y 结果 x 2 + y + ( x − 2 y ) y ′ = 0 x^2+y+(x-2y)yprime=0 x 2 + y + ( x − 2 y ) y ′ = 0 结果: d 2 y d t 2 = a y , 初 始 条 件 为 y ( 0 ) = 5 , y ′ ( 0 ) = 1 cfrac{d^2y}{dt^2}=ay, text初始条件为y(0)=5,yprime(

    2024年02月03日
    浏览(45)
  • MATLAB求解偏微分方程【PDE和差分法】

    目录 前言  1.用差分法求解 显示差分 其他方程举例 : r是什么 2.PDETOOL 3.pdepe函数 示例:热方程 代码:   在我们处理一些公式时,常常会有偏微分方程出现,所以我今天整理了一下求解偏微分方程的常用方法,希望有所帮助 在1979年复旦大学学者的一篇论文里,谈到了偏微分

    2024年02月04日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包