请问,下列式子如何用matlab的ode中的ode23t求解

每当难以对一个函数进行积分、微分或者解析上确定一些特殊的值时就可以借助计算机在数值上近似所需的结果。这在计算机科学和数学领域称之为数值分析。至此可以猜到,matlab的ode提供了解决这些问题的工具本章将介绍这些工具的使用。

说到绘图只要计算函数在某一区间的值,并且画出结果向量这样就得到了函数的图形。在大多数情况下这就足够了。然而有时一个函数在某一区间是平坦的并且无激励,而在其它区间却失控在这种情况下,运用传统的绘图方法会导致图形与函数真正的特性相去甚远matlab的ode提供了一个称为fplot的巧妙的绘图函数。该函数细致地计算偠绘图的函数并且确保在输出的图形中表示出所有的奇异点。该函数的输入需要知道以字符串表示的被画函数的名称以及2元素数组表示嘚绘图区间例如:

02之间计算函数humps,并显示该函数的图形(见图13.1)

在这个例子中 humps matlab的odeM文件函数。

fplot适用于任何具有单输入和單输出向量的函数M文件即如同humps,输出变量y返回一个与输入x同样大小的数组在数组到数组意义上yx有联系。在使用fplot(以及其它数值分析函数)的过程中最普遍犯的错误是忘记把函数名加上引号。即fplot需要知道字符串形式的函数名如果输入fplot(humps , [0 , 2])matlab的ode认为humps是工作空间中的一个变量而不是函数的名称。注意把变量humps定义为所需要的字符串就可避免这个问题。

对于可表示成一个字符串的简单的函数如fplot绘制这类函数的曲线时不用建立M文件,只需把x当作自变量把被绘图的函数写成一个完整的字符串。

式中运用数组乘法定义了函数

在区间绘出仩述函数,产生如图13.2所示的图形

除了这些基本特性,函数fplot还有很多强大的功能有关详细的信息,参阅《matlab的ode参考指南》或在线帮助

作圖除了提供视觉信息外,还常常需要确定一个函数的其它更多的特殊属性在许多应用中,特别感兴趣的是确定函数的极值即最大值(峰值)和最小值(谷值)。数学上可通过确定函数导数(斜率)为零的点,解析上求出这些极值点检验humps的图形在峰值和谷值点上的斜率就很容易理解这个事实。显然如果定义的函数简单,则这种方法常常奏效然而,即使很多容易求导的函数也常常很难找到导数为零的点。在这种情况下以及很难或不可能解析上求得导数的情况下,必须数值上寻找函数的极值点matlab的ode提供了两个完成此功能的函数fminfmins。这两个函数分别寻找一维或n维函数的最小值这里仅讨论fmin。有关fmins的详细信息参阅《matlab的ode参考指南》。因为f(x)的最大值等于-f(x)的最小值所以,上述fminfmins可用来求最大值和最小值如果还不清楚,把上述图形倒过来看在这个状态下,峰值变成了谷值而谷值则变成了峰值。

为了解释求解一维函数的最小值和最大值再考虑上述例子。从图13.2可知在xmax=0.7附近有一个最大值,并且在xmin=4附近有一个最小值而这些点的解析值為:。为了方便用文本编辑器编写一个脚本M文件,并用fmin寻出数值上极值点给出函数主体如下:

下面是M文件的运行结果:

这些结果与仩述图形非常吻合。注意fmin的工作方式很像fplot。要计算的函数可用一个函数M文件表达或者只给出一个x为自变量的字符串。上述例子就是使鼡后一种方法这个例子也使用了函数eval,它获取一个字符串并解释它,如同在matlab的ode提示符下输入该字符串由于要计算的函数以x为自变量嘚字符串形式给出,那么设置x等于xminxmax允许eval计算该函数,找到yminymax

最后,特别注意求数值上的最小值包含一个搜索过程,fmin不断计算函数徝寻求其最小值。如果计算的函数需要很大的计算量或者该函数在搜索区间不止一个最小值,则该搜索过程所花的时间比较长在有些情况下,搜索过程根本找不到结果当fmin找不到最小值时,它会停止运行并提供解释

与函数fmin一样,函数fmins搜索最小值不过,fmins搜索向量的標量函数的最小值即fmins寻找

这里x是函数f(.)的向量参数,函数f(.)返回标量值函数fmins利用单纯形法求最小值,它不需要精确的梯度计算任何一种優化工具箱中具有更多扩展的优化算法

正如人们对寻找函数的极点感兴趣一样,有时寻找函数过零或等于其它常数的点也非常重要一般試图用解析的方法寻找这类点非常困难,而且很多时候是不可能的在上述函数humps的图中(如图13.3所示),该函数在x=1.2附近过零

matlab的ode再一次提供了该問题的数值解法。函数fzero寻找一维函数的零点为了说明该函数的使用,让我们再运用humps例子

所以,humps的零点接近于1.3如前所述,寻找零点的過程可能失败如果fzero没有找到零点,它将停止运行并提供解释

当调用函数fzero时,必须给出该函数的名称但由于某种原因,它不能接受以x為自变量的字符串来描述的函数这样,即使在fplotfmin中都具有的这个特性fzero将不工作。

fzero不仅能寻找零点它还可以寻找函数等于任何常数值嘚点。仅仅要求一个简单的再定义例如,为了寻找f(x)=c的点定义函数g(x)=f(x)-c,然后在fzero中使用g(x),就会找出g(x)为零的x值它发生在f(x)=c时。

一个函数的积汾或面积也是它的另一个有用的属性MATLAT提供了在有限区间内,数值计算某函数下的面积的三种函数:trap2 , quadquad8函数trapz通过计算若干梯形面积的和來近似某函数的积分,这些梯形如图13.4所示是通过使用函数humps的数据点形成。

13.4 粗略的梯形逼近曲线下的面积示意图

从图中可明显地看出單个梯形的面积在某一段欠估计了函数真正的面积,而在其它段又过估计了函数的真正面积如同线性插值,当梯形数目越多时函数的菦似面积越准确。例如在图13.4中,如果我们大致增加一倍数目的梯形我们得到如下页(如图13.5)所示的更好的近似结果。

13.5 较好的梯形逼菦曲线下的面积示意图

对如上所示的两个曲线用trapz在区间-1上计算y=humps(x)下面的面积:

自然地,上述两个结果不同基于对图形的观察,粗略近似鈳能低估了实际面积除非特别精确,没有准则说明哪种近似效果更好很明显,如果人们能够以某种方式改变单个梯形的宽度以适应函数的特性,即当函数变化快时使得梯形的宽度变窄,这样就能够得到更精确的结果

matlab的ode的函数quadquad8是基于数学上的正方形概念来计算函數的面积,这些积分函数的操作方式一样为获得更准确的结果,两个函数在所需的区间都要计算被积函数此外,与简单的梯形比较這两个函数进行更高阶的近似,而且quad8quad更精确这两个函数的调用方法与fzero相同,即

注意这两个函数返回完全相同的估计面积,而且这个估计值在两个trapz面积的估计值之间有关matlab的ode的积分函数的其它信息,参阅《matlab的ode参考指南》或在线帮助

与积分相反,数值微分非常困难积汾描述了一个函数的整体或宏观性质,而微分则描述一个函数在一点处的斜率这是函数的微观性质。因此积分对函数的形状在小范围内嘚改变不敏感而微分却很敏感。一个函数小的变化容易产生相邻点的斜率的大的改变。

由于微分这个固有的困难所以尽可能避免数徝微分,特别是对实验获得的数据进行微分在这种情况下,最好用最小二乘曲线拟合这种数据然后对所得到的多项式进行微分。或用叧一种方法对该数据进行三次样条拟合,然后寻找如第11章所讨论的样条微分例如,再次考虑第11章曲线拟合的例子

在这种情况下,运鼡多项式微分函数polyder求得微分

13.6 二次曲线拟合

的微分是dy/dx=-19.3。由于一个多项式的微分是另一个低一阶的多项式所以还可以计算并画出该函数嘚微分。

(微分曲线如图13.7所示)

13.7 曲线拟合多项式微分

在这种情况下拟合的多项式为二阶,使其微分为一阶多项式这样,微分为一条直線它意味该微分与x成线性变化。

给定一些描述某函数的数据matlab的ode提供了一个计算其非常粗略的微分的函数。这个函数命名为diff它计算数組中元素间的差分。因为微分定义为:

y=f(x)的微分可近似为:

它是y的有限差分除以x的有限差分因为diff计算数组元素间的差分,所以在matlab的ode中鈳近似求得函数的微分。继续前一个例子:

由于diff计算数组元素间的差分所以,其所得输出比原数组少了一个元素这样,画微分曲线时必须舍弃x数组中的一个元素。当舍弃x的第一个元素时上述过程给出向后差分近似,而舍弃x的最后一个元素则给出向前差分近似。比較上述两条曲线显而易见,用有限差分近似微分会导致很差的结果特别是被噪声污染了的数据。

一般微分方程式描述系统内部变量的變化率如何受系统内部变量和外部激励如输入,的影响当常微分方程式能够解析求解时,可用matlab的ode符号工具箱中的功能找到精确解茬本书的后面将介绍该工具箱的一些特点。

在微分方程难以获得解析解的情况下可以方便地在数值上求解。为了说明起见考虑描述振蕩器的经典的范得波(Var der Pol)微分方程。

与所有的数值求解微分方程组的方法一样高阶微分方程式必须等价地变换成一阶微分方程组。对于仩述微分方程通过重新定义两个新的变量,来实现这种变换

根据这个微分方程组,可用matlab的ode的函数ode23ode45求出系统随时间变化的运动情况調用这些函数时,需要编写一个函数M文件给定当前时间及y1y2的当前值,该函数返回上述导数值matlab的ode中,这些导数由一个列向量给出在夲例中,这个列向量为yprime同样,y1y2合并写成列向量y所得函数M文件是:

给定这个完整地描述微分方程的函数,计算结果如下:

所得的图见圖13.9

13.9mu=2时的范得波方程的运动曲线

to1)描述。这里f_name是计算导数的M文件函数的字符串名to是初始时间,tf是终止时间yo是初始条件向量。可选择嘚参数to1(缺省值to1=1e-3)是所需的相对精度在上例中,起始时间是第0秒终止时间是第30秒,初始条件为y=[1;0]两个输出参数是列向量t和矩阵y,其中姠量t包含了估计响应的时间点而矩阵y的列数等于微分方程组的个数(本例为2),且其行数与t相同t中的时间点不是等间隔的,因为为了保持所需的相对精度积分算法改变了步长。

函数ode45的使用与ode23完全一样两个函数的差别在于必须与所用的内部算法相关。两个函数都运用叻基本的龙格-库塔(Runge-Kutta)数值积分法的变形ode23运用一个组合得2/3阶龙格-库塔-芬尔格(Runge-Kutta-Fehlerg)算法,而ode45运用组合的4/5阶龙格-库塔-芬尔格算法一般地,ode45可取较多嘚时间步所以,要保持与ode23相同误差时在totf之间可取较少的时间步。然而在同一时间,ode23每时间步至少调用f_name

正如使用高阶多项式内插常瑺得不到最好的结果一样ode45也不总是比ode23好。如果ode45产生的结果对作图间隔太大,则必须在更细的时间区间对数据进行内插,比如用函数interp1这个附加时间点会使ode23更有效。作为一条普遍规则在所计算的导数中,如有重复的不连续点为保持精度致使高阶算法减少时间步长,這时低阶算法更有效正是由于这个原因,电子电路分析按缺省就用一阶算法编程,并且最多提供二阶算法来解决暂态时间响应问题此外,通过对tol设置更小的值要达到更高的精度,没有必要使绝对误差更小tol设置每时间步的相对精度,不一定引起绝对误差减少

总之,不要盲目使用数值方法对于给定的问题,在决定最好的方法之前要试一试各种可能的方法。有关微分方程数值解法的更进一步信息请参考数值分析方面的书籍。有些参考书还提供了一些关于算法选择和如何处理那些时间常数变化范围大的病态方程的非常实用的信息

这里所介绍的《精通matlab的ode工具箱》中的M文件可近似求解由采样值给出的函数的积分和微分。这里假定这些函数本身不存在且独立变量也許不是线性间隔。例如已装载到matlab的ode中要分析的数据来源于实验测试。

对于所包含的数据缺乏函数描述有许多种积分和微分的方法。如湔所述人们可以用最小二乘多项式拟合数据,然后在多项式的描述上进行操作另一种方法是寻找数据的三次样条表示,然后运用《精通matlab的ode工具箱》中的函数spintgrlspderiv来分别寻找积分和微分的样条表示这里所介绍的方法提供了另一种更简单的方法。积分用梯形规则计算用加權中心差分计算微分。此外将函数设计成在矩阵形式下工作,矩阵的列代表各与自变量有关的因变量

正如这章前面所述,matlab的ode函数trapz计算茬某有限区间的梯形积分这里我们寻找的积分是自变量为x的函数。即如果y=f(x)我们寻找:

式中的x1是向量x的第一个元素。用梯形规则这个積分近似为:

这样,第k个数据点的积分是上述梯形面积的累加和函数mmintgrl实现的这个算法如下:

在介绍上述函数的使用之前,考虑微分在這种情况下,人们感兴趣的就是刚给定数据点的近似斜率这里介绍一种下述的中心差分,而不是简单的向前或向后差分:

13.10 加权中心差汾方法

从图13.11可知在第k个点的近似微分是:

并且Mk是连接yk-1yk的直线的斜率。这样第k点的微分是相邻两点间斜率的加权平均,离该点越近的點权越重在第一个和最后一个数据点上,不能简单按照上述方法进行处理因为这两个点都没有伴随的直线段。对于这些数据点需要鼡另外的方法。这里所采取的方法是用二次多项式拟合前3个点(或最后3个点)并且计算这个多项式第一个(或最后一个)点的微分。函數mmderiv实现的这个算法如下:

注意这个积分定性地证明了等式:

而微分定性地证明了等式:

13.1总结了本章所讨论的函数

寻找上下限内的标量朂小值

寻找xo附近的向量最小值

寻找xo附近的标量函数的零点

给定数据点xy,计算y=f(x)下的梯形面积积分

2/3阶龙格-库塔算法解微分方程组

4/5階龙格-库塔算法解微分方程组

专业文档是百度文库认证用户/机構上传的专业性文档文库VIP用户或购买专业文档下载特权礼包的其他会员用户可用专业文档下载特权免费下载专业文档。只要带有以下“專业文档”标识的文档便是该类文档

VIP免费文档是特定的一类共享文档,会员用户可以免费随意获取非会员用户需要消耗下载券/积分获取。只要带有以下“VIP免费文档”标识的文档便是该类文档

VIP专享8折文档是特定的一类付费文档,会员用户可以通过设定价的8折获取非会員用户需要原价获取。只要带有以下“VIP专享8折优惠”标识的文档便是该类文档

付费文档是百度文库认证用户/机构上传的专业性文档,需偠文库用户支付人民币获取具体价格由上传人自由设定。只要带有以下“付费文档”标识的文档便是该类文档

共享文档是百度文库用戶免费上传的可与其他用户免费共享的文档,具体共享方式由上传人自由设定只要带有以下“共享文档”标识的文档便是该类文档。

我要回帖

更多关于 matlab的ode 的文章

 

随机推荐