【Matlab】一、解常微分方程ODE

这篇具有很好参考价值的文章主要介绍了【Matlab】一、解常微分方程ODE。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

求解常微分方程 ODE

​ 在matlab中,我们可以求解常微分方程的解析解,和数值解,一般使用dsolve来求解常微分方程的解析解,使用类似于ode45的求解器来求解常微分方程的数值解。

(1)求解解析解

求解解析解,例如求解该方程的解析解
d y d x = 3 x 2 + 1 \frac{dy}{dx}=3x^2 + 1 dxdy=3x2+1
只需要在命令行中输入

dsolve('Dy=3*x^2+1', 'x')
【Matlab】一、解常微分方程ODE

或者是加上初始条件,求该方程在该初始条件下的解
d y d x = 3 x 2 , y ∣ x = 0 = 2 \frac{dy}{dx}=3x^2, y|_{x=0}=2 dxdy=3x2,yx=0=2
在命令行输入

dsolve("Dy = 3*x^2", "y(0)=2", "x")
【Matlab】一、解常微分方程ODE

例如求一个常微分方程组
{ x ˙ = y , y ¨ − y ˙ = 0 , x ∣ t = 0 = 1 ; y ˙ ∣ t = 0 = 1 \left\{ \begin{array}{lr} \dot{x}=y, \\ \ddot{y}-\dot{y}=0, \quad x|_{t=0}=1; \dot{y}|_{t=0}=1 \end{array} \right. {x˙=y,y¨y˙=0,xt=0=1;y˙t=0=1
在命令行输入

[x, y] = dsolve('Dx=y, D2y-Dy=0', 'x(0)=2, y(0)=2, Dy(0)=1')
【Matlab】一、解常微分方程ODE

(2)求解数值解

求数值解,有一些非线性的常微分方程是不能求出解析解的,我们一般求取其在一段区间内的数值解,采用迭代的方式来求解数值解,ode是matlab专门用于解微分方程的功能函数,具体的说明如下:

【Matlab】一、解常微分方程ODE

ode45是解决问题的首选,如果长时间没有结果,那么则采用ode15s试试。下面介绍ode45的函数格式

%函数格式  
%[T,Y] = ode45(‘odefun’,tspan,y0)
%[T,Y] = ode45(‘odefun’,tspan,y0,options)
%[T,Y,TE,YE,IE] = ode45(‘odefun’,tspan,y0,options)
%sol = ode45(‘odefun’,[t0 tf],y0...)
%其中: odefun是函数句柄,可以是函数文件名,匿名函数句柄或内联函数名;
%          tspan 是求解区间 [t0 tf],或者一系列散点[t0,t1,...,tf]%          y0 是初始值向量
%          T 返回列向量的时间点
%          Y 返回对应T的求解列向量
%          options 是求解参数设置,可以用odeset在计算前设定误差,输出参数,事件等
%          TE 事件发生时间
%          YE 事件发生时之答案
%          IE 事件函数消失时之指针i

首先得将微分方程标准化,类似于选择状态变量写状态空间表达式,对于一般的微分方程

{ F ( y , y ˙ , y ¨ , … , y ( n − 1 ) , t ) = 0 y ( t 0 ) = c 0 , y ˙ ( t ) = c 1 , … , y ( n − 1 ) ( t 0 ) = c n − 1 \left\{ \begin{array}{lr} F(y,\dot{y},\ddot{y},\dots,y^{(n-1)},t)=0 \\ y(t_0)=c_0, \dot{y}(t)=c_1, \dots, y^{(n-1)}(t_0)=c_{n-1} \end{array} \right. {F(y,y˙,y¨,,y(n1),t)=0y(t0)=c0,y˙(t)=c1,,y(n1)(t0)=cn1

首先选择选择一组微分作为状态变量

x = [ x 1 x 2 x 3 ⋮ x n ] = [ y y ˙ y ¨ ⋮ y ( n − 1 ) ] \bold x = \begin{bmatrix} x_1 \\ x_2 \\ x_3 \\ \vdots \\x_{n} \end{bmatrix} = \begin{bmatrix} y \\ \dot{y} \\ \ddot{y} \\ \vdots \\y^{(n-1)} \end{bmatrix} x=x1x2x3xn=yy˙y¨y(n1)

然后将待求解的微分方程 F ( y , y ˙ , y ¨ , … , y ( n − 1 ) , y n , t ) = 0 F(y,\dot{y},\ddot{y},\dots,y^{(n-1)},y^n,t)=0 F(y,y˙,y¨,,y(n1),yn,t)=0,写成 y n = G ( y , y ˙ , y ¨ … , y n − 1 , t ) = G ( x 1 , x 2 , x 3 … , x n , t ) y^{n}=G(y,\dot{y},\ddot{y} \dots,y^{n-1}, t)=G(x_1,x_2,x_3 \dots,x_{n},t) yn=G(y,y˙,y¨,yn1,t)=G(x1,x2,x3,xn,t)的形式,然后写出 x ˙ \dot{\bold x} x˙

x ˙ = [ x 1 ˙ x 2 ˙ x 3 ˙ ⋮ x n ˙ ] = [ y ˙ y ¨ ⋮ y ( n − 1 ) y ( n ) ] = [ x 2 x 3 x 4 ⋮ G ( x 1 , x 2 , x 3 … , x n , t ) ] \bold{\dot{x}} = \begin{bmatrix} \dot{x_1} \\ \dot{x_2} \\ \dot{x_3} \\ \vdots \\ \dot{x_n} \end{bmatrix} = \begin{bmatrix} \dot{y} \\ \ddot{y} \\ \vdots \\ y^{(n-1)} \\ y^{(n)} \end{bmatrix} = \begin{bmatrix} x_2 \\ x_3 \\ x_4 \\ \vdots \\ G(x_1,x_2,x_3 \dots,x_{n},t) \end{bmatrix} x˙=x1˙x2˙x3˙xn˙=y˙y¨y(n1)y(n)=x2x3x4G(x1,x2,x3,xn,t)

上述步骤便是我们需要在odefun中完成的,举一个示例:在时间区间 t = [ 3.9 , 4 ] t=[3.9,4] t=[3.9,4],求解微分方程

y ′ ′ = − t y + e t y ′ + 3 s i n 2 t , y ∣ t = 3 = 8 , y ′ ∣ t = 3 = 2 y''=-ty+e^ty'+3sin2t, y|_{t=3}=8, y'|_{t=3}=2 y=ty+ety+3sin2t,yt=3=8,yt=3=2
那么即
x ˙ = [ x [ 1 ] − t ∗ x [ 1 ] + e t ∗ x [ 2 ] + 3 s i n 2 t ] \bold{\dot{x}} = \begin{bmatrix} \bold{x}[1] \\ -t*\bold{x}[1]+e^t*\bold{x}[2]+3sin2t \end{bmatrix} x˙=[x[1]tx[1]+etx[2]+3sin2t]文章来源地址https://www.toymoban.com/news/detail-469859.html

%在odefun.m脚本文件中完成以下内容
function dxdt = odefun(t, x)
	dxdt = zeros(2, 1);  %初始化为 2 x 1的零矩阵
	dxdt(1) = x(2);
	dxdt(2) = -t*x(1)+exp(t)*x(2)+3*sin(2*t);
end
%在main.m脚本文件中完成以下内容
tspan = [3.9, 4];
y0 = [8, 2];
[t, y] = ode45('odefun', tspan, y0);	%x的第一列为y,第二列为y’。如果遇到变量不是列向量形式的,可以考虑利用reshape函数做矩阵变换。
plot(t, y(:,1), '-o', t, y(:,2), '-*');
legend('y', "y'");
xlabel('t');
【Matlab】一、解常微分方程ODE

到了这里,关于【Matlab】一、解常微分方程ODE的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • matlab求解时变系统的Riccati矩阵微分方程

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

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

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

    2024年02月04日
    浏览(35)
  • 40.利用欧拉法求解微分方程组(matlab程序)

    1. 简述        求解微分方程的时候,如果不能将求出结果的表达式,则可以对利用数值积分对微分方程求解,获取数值解。欧拉方法是最简单的一种数值解法。前面介绍过MATLAB实例讲解欧拉法求解微分方程,今天实例讲解欧拉法求解一阶微分方程组。 本文理论部分来自知乎

    2024年02月14日
    浏览(43)
  • matlab使用教程(27)—微分代数方程(DAE)求解

            微分代数方程是一类微分方程,其中一个或多个因变量导数未出现在方程中。方程中出现的未包含其导数的变量称为代数变量,代数变量的存在意味着您不能将这些方程记为显式形式 y ′ = f t , y 。相反,您可以解算下列形式的 DAE:         • ode15s 和 ode23t

    2024年02月11日
    浏览(32)
  • matlab使用教程(28)—微分方程(ODE)求解常见问题

            本博客说明如何将 ODE 解约束为非负解。施加非负约束不一定总是可有可无,在某些情况下,由于方程的物理解释或解性质的原因,可能有必要施加非负约束。仅在必要时对解施加此约束,例如不这样做积分就会失败或者解将不适用的情况。         如果解的

    2024年02月11日
    浏览(40)
  • MATLAB 之 非线性方程数值求解、最优化问题求解和常微分方程初值问题的数值求解

    非线性方程的求根方法很多,常用的有牛顿迭代法,但该方法需要求原方程的导数,而在实际运算中这一条件有时 是不能满足的,所以又出现了弦截法、二分法等其他方法。 在 MATLAB 中,非线性方程的求解和最优化问题往往需要调用最优化工具箱来解决。优化工具箱提供了一

    2024年02月08日
    浏览(41)
  • 欧拉法与梯形法求解微分方程【含matlab源代码】

    本文介绍两种入门级求解微分方程的方法 —— 梯形法与欧拉法。 将上述方程组改写成matlab语言: 一、欧拉法 1.1 向前欧拉公式 1.2 向后欧拉公式     欧拉法求解源代码       欧拉法结果图   二、梯形法    梯形法求解源代码       梯形法结果图    感谢 Miracle 向公众

    2024年02月15日
    浏览(33)
  • 微分方程+传染病模型(指数传播、SI、SIS、SIR模型)+MATLAB求解

    本文为北海的数模课程学习笔记,课程出自微信公众号:数学建模BOOM。 求赞!求收藏!求关注! 微分方程结合传染病模型(如指数传播、SI、SIS、SIR模型)提供了一种用数学公式描述疾病传播动态的方法,有助于理解和预测疾病在人群中的传播路径和速度。 目录 指数传播模

    2024年02月04日
    浏览(42)
  • matlab解微分方程

    f=@(变量) 表达式; x1为2 3 4 5;x2为3 4 5 6的情况下求解函数f的值 用“dsolve” step1: 申明自变量和因变量 syms y(x) step2:编程 得到: step1: 申明自变量和因变量 syms y(x) step2:编程 得到 step1.写函数文件 step2.主函数 相当于定义了一个新向量y,然后列 匿名函数 ,方程的 左边都是一阶

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

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

    2024年02月13日
    浏览(25)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包