第7章计算方法的MATLAB实现讲稿

更新时间:2024-04-04 04:15:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

第7章 计算方法的MATLAB实现

第7章 计算方法的MATLAB实现

计算方法主要研究数学问题的数值解,涉及的内容广。利用MATLAB提供的部分函数解决,可以实现某些情况下的数值求解。本章作简要介绍。

7.1 一元非线性方程求解

求解一元非线性方程的方法主要有二分法、割线法、牛顿法等。本节主要介绍两个可以求解一元非线性方程的函数,即fzero函数和roots函数。 7.1.1 fzero函数

用fzero函数求一元非线性方程的零点。该函数的简单调用格式为: ●x=fzero(fun,x0):如果x0为标量,则试图寻找函数fun在x0附近的零点。fun参数是一个M文件函数或匿名函数的函数句柄。函数fzero返回的值x靠近fun函数改变符号的位置。如果搜索失败,则返回NaN。搜索区间扩展到发现inf、NaN或复数值时终止搜索。如果x0是一个长度为2的向量,则fzero函数假设x0是一个区间,其中fun(x0(1))与fun(x0(2))异号。如果符号相同,则会出错。给出相应函数值异号的区间可以保证fzero函数返回一个fun函数改变符号的位置附近的值。

●[x,fval]=fzero(…):返回解x和解x处目标函数fun的值。

●[x,fval,exitflag]=fzero(…):还返回一个exitflag值,描述fzero函数的退出条件。返回值及其描述如下所示:

>0,表示函数找到了零值点x; ?0,表示没有发现零值点。

例7-1 求方程(x?20)(x?1)(x?5)(x?30)?0的解。 程序代码: clear;clc;

f=@(x)(x+20)*(x+1)*(x-5)*(x-30);%创建匿名函数 x1=fzero(f,-50)%解一元非线性方程 x2=fzero(f,1) x3=fzero(f,6) x4=fzero(f,50) 运行结果: x1 =

- 133 -

第7章 计算方法的MATLAB实现

-20 x2 = -1 x3 = 5 x4 = 30

7.1.2 roots函数

用roots函数计算多项式的根,该函数的调用格式为: ●r=roots(c):返回一个列向量,其元素为多项式c的解。 例7-2 求多项式方程x?5x?x?5?0的解。 程序代码:

clear;clc;

P=[1 -5 1 -5];%表示多项式 r=roots(P)%求多项式方程的解

P1=poly(r)%由多项式的根返回多项式的系数 运行结果:

r =

5.0000 -0.0000 + 1.0000i -0.0000 - 1.0000i P1 =

1.0000 -5.0000 1.0000 -5.0000

注:poly和roots互为逆函数,函数poly返回多项式的系数。

327.2 非线性方程组的数值解法

用MATLAB求解线性方程组的解,在6.3中已介绍了基于矩阵变换的直接解法,除此方法之外,还有很多方法,比如,Jocabi迭代法、Gauss-Seidel迭代法和SOR(超松驰)迭代法等,这里不作详细介绍。可参阅有关文献。实际工程中得到的数学模型往往具有非线性的特点,得到其解析解比较困难。一般采用迭代法求解非线性方程组。比较常见的迭代方法有不动点迭代法、Newton迭代法和拟Newton迭代法等几种。本节仅介绍不动点迭代法。

设含有n个未知数和n个方程的非线性方程组记为:

- 134 -

第7章 计算方法的MATLAB实现

F(x)?0

其中,x为由n个未知数构成的向量,F为由n个函数构成的向量。

将方程组F(x)?0改写为便于迭代的等价形式:x??(x),由此得出不

动点迭代法的迭代公式:xk?1??(xk)。

k*k??k*如果得到的序列{x}满足limx?x,则x就是?的不动点。这样就可

以求出线性方程组的解(近似解)。

据此,编写不动点迭代法的M文件(文件名为example7_2): function s=example7_2(x,eps)

%用不动点迭代法求非线性方程组的解 %x为迭代初值,eps为允许误差值。 if nargin==1 eps=1e-6; elseif nargin<1 error return end

x1=example7_2a(x);% example7_2a是函数x??(x)的文件名。 while norm(x1-x)>=eps x=x1;

x1=example7_2a(x);%循环迭代 end s=x1; return

2?x12?11x1?x2?9?0例7-3 用不动点迭代法求方程组?的解。 2xx?x?6x?8?012?122?x1??(x12?x2?9)/11解:变形为? 2x?(xx?x?8)/6121?2首先创建函数代码(文件名为example7_2a.m): function y=example7_2a(x)

y(1)=(x(1)*x(1)+x(2)*x(2)+9)/(-11); y(2)=(x(1)*x(2)*x(2)+x(1)+8)/6; 再作图形,程序代码: clear;clc;

- 135 -

第7章 计算方法的MATLAB实现

ezplot('x1^2+11*x1+x2^2+9',[-12,6]); hold on

ezplot('x1*x2^2+x1-6*x2+8',[-12,6]); hold off

title('x1^2+11*x1+x2^2+9和x1*x2^2+x1-6*x2+8的图形')%修改标题 运行结果见图7-1:

图7-1

最后调用函数example7_2求方程组解: x=example7_2 ([0,0]) 运行结果:

x=

-1.0000 1.0000

2?x12?11x1?x2?9?0 这样就可以求得方程组?的一个解,从图7-1可2?x1x2?x1?6x2?8?02?x12?11x1?x2?9?0以看出,方程组?还有一个解,为了求得它,还需要对2?x1x2?x1?6x2?8?0原方程组作另外变形,这里不再作进一步的讨论。

- 136 -

第7章 计算方法的MATLAB实现

7.3 插值

插值计算在数据拟合和数据平滑等方面应用普遍。MATLAB提供了用最近邻插值、线性插值、三次样条插值、三次插值和FFT插值法进行一维、二维、三维和高维插值的函数。 7.3.1 一维插值

MATLAB中有两种一维插值,即多项式插值和基于FFT的插值。 ⒈ 多项式插值

函数interp1进行一维插值。一维插值是进行数据分析和曲线拟合的重要手段。interp1函数使用多项式技术,用多项式函数拟合所提供的数据,并计算目标插值点上的插值函数值,其最常用的语法形式是:

yi=interp1(x,y,xi,method)

x和y为给定数据的向量,长度相同。xi为包含要插值的点的构成的向量,method是一个可选的字符串,指定一种插值方法,包括:

●最近邻插值(method='nearest'):该方法将插值点的值设置为已知数据点中距离最近的点的值;

●线性插值(method='linear'):该方法用线性函数拟合每对数据点,并返回xi处的相关函数值;

●三次样条插值(method='spline'):该方法用三次样条函数拟合每对数据点,用spline函数在插值处进行三次样条插值;

●三次插值(method='pchip'或'cubic'):该方法用pchip函数对向量x和y进行分段三次Hermite插值。

这几种方法在速度、内存和平滑性等方面有所差别,使用时可以根据需要进行选择,包括:

◣最近邻插值是最快的方法,但是,利用它得到的结果平滑性最差; ◣线性插值比最近邻插值要占用更多的内存,运行时间略长。与最近邻法不同,它生成的结果是连续的,但是在顶点处有坡度变化;

◣三次样条插值的运行时间相对来说最长,内存消耗比三次插值略少。它生成的结果平滑性最好。但是,如果输入数据不很均匀,可能会得到意想不到结果;

◣三次插值需要更多内存,而且运行时间比最近邻插值和线性插值的长。但是,使用此法时,插值数据及其导数都是连续的。

例7-4 程序代码:

- 137 -

第7章 计算方法的MATLAB实现

x=1:10;

y=[1800 778 518 5000 980 588 2799 528 6700 598]; x1=1:0.1:10;

y1=interp1(x,y,x1,'nearest');%一维最近邻插值 plot(x1,y1)

y2=interp1(x,y,x1,'linear');%一维线性插值 hold on

plot(x1,y2,'color','r') hold off

运行结果见图7-2。

图7-2 一维最近邻插值和线性插值

例7-5 程序代码:

x=1:10;

y=[1800 778 518 5000 980 588 2799 528 6700 598]; plot(x,y); x1=1:0.1:10; hold on

y1=interp1(x,y,x1,'spline');%三次样条插值 plot(x1,y1,'color','r') hold off

运行结果见图7-3。

- 138 -

第7章 计算方法的MATLAB实现

图7-3 三次样条插值

⒉ 基于FFT的插值

函数interpft用基于FFT的方法进行一维插值。本方法计算包含周期函数值的向量的傅里叶变换。然后,它用更多的点计算逆傅里叶变换。该函数的调用形式为:

y=interpft(x,n)

其中,x是一个包含周期函数值的向量,这些值在等间隔的点上采集。n是样本大小。

7.3.2 二维插值

二维插值在图像处理和可视化方面有着很重要的应用。MATLAB用函数interp2进行二维插值。该函数的一般形式为:

ZI=interp2(X,Y,Z,XI,YI,method)

其中,Z是一个矩阵数组,包含二维函数的值,X和Y为大小相同的数组,包含相对于Z的给定值。XI和YI为包含插值点数据的矩阵,method表示插值方法,为可选参数。

MATLAB提供了三种不同的插值方法进行二维插值: ●最近邻插值(method='nearest'):该方法用分区域常数曲面拟合数据,插值点的值是最近点的值;

- 139 -

第7章 计算方法的MATLAB实现

●双线性插值(method='linear'):该方法用双线性曲面拟合数据点,插值点的值是四个最近的值的组合。本方法是分区域双线性的,比双三次插值法快,并且内存消耗更少;

●双三次插值(method='cubic'):该方法用双三次曲面拟合数据点,插值点的值是16个最近点的值的组合。本方法是分区域三次的,结果的平滑性比前面两种的都好。

注:所有这些方法都要求X和Y数据是单调的,即从点到点,要么总是递增的,要么总是递减的。应该用meshgrid函数准备这些矩阵。

例7-6 程序代码:

%低分辨率的peaks函数图形 [x,y]=meshgrid(-4:1:4); z=peaks(x,y); surf(x,y,z) 运行结果见图7-4。

图7-4 低分辨率的peaks函数图形

例7-7 程序代码:

[x,y]=meshgrid(-4:1:4); z=peaks(x,y);

[xI,yI]=meshgrid(-4:0.25:4);

zI=interp2(x,y,z,xI,yI,'nearest');%二维最近邻插值 surf(xI,yI,zI)

- 140 -

第7章 计算方法的MATLAB实现

运行结果见图7-5。

图7-5 二维最近邻插值

例7-8 程序代码:

[x,y]=meshgrid(-4:1:4); z=peaks(x,y);

[xI,yI]=meshgrid(-4:0.25:4);

zI=interp2(x,y,z,xI,yI,'linear');%%二维双线性插值,'linear'可省略. surf(xI,yI,zI) 运行结果见图7-6。

图7-6 二维双线性插值

- 141 -

第7章 计算方法的MATLAB实现

例7-9 程序代码:

[x,y]=meshgrid(-4:1:4); z=peaks(x,y);

[xI,yI]=meshgrid(-4:0.25:4);

zI=interp2(x,y,z,xI,yI,'cubic');%二维双三次插值 surf(xI,yI,zI) 运行结果见图7-7。

图7-7 二维双三次插值

7.3.3 多维插值

MATLAB提供了几种多维数据的插值函数,如表7-1中所示。

表7-1 多维数据的插值函数

函 数 interp3 interpn ndgrid 描 述 三维数据插值 多维数据插值 多维数据网格化 函数interp3进行三维插值。计算三维样本集V中数据点之间的值。该函数的一般形式为:

VI=interp3(X,Y,Z,V,XI,YI,ZI,method)

其中,X,Y和Z指定数据点;V包含与X,Y和Z对应的值;XI,YI和ZI

- 142 -

第7章 计算方法的MATLAB实现

为interp3函数对V中数据进行插值的点。对于超出范围的值,interp3函数返回NaN。method表示插值方法,为可选参数。

对于三维数据,有三种不同的插值方法。 ●最近邻插值(method='nearest'):该方法选择最近点的值; ●线性插值(method='linear'):该方法基于最近的8个点进行分区域线性插值;

●三次插值(method='cubic'):该方法基于最近的64个点进行分区域三次插值。

用interpn函数进行更高维数据的插值,该函数的常用形式为:

VI=interpn(X1,X2,X3,?,V,Y1,Y2,Y3,?,method)

其中,Y1,Y2,Y3, ?为interpn函数对V中数据进行插值的点。对于超出范围的值,interpn函数返回NaN。method表示插值方法,为可选参数。

高维数据插值,同样有最近邻插值、线性插值和三次插值三种方法。 用ndgrid函数为高维函数评价和插值生成数据数组。该函数将一系列输入向量指定的图域转换为一系列输出数组。第i维是输入向量xi的拷贝。

ndgrid函数的语法格式为:

[X1,X2,X3,?]= ndgrid(x1,x2,x3,?)

7.4 曲线拟合

所谓曲线拟合,就是利用两个或多个变量的离散点,用平滑曲线来拟合它们之间的关系。根据拟合方法的不同,有参数拟合和非参数拟合之分。参数拟合,曲线不要求通过所有点,采用最小二乘法;非参数拟合,要求曲线通过所有点,采用插值法。由于曲线拟合是数据分析最常见的任务之一,MATLAB提供了多种函数和工具来进行曲线拟合,另外还有曲线拟合工具箱。 7.4.1 最小二乘法

最小二乘法通过最小化残差的平方和来获得待定系数的估计。第i个数据点的残差定义为测量响应值yi和拟合响应值yi之间的差值,即ri?yi?yi,残差的平方和S????ri?1n2i??(yi?yi)2。

i?1n?常见的最小二乘法包括线性最小二乘、加权线性最小二乘、稳健最小二乘和非线性最小二乘等。求解非线性最小二乘问题的Gauss-Newton法和Levenberg-Marquart法是老牌算法。

- 143 -

第7章 计算方法的MATLAB实现

7.4.2 多项式曲线拟合

用polyfit函数计算拟合数据集的多项式在最小二乘意义上的系数,调用形式为:

p=polyfit(x,y,n)

x和y是包含要拟合的x和y数据的向量,n是多项式的阶次。

例7-10 程序代码:

x=1:10;

y=[1 3 31 133 381 871 1723 3081 5113 8011];

P=polyfit(x,y,4)%多项式曲线拟合,返回多项式的系数。 运行结果:

P =

1.0000 -2.0000 -0.0000 1.0000 1.0000

7.4.3 相关工具

MATLAB支持用基本拟合界面进行拟合。该拟合界面具有拟合快速,操作简便的优势。它具有如下功能:

●使用样条插值、分段三次艾尔米特插值(PCHIP)或者是1到10阶的多项式插值进行数据拟合;

●利用一组数据可以同时作多条拟合曲线; ●可以绘制残差图; ●可以检查拟合结果;

●可以对拟合进行内插或外推;

●用拟合结果和标准残差在图中进行注释;

●可以将拟合和计算结果保存到MATLAB工作空间。 下面结合一个具体的例子加以说明。

例7-11 某商店某种产品的销售量如表7-2所示。

表7-2 某产品销售量资料

年份 2001 2002 2003 2004 2005 2006 2007 2008 2009 销售量(万件) 10.0 18.0 25.0 30.5 35.0 38.0 40.0 39.5 38.0 请用多项式曲线拟合上述数据。 按照下面的步骤进行操作。

- 144 -

第7章 计算方法的MATLAB实现

⑴用上述数据绘散点图和线形图的组合图(见图7-8); 程序代码:

%说明多项式曲线拟合界面的使用方法 x=2001:2009;

y=[10 18 25 30.5 35 38 40 39.5 38]; scatter(x,y,'filled','r')%绘散点图 hold on plot(x,y) hold off

图7-8 散点图和线形图的组合图

⑵在图形窗口的“Tools”菜单中单击“Basic Fitting”菜单选项; ⑶两次单击“→”按钮。

打开的曲线拟合界面“Basic Fitting”对话框如图7-9所示。 基本拟合界面中各选项的功能包括:

●Select data下拉式列表框:该列表框中显示了图形窗口中图形用到的所有数据集的名称,在其中选择要拟合的数据。一次只能选择一组数据,但在一组数据里可以同时拟合多条曲线。

●Center and scale x data单选钮:选择此项以后,数据中心化为具有0均值,比例化为具有单位标准差。对数据进行中心化和比例化,可以提高后面数值计算的精度。

- 145 -

第7章 计算方法的MATLAB实现

●Plot fits:使用本面板,可以用图形查看当前数据集的一种或多种拟合结果。

●Check to display fits on figure:选择当前数据集的拟合类型。有两种拟合类型可供选择,即插值和多项式。进行三次样条插值使用Spline函数,保形(shape-preserving)插值使用pchip函数(三次插值)。多项式拟合使用polyfit函数。可以选择多种拟合类型。

●Show equations单选钮:选此项,在拟合图形上显示方程。

●Plot residuals单选钮:选此项,显示拟合曲线的残差,可用条形图、散点图或线形图显示。

●Show norm of residuals单选钮:选此项,显示残差的范数。残差的范数是表示拟合优度的一个统计量,值越小,表示拟合程度越高。用norm函数进行计算,即norm(V,2),其中V为残差向量。

图7-9 基本拟合界面

●Numerical results方框:使用该面板,可以在不绘拟合图的情况下探察对当前数据集进行单次拟合的数值结果。

●Fit:选择拟合当前数据集的方程。拟合结果显示在菜单下面的列表框中。注意,在该菜单中选择方程并不影响“Plot fits”面板的状态。所以。如果试图在数据散点图中显示拟合曲线,可能需要在“Plot fits”面板中选择有关的核选

- 146 -

第7章 计算方法的MATLAB实现

框。

●Coefficients and norm of residuals:显示“Fit”中选择的方程的计算结果。 ●Save to workspace?:打开一个对话框,使用它将拟合结果保存到工作空间变量中。

●Find Y=f(X):对当前的拟合进行内插或外推。 ●Enter value(s):输入一个MATLAB表达式,进行拟合计算。单击“Evaluate”按钮以后计算表达式,结果显示在有关的表格中。当前拟合显示在“Fit”菜单中。

●Save to workspace?:打开一个对话框,使用它将拟合结果保存到工作空间变量中。

●Plot evaluated results:选择此项,计算结果显示到图中的数据点上。 ⑷在基本拟合界面中作以下设置(见图7-10): ●用二次多项式拟合数据; ●在拟合图上显示方程;

●将拟合残差作为条形图显示,并将残差的图形作为子图显示; ●显示残差的范数。

当前数据集

用二次多项 式拟合数据

显示方程

绘残差图

显示残差 的范数

图7-10 进行选项设置

⑸利用“Plot fits”面板可以可视地探察当前数据集的多个拟合图形。为了进行比较,通过选择合适的核选框来拟合数据的其他方程。如果某个方程生成

- 147 -

第7章 计算方法的MATLAB实现

的结果在数值上不精确,MATLAB会显示一个警告信息。此时,应该选择“Center and scale x data” 核选框来改进数值精度。

⑹最后将拟合结果和残差显示在图7-11中。

图例显示了数据集和方程的名称。如果图例覆盖了图形的一部分,可以通过单击和拖拉操作将它移到其他地方。

图7-11 拟合结果和残差图

⑺可以指定一个包含x值的向量,计算这些位置上的拟合值。将该向量输入到“Evaluate”按钮左边的文本框中,然后单击“Evaluate”按钮。例如,输入向量2010:2015后,再单击“Evaluate”按钮,即可得到2010年到2015年的销售量的估计。如图7-12所示。

⑻选择“Plot evaluated results”核选框,显示当前图形中对应当前数据的

- 148 -

第7章 计算方法的MATLAB实现

计算值,如图7-13所示

图7-12 显示x值和对应的拟合值

图7-13 拟合结果和对应的残差图

- 149 -

第7章 计算方法的MATLAB实现

7.5 数值微分

利用MATLAB函数,可以实现数值微分、梯度运算。 7.5.1 数值微分运算

5.2一节中用diff函数实现了符号微分运算。实际上,diff函数还可以实现数值微分运算,即求相邻元素之间的差值。diff函数的调用格式如下:

Y=diff(X,n,dim)

n和dim均为大于或等于1的整数, n和dim的默认值均为1。当dim大于X的维数时,将返回空数组;当n大于或等于X的第dim维的长度时,也返回空数组。

●若X是向量,则可省略dim,diff(X)返回X的一阶差分;diff(X,n)(n大于1且小于X的长度)返回X的n阶差分(等价于递归n次一阶差分)。

●若X是p行q列矩阵,则diff(X)返回X的每列元素的一阶差分;diff(X,n)(n大于1且小于p)返回X的每列元素的n阶差分;diff(X,n,2)(n大于1且小于q)返回X的每行元素的n阶差分。

●若X是N1?N2???Nm数组,则diff(X,n,dim)(1?n?Ndim)返回X的第dim维元素的n阶差分。

例7-12 程序代码

clear;clc;

x(:,:,1)=[1 2 3;4 5 6;7 8 9];

x(:,:,2)=[0.1 0.2 0.3;0.4 0.5 0.6;0.7 0.8 0.9] D11=diff(x) D12=diff(x,1,2) D13=diff(x,1,3) D21=diff(x,2) 运行结果:

x(:,:,1) =

1 2 3 4 5 6 7 8 9 x(:,:,2) =

0.1000 0.2000 0.3000 0.4000 0.5000 0.6000 0.7000 0.8000 0.9000

- 150 -

第7章 计算方法的MATLAB实现

D11(:,:,1) =

3 3 3 3 3 3 D11(:,:,2) =

0.3000 0.3000 0.3000 0.3000 0.3000 0.3000 D12(:,:,1) = 1 1 1 1 1 1 D12(:,:,2) =

0.1000 0.1000 0.1000 0.1000 0.1000 0.1000 D13 =

-0.9000 -1.8000 -2.7000 -3.6000 -4.5000 -5.4000 -6.3000 -7.2000 -8.1000 D21(:,:,1) =

0 0 0 D21(:,:,2) = 1.0e-015 *

-0.1110 0.0555 0.0555

7.5.2 数值梯度运算

用gradient函数进行数值梯度运算。gradient函数的调用格式如下: Fx=gradient(F) [Fx,Fy]=gradient(F)

[Fx,Fy,Fz,...]=gradient(F) [...]=gradient(F,h)

[...]=gradient(F,h1,h2,...) 例7-13 程序代码

clear;clc;x0=linspace(-2,2,16);y0=linspace(-2,2,21); [x,y]=meshgrid(x0,y0);

z=x.*exp(-x.^2-y.^2);[Zx,Zy]=gradient(z,4/15,4/20); contour(x0,y0,z)%绘制等高线图

hold on,quiver(x0,y0,Zx,Zy)%绘制梯度向量(箭头)图 hold off

运行结果见图7-14:

- 151 -

第7章 计算方法的MATLAB实现

图7-14 梯度向量(箭头)图和等高线图

习题7

1、完成实验指导书中的实验六。

- 152 -

本文来源:https://www.bwwdw.com/article/nvvr.html

Top