matlab学习-第六、七章-微分方程部分

到了最麻烦的部分了,matlab比较重要的一点就是做计算,换句话说就是解方程。
经常会遇到非线性的、非齐次的、高次的、微分的、多元的方程组,哪些可以解,哪些不能解,程序怎么写,有没有近似解法,算法怎么设计,等等,都是问题,需要系统整理。
学习之后完成三个任务,整理方程求解方法、解决遇到的那个非线性方程组、解决泊松方程的求解。

极限计算

MATLAB 可以使用 limit 命令计算极限。最基本的使用方法就是输入你要计算的表达式。
MATLAB 将会帮你找出独立变量趋于零时的极限。
(isequal(A,k)可以判断两个值是否相等)

如果在特定的点就写成limit(f, a)
无穷就写成inf

左极限和右极限

在后面加left,或者right,注意还要加上变量名,即对哪个变量求极限:
a = limit(f,x,3,‘left’)

获得渐近线
略。。。

求导计算

命令为diff(),可以先写成表达式a=f(x),然后diff(a)

计算高阶导数:diff(f,n),n为阶数,diff的结果也可以赋值给变量来保存

指令subs(f,c),计算f(c)

具体等用到再说。。。。

dsolve命令

在 MATLAB 中我们可以使用 dsolve 命令求解符号微分方程
使用 dsolve 求某个方程的解的语法是 dsolve(‘equ’)
我们还能够为方程指定初始和边界条件,不管有多少条件,这些条件用逗号隔开并附带在“equ”后面,形式如dsolve(‘eqn’, ‘cond1’, ‘cond2’…)

可以注意下微分方程的写法:
在这里插入图片描述
这样的话可以处理大多数常见的微分方程。

常微分方程(ODE)求解

对于一般的情况,我们可以使用 dsolve 命令求解,只需把方程传递给它即可
与上面的方法相同

求出通解后,可以自己给C1、C2等值赋值,得到特解,方法是利用subs()函数
s = C1exp(at)
C1 = 2; a = 4;
f = subs(s) 注意一般情况下需要赋值给某个变量,可以是f,也可以是其他的
会得到 f = 2exp(4t)

意思是对于
C1和a,虽然工作区没有显示两个变量,但是仍然是有名字的变量,赋值再subs,会自动的得到特解

有边界条件时,直接写在dsolve后面, 格式类似:
dsolve(‘Dy = y*t/(t-5)’,‘y(0) = 2’)
dsolve(‘D2y - y = 0’,‘y(0) = -1’,‘Dy(0) = 2’)

方程组和相平面图

开始解决方程组的问题,就是把多个方程写在dsolve里面
相图就略了,估计用不到,,,,,


使用ODE23 和ODE45 求解一阶方程

这里的格式一下给我整蒙了。。。书上的例子是先写了个函数,然后用ode23什么什么的,实在没看懂,还是先对照着官方的文档来学习一下。

1、[t,y] = ode23(odefun,tspan,y0)

①具有一个解分量的ode

这里,odefun是一个式子,tspan是一个范围,yo为初始条件,这个式子用来求微分方程组 y’=f(t,y) 从 t0 到 tf 的积分
也就是说,用这个指令时,方程必须能写成y’=f(t,y) 的形式,然后求出数值解。

这里产生了一个问题,求出来的t和y是离散的数组,那么怎么得到任意t下的y值??

②求解范德波方程
在这里插入图片描述
此方程为二阶方程、非线性、常微分方程
可以写成两个一阶微分方程:
在这里插入图片描述
这样可以写出方程组,方程组需要写成列向量的形式,每个元素是一个式子
这里也用到了函数形式,不知道为什么,还是试着写一写吧。。。。
在这里插入图片描述

格式如上,先写一个函数,返回值是eqn,会返回一个方程,或者方程组(列向量),如果是方程组,y就不止一个,y也是向量,y1、y2用数组访问规则来访问。
解方程时,格式是[t,y] = ode23(@函数名称,范围,初值)
最终得到的t是一个列向量,y是两列列向量

画图时,利用点线比较直观。。。

这里的vdp叫做句柄,这个概念在之前听过但是不知道是什么意思,有时间整理一下。

③向ODE函数传递额外的参数

ode23 仅适用于使用两个输入参数(t 和 y)的函数。但是,通过在函数外部定义参数并在指定函数句柄时传递这些参数,可以传入额外参数。例如如下的方程:
在这里插入图片描述
此时需要写一个函数odefcn(t,y,A,B),存在四个参量
然后给参量赋值后使用ode23即可
在这里插入图片描述
这里还有两个不太理解的地方,一个是dydt为什么是两行一列的列向量,另外一个是为什么有.*出现。。。。先放一下吧。这个例子主要就是演示了一下形式相同,参数不同的方程组的求解。

④具有宽松误差阈值的ode

与 ode45 相比,ode23 求解器可以更好地解算具有宽松误差容限的问题。
不知什么叫宽松误差容限,看了一眼例子好像也用不到,就算了。。。

二阶方程求解

现在我们看看如何求解二阶方程的数值解。这里使用的窍门是把一个方程分解为有两个方程的方程组。
不过刚刚的例子里,已经有过二阶方程的了。。。就先略过了。

  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
matlab中的微分方程-matlab中的微分方程.doc 1510 matlab中的微分方程 第1节  Matlab能够处理什么样的微分方程Matlab提供了解决包括解微分方程在内的各种类型问题的函数: 1. 常规微分方程(ODEs)的初始值问题 初值问题是用MATLAB ODE求解器解决的最普遍的问题。初始值问题最典型的是对非刚性度(?nonstiff)问题应用ODE45,对刚性度(?stiff)问题采用ODE15S。(对于stiffness的解释,请参照“什么是Stiffness”一节。) 2. 微分-代数方程(DAEs)的初值问题 在那些守恒定律规定一些变量之间满足常数关系领域经常遇到这类问题。Matlab 可以用ODE15S 或者 ODE23T解决索引(index)为1的DAEs。(对于索引的解释,请参阅“DAEs与他们的索引”一章。) 3. 边界值问题(BVPs) 这种通常要求微分方程在两边都具有特殊的条件组成。尽管他们通常不象IVPs那样经常遇到,但是他们也是工程应用中比较常见的问题。可以利用函数BVP4C来解决这类问题。 4. 时延微分方程(DDEs) 这类微分方程包含了独立变量的延迟。他们在生物与化学模型这类大量的应用中遇到,可以通过DDE23来解决这类问题。 5. 偏微分方程(PDEs) 采用PDEPE可以解决一维时空的抛物面与椭圆方程的初值、边界值的问题。而那些对更加多的一般的偏微分方程感兴趣的可以利用PDE工具箱。 更多的matlab的综合应用技术的信息请参阅Solution8314。 更多的有关matlab采用的各种求解器的算法的信息请查看下面的URLs: ● ODE 函数 ● BVP 函数 ● DDE 函数 ● PDE 函数 第2节 可以从什么地方获得更多的指导与附加信息?    可以从MATLAB Center、网站的新闻组、文件交换点可以获得一系列资料,可以进一步解释MATLAB解决各种方程(ODE,DAE,BVP,DDE)的求解器的算法和使用。你可以下载各种方程的文章与手册,他们通常带有大量的实例。   可以从 matlab自带的帮助文件的 Mathematics|Differential Equations下找到使用指导。   Cleve Moler的《Numerical Computing with MATLAB》的第七章详细讨论了OEDs的解法,并附带有大量的实例与简单的问题练习。    第3节 对ODE求解器的语法存在有些什么变化? 在MATLAB6.5(R13)中应用ODE求解器求解的首选语法是: [t,y]=odesolver(odefun,tspan,y0,options,parameter1,parameter2,…,parameterN); odesolver 是你采用的求解器,例如ODE45或者ODE15S。odefun是微分方程的定义函数,所以odefun定义独立参数(典型的是时间t)的导数y‘ 以及y和其他的参数。在MATLAB6.5(R13)中,推荐使用函数句柄作为odefun。 例如,ode45(@xdot,tspan,y0),而不是用 ode45('xdot',tspan,y0)。 请看采用函数句柄的好处的文档: 采用函数句柄传递你定义MATLAB求解器计算的量、例如大规模矩阵或者Jacobian模式的函数。 如果你喜好采用字符串儿传递你的函数,matlab求解器将回溯匹配。 在老的matlab版本里,通过传递标志来规定求解器的状态和恰当的计算。在MATALB6.0以及其后的版本中,这就没有必要了,可以从matlab自带的文档中发现这个差别。 如果里采用的matlab的ODE求解器的老的语法,你可以看看我们FTP站点上的各种求解器的老的实例: ftp://ftp.mathworks.com/pub/doc/papers/ 前面的站点包含了BVP,DAE与DDE这三个方向的采用老的语法的实例。你可以在下面的站点中找到应用ODE45与ODE23的实例: ftp://ftp.mathworks.com/pub.mathworks/toolbox/matlab/funfun 你可以在MATLAB Center的文件交换站点查看这些例子的更新版本。 第4节  如何减小ODE的阶次? 求解一阶ODE的代码是很直接的。然而,二阶或者三阶的ODE不能够直接应用求解。你必须先将高阶的ODE改成一阶的ODEs系统,使得它可以采用MATLAB ODE求解器。 这是一个如何将二阶微分方程成两个一阶微分
### 回答1: 要使用Matlab绘制微分方程的方向场,需要使用odefun函数定义微分方程的形式,并使用quiver函数绘制方向场。 首先,我们需要在Matlab命令窗口中创建一个本地函数。本地函数的格式如下: function dxdt = odefun(t,x) dxdt = zeros(2,1); dxdt(1) = ...; % 第一个方程的微分项 dxdt(2) = ...; % 第二个方程的微分项 end 在函数的dxdt = ...;的地方,根据具体的微分方程形式定义两个方程的微分项。例如,若方程为 dx/dt = x + y,dy/dt = x - y,则可以成: function dxdt = odefun(t,x) dxdt = zeros(2,1); dxdt(1) = x + x(2); dxdt(2) = x(1) - x(2); end 定义好微分方程形式后,可以使用quiver函数绘制方向场。在Matlab命令窗口中输入以下代码: [t,x] = meshgrid(0:0.2:10, -2:0.2:2); % t范围为0到10,x范围为-2到2,间隔为0.2 dxdt = odefun(t,x); quiver(t,x,dxdt(1,:),dxdt(2,:)); % 绘制方向场 以上代码会绘制出微分方程的方向场,方向场上的箭头表示在每个点的微分方程的解向量的方向。 注意,以上代码只是一个示例,具体的微分方程形式需要根据问题来确定。同时,要注意选择合适的t和x范围以及间隔,以便绘制出较为准确的方向场。 ### 回答2: 要用Matlab绘制微分方程的方向场,可以按照以下步骤进行操作: 1. 定义微分方程:首先要定义待绘制的微分方程。例如,我们考虑一个一阶微分方程dy/dx = x^2 - y。 2. 创建网格点:利用meshgrid函数创建一个二维网格点的坐标矩阵(X, Y)。可以通过指定X和Y的范围,以及所需的网格密度来定义网格点。 3. 计算微分方程的斜率:利用已定义的微分方程,计算在每个网格点(X, Y)处的微分方程斜率。可以使用向量化的方法,将X和Y作为向量输入到微分方程中,然后得到所有网格点处的斜率。 4. 绘制方向场:利用quiver函数,在X-Y平面上绘制方向场。quiver函数可根据每个网格点处的坐标和斜率,绘制相应的箭头来表示方向。 5. 添加标题和坐标轴:添加标题和坐标轴说明,使图像更具可读性和可理解性。 6. 显示方向场:调用plot函数显示生成的方向场图。 在Matlab中,可以按照以下代码实现上述步骤: ```matlab % 步骤1:定义微分方程 dydx = @(x, y) x.^2 - y; % 步骤2:创建网格点 [X, Y] = meshgrid(-5:0.5:5, -5:0.5:5); % 步骤3:计算微分方程的斜率 slope = dydx(X, Y); % 步骤4:绘制方向场 quiver(X, Y, ones(size(slope)), slope); % 步骤5:添加标题和坐标轴 title('微分方程方向场示例'); xlabel('X轴'); ylabel('Y轴'); % 步骤6:显示方向场 axis tight; ``` 执行以上代码后,将会生成一个带有箭头的方向场图,表示微分方程的方向。箭头的方向显示了微分方程在每个点处的斜率方向。通过更改微分方程的定义和网格点的设置,可以绘制不同微分方程的方向场。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值