![MATLAB/Simulink权威指南:开发环境、程序设计、系统仿真与案例实战](https://wfqqreader-1252317822.image.myqcloud.com/cover/629/27111629/b_27111629.jpg)
4.5 数值计算
数值计算是指利用计算机求数学问题(例如,函数的零点、极值、积分和微分以及微分方程)近似解的方法。常用的数值分析有求函数的最小值、求过零点、数值微分、数值积分和解微分方程等。
4.5.1 函数极值
数学上利用计算函数的导数来确定函数的最大值点和最小值点,然而,很多函数很难找到导数为零的点。为此,可以通过数值分析来确定函数的极值点。MATLAB只有处理极小值的函数,没有专门求极大值的函数,因为f(x)的极大值问题等价于﹣f(x)的极小值问题。MATLAB求函数的极小值使用fminbnd和fminsearch函数。
1.一元函数的极值
fminbnd函数可以获得一元函数在给定区间内的最小值,函数调用格式如下:
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P181_29182.jpg?sign=1739577651-gTkqjAXZmlBtKGWn8nRQI9XBNCtiRxMC-0-55703670a3edb8a78ec7422c00e192d9)
其中,fun是函数的句柄或匿名函数;x1和x2是寻找函数最小值的区间范围(x1<x<x2);x为在给定区间内,极值所在的横坐标。
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P181_29183.jpg?sign=1739577651-7t5jGIsmKCY6wiHRHeR6bKWLwVwrNnia-0-1803fbc54a87141bf00d2696ed00392a)
其中,y为求得的函数极值点处的函数值。
【例4-16】 已知y=e﹣0.2xsin(x),在0≤x≤5π区间内,使用fminbnd函数获取y函数的极小值。
程序代码如下:
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P181_29185.jpg?sign=1739577651-CUOtxpsBnZBrs7XFmikfXK1kSJX4dMhl-0-bd43678f56478556ed49cd269760db5a)
程序运行结果如下,图4-7是函数在区间[0,5∗pi]的函数曲线图。
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P182_11086.jpg?sign=1739577651-rUlnjpqi0m7BNBhjWJp7rvnpmFAFUfrB-0-cab6d7be7247b3f84570fe2366a68017)
图4-7 在区间[0,5∗pi]的函数曲线
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P182_29188.jpg?sign=1739577651-OPSUtXoTnscwMJHOHXGC9LdDYl5u47bn-0-33533546901a32c6f69bac42d4c12166)
由图4-7可知,函数在x=4.5附近出现极小值点,极小值约为﹣0.4,验证了用极小值fminbnd函数求的极小值点和极小值是正确的。
2.多元函数的极值
fminsearch函数可以获得多元函数的最小值,使用该函数时需要指定开始的初始值,获得初始值附近的局部最小值。该函数的调用格式如下:
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P182_29189.jpg?sign=1739577651-IO8AYklNl9inGv86WURFazWA3wyr5i7k-0-6ac1679111dac129621a954a8d3e6812)
其中,fun是多元函数的句柄或匿名函数;x0是给定的初始值;x是最小值的取值点;y是返回的最小值,可以省略。
【例4-17】 使用fminsearch函数获取f(x,y)二元函数在初始值(0,0)附近的极小值,已知f(x,y)=100(y﹣x2)2+(1﹣x)2。
程序代码如下:
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P182_29191.jpg?sign=1739577651-WX5X3aUDI1Nf2bvCSOVCed7VRJAKspWO-0-e8b93541d530ffd9c979144024e519aa)
程序运行结果如下:
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P183_29192.jpg?sign=1739577651-BZCwDxhONedJHaYBoR9YGrizZ6AV73l8-0-3bed240dea3e3e70225ecacc86654973)
由结果可知,由函数fminsearch计算出局部最小值点是[1,1],最小值为y1=3.6862e﹣10,和理论上是一致的。
4.5.2 函数零点
一元函数f(x)的过零点的求解相当于求解f(x)=0方程的根,MATLAB可以使用fzero函数实现,需要指定一个初始值,在初始值附近查找函数值变号时的过零点,也可以根据指定区间来求过零点。该函数的调用格式为
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P183_29193.jpg?sign=1739577651-vqjMu4Z5FnsoivvyJE8XQfubyM1aHE79-0-5ecdbe404f32eae15566e8b9ebb1f101)
其中,x为过零点的位置,如果找不到,则返回NaN;y是指函数在零点处函数的值;fun是函数句柄或匿名函数;x0是一个初始值或初始值区间。
需要指出,fzero函数只能返回一个局部零点,不能找出所有的零点,因此需要设定零点的范围。
【例4-18】 使用fzero函数求f(x)=x2﹣5x+4分别在初始值x=0和x=5附近的过零点,并求出过零点函数的值。
程序代码如下:
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P183_29195.jpg?sign=1739577651-l7tZdylAFDYVXTyYrJn22TQOcSe3s3Sj-0-e9ff15a46a8b0da7a53cbe54ddaba7bb)
程序运行结果如下:
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P183_29196.jpg?sign=1739577651-rKmO9c8C6gwLx5J2YOGT25FB9f3CupNA-0-f799506fe891bb6bd54e26ffd161bb83)
由结果可知,用fzero函数可以求在初始值x0附近的函数过零点。不同的零点,需要设置不同的初始值x0。
4.5.3 数值差分
任意函数f(x)在x点的前向差分定义为
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P184_29199.jpg?sign=1739577651-auGlZ0jeRLc6dxcd49tVemT8TrdIFSpT-0-a350bfdf69ca483275edf9a949f5fc44)
称Δf(x)为函数f(x)在x点处以h(h>0)为步长的前向差分。
在MATLAB中,没有直接求数值导数的函数,只有计算前向差分的函数diff,其调用格式为
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P184_29201.jpg?sign=1739577651-GPVvkjsftpdlGeoibezBrKSljuhbkxw9-0-2ac2de927c832058b909358868a82b71)
例如,已知矩阵,分别求矩阵A行和列的一阶和二阶前向差分。
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P184_29204.jpg?sign=1739577651-ZP1Hg9O5qcshFO7dPDGixeFXqJxIgWkq-0-a733cb59fb1d4f809614289f9e7fe3bc)
4.5.4 数值积分
数值积分是研究定积分的数值求解的方法。MATLAB提供了很多种求数值积分的函数,主要包括一重积分和二重积分两类函数。
1.一重数值积分
MATLAB提供了quad函数和quadl函数求一重积分。它们的调用格式分别如下:
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P185_29205.jpg?sign=1739577651-2yhJaqMJLW7dxMp7XqXCnbA4TDn1mIuK-0-5941f3a649057e7d012a781a9b923158)
它是一种采用自适应的Simpson方法的一重数值积分,其中,fun为被积函数,函数句柄;a和b为定积分的下限和上限;tol为绝对误差容限值,默认是10﹣6;trace控制是否展现积分过程,当trace取非0,则展现积分过程,默认取0。
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P185_29206.jpg?sign=1739577651-qIPO5s3qA5QskcQuDyeNdaVJqpOYbPCu-0-0e3626b03efd1130f6620e98cbe22e69)
它是一种采用自适应的Lobatto方法的一重数值积分,参数定义和quad一样。
【例4-19】 分别使用quad函数和quadl函数求的数值积分。
程序代码如下:
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P185_29209.jpg?sign=1739577651-0VGt5KpAIr9HJVeOxP12q5fSSGplqTe8-0-9288bc5fb939a327bf43ec80b41170b6)
程序运行结果如下:
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P185_29210.jpg?sign=1739577651-yP3PevPR4DSrTZaFnWVTJ37JJU26b2rE-0-74971ebd97c1eceb2e26516cfd2ae765)
其中,迭代过程最后一列的和为数值积分q3的值。
2.多重数值积分
MATLAB提供了dblquad函数和triplequad函数求二重积分和三重积分。它们的调用格式如下:
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P186_29211.jpg?sign=1739577651-DGhFgne9h497AK6elduJbauOz7aXF9S7-0-b386419eab1fd9f4292ebd7314a18268)
函数的参数定义和一重积分一样。
例如,求二重数值积分。
代码如下:
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P186_29214.jpg?sign=1739577651-hPZoj7sHo8DxjEkamzZoXoGVxVFZAxuw-0-fe24b8576f3434ed6dd7a2fb50884b30)
4.5.5 常微分方程求解
MATLAB为解常微分方程提供了多种数值求解方法,包括ode45、ode23、ode113、ode15s、ode23s、ode23t和ode23tb等函数,用得最多的是4/5阶龙格-库塔法ode45函数。该函数的调用格式如下:
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P186_29215.jpg?sign=1739577651-gje85M5YkCuexRYWNK3fEYcRS4qoGRba-0-482787895a4e1e3a96287abbec147c86)
其中,fun是待解微分方程的函数句柄;ts是自变量范围,可以是范围[t0,tf],也可以是向量[t0,…,tf];y0是初始值,y0和y具有相同长度的列向量;options是设定微分方程解法器的参数,可以省略,也可以由odeset函数获得。
需要注意,用ode45求解时,需要将高阶微分方程y(n)=f(t,y,y′,…,y(n﹣1)),改写为一阶微分方程组,通常解法是,假设y1=y,从而y1=y,y2=y′,…,yn=y(n﹣1),于是高阶微分方程可以转换为下述常微分方程组求解:
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P186_29217.jpg?sign=1739577651-YshaKhedSxG49pv2WCVYe6IEDGnhT25j-0-f0c80628644344a32c349a4499bb805a)
【例4-20】 已知二阶微分方程,试用ode45函数解微分方程,作出y—t的关系曲线图。
(1)首先把二阶微分方程改写为一阶微分方程组。
令y1=y,,则
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P187_29220.jpg?sign=1739577651-DC4JoloBjGgTcx38lkIbwRd5Un7zMn3K-0-d079069f6c51a9f3563576513cb9a548)
(2)程序代码如下:
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P187_29221.jpg?sign=1739577651-ejl1PCcGw00G3XF6A90PFps2glSp6JFv-0-60e8fc3b44e1e183b9dab8a6d1670066)
程序运行结果如图4-8所示。
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P187_11284.jpg?sign=1739577651-lQxqS3CJpOWGeRCg1Cl8JPRK6GoCxOJ9-0-7115fa9b4d93bb93e0c667541bdf2f48)
图4-8 二阶微分方程的数值解