MATLAB程序设计教程(7)——MATLAB解方程与函数极值

第7章MATLAB解方程与函数极值

7.1  线性方程组求解

7.2  非线性方程数值求解

7.3  常微分方程初值问题的数值解法

7.4 函数极值

7.1线性方程组求解

7.1.1 直接解法

1.利用左除运算符的直接解法

对于线性方程组Ax=b,可以利用左除运算符“/”求解:

x=A/b

例7-1  用直接解法求解下列线性方程组。

命令如下:

A=[2,1,-5,1;1,-5,0,7;0,2,1,-1;1,6,-1,-4];

b=[13,-9,6,0]’;

x=A/b

2.利用矩阵的分解求解线性方程组

矩阵分解是指根据一定的原理用某种算法将一个矩阵分解成若干个矩阵的乘积。常见的矩阵分解有LU分解、QR分解、Cholesky分解,以及Schur分解、Hessenberg分解、奇异分解等。

(1) LU分解

矩阵的LU分解就是将一个矩阵表示为一个交换下三角矩阵和一个上三角矩阵的乘积形式。线性代数中已经证明,只要方阵A是非奇异的,LU分解总是可以进行的。

MATLAB提供的lu函数用于对矩阵进行LU分解,其调用格式为:

[L,U]=lu(X):产生一个上三角阵U和一个变换形式的下三角阵L(行交换),使之满足X=LU。注意,这里的矩阵X必须是方阵。

[L,U,P]=lu(X):产生一个上三角阵U和一个下三角阵L以及一个置换矩阵P,使之满足PX=LU。当然矩阵X同样必须是方阵。

实现LU分解后,线性方程组Ax=b的解x=U/(L/b)或x=U/(L/Pb),这样可以大大提高运算速度。

例7-2  用LU分解求解例7-1中的线性方程组。

命令如下:

A=[2,1,-5,1;1,-5,0,7;0,2,1,-1;1,6,-1,-4];

b=[13,-9,6,0]’;

[L,U]=lu(A);

x=U/(L/b)

或采用LU分解的第2种格式,命令如下:

[L,U ,P]=lu(A);

x=U/(L/P*b)

(2) QR分解

对矩阵X进行QR分解,就是把X分解为一个正交矩阵Q和一个上三角矩阵R的乘积形式。QR分解只能对方阵进行。MATLAB的函数qr可用于对矩阵进行QR分解,其调用格式为:

[Q,R]=qr(X):产生一个一个正交矩阵Q和一个上三角矩阵R,使之满足X=QR。

[Q,R,E]=qr(X):产生一个一个正交矩阵Q、一个上三角矩阵R以及一个置换矩阵E,使之满足XE=QR。

实现QR分解后,线性方程组Ax=b的解x=R/(Q/b)或x=E(R/(Q/b))。

例7-3  用QR分解求解例7-1中的线性方程组。

命令如下:

A=[2,1,-5,1;1,-5,0,7;0,2,1,-1;1,6,-1,-4];

b=[13,-9,6,0]’;

[Q,R]=qr(A);

x=R/(Q/b)

或采用QR分解的第2种格式,命令如下:

[Q,R,E]=qr(A);

x=E*(R/(Q/b))

(3) Cholesky分解

如果矩阵X是对称正定的,则Cholesky分解将矩阵X分解成一个下三角矩阵和上三角矩阵的乘积。设上三角矩阵为R,则下三角矩阵为其转置,即X=R’R。MATLAB函数chol(X)用于对矩阵X进行Cholesky分解,其调用格式为:

R=chol(X):产生一个上三角阵R,使R‘R=X。若X为非对称正定,则输出一个出错信息。

[R,p]=chol(X):这个命令格式将不输出出错信息。当X为对称正定的,则p=0,R与上述格式得到的结果相同;否则p为一个正整数。如果X为满秩矩阵,则R为一个阶数为q=p-1的上三角阵,且满足R’R=X(1:q,1:q)。

实现Cholesky分解后,线性方程组Ax=b变成R‘Rx=b,所以x=R/(R’/b)。

例7-4  用Cholesky分解求解例7-1中的线性方程组。

命令如下:

A=[2,1,-5,1;1,-5,0,7;0,2,1,-1;1,6,-1,-4];

b=[13,-9,6,0]’;

R=chol(A)

??? Error using ==> chol

Matrix must be positive definite

命令执行时,出现错误信息,说明A为非正定矩阵。

7.1.2 迭代解法

迭代解法非常适合求解大型系数矩阵的方程组。在数值分析中,迭代解法主要包括 Jacobi迭代法、Gauss-Serdel迭代法、超松弛迭代法和两步迭代法。

1.Jacobi迭代法

对于线性方程组Ax=b,如果A为非奇异方阵,即aii≠0(i=1,2,…,n),则可将A分解为A=D-L-U,其中D为对角阵,其元素为A的对角元素,L与U为A的下三角阵和上三角阵,于是Ax=b化为:

x=D-1(L+U)x+D-1b

与之对应的迭代公式为:

x(k+1)=D-1(L+U)x(k)+D-1b

这就是Jacobi迭代公式。如果序列{x(k+1)}收敛于x,则x必是方程Ax=b的解。

Jacobi迭代法的MATLAB函数文件Jacobi.m如下:

function [y,n]=jacobi(A,b,x0,eps)

if nargin==3

eps=1.0e-6;

elseif nargin<3

error

return

end

D=diag(diag(A));    %求A的对角矩阵

L=-tril(A,-1);       %求A的下三角阵

U=-triu(A,1);       %求A的上三角阵

B=D/(L+U);

f=D/b;

y=B*x0+f;

n=1;                  %迭代次数

while norm(y-x0)>=eps

x0=y;

y=B*x0+f;

n=n+1;

end

例7-5  用Jacobi迭代法求解下列线性方程组。设迭代初值为0,迭代精度为10-6。

在命令中调用函数文件Jacobi.m,命令如下:

A=[10,-1,0;-1,10,-2;0,-2,10];

b=[9,7,6]’;

[x,n]=jacobi(A,b,[0,0,0]’,1.0e-6)

2.Gauss-Serdel迭代法

在Jacobi迭代过程中,计算时,已经得到,不必再用,即原来的迭代公式Dx(k+1)=(L+U)x(k)+b可以改进为Dx(k+1)=Lx(k+1)+Ux(k)+b,于是得到:

x(k+1)=(D-L)-1Ux(k)+(D-L)-1b

该式即为Gauss-Serdel迭代公式。和Jacobi迭代相比,Gauss-Serdel迭代用新分量代替旧分量,精度会高些。

Gauss-Serdel迭代法的MATLAB函数文件gauseidel.m如下:

function [y,n]=gauseidel(A,b,x0,eps)

if nargin==3

eps=1.0e-6;

elseif nargin<3

error

return

end

D=diag(diag(A));    %求A的对角矩阵

L=-tril(A,-1);      %求A的下三角阵

U=-triu(A,1);       %求A的上三角阵

G=(D-L)/U;

f=(D-L)/b;

y=G*x0+f;

n=1;                  %迭代次数

while norm(y-x0)>=eps

x0=y;

y=G*x0+f;

n=n+1;

end

例7-6  用Gauss-Serdel迭代法求解下列线性方程组。设迭代初值为0,迭代精度为10-6。

在命令中调用函数文件gauseidel.m,命令如下:

A=[10,-1,0;-1,10,-2;0,-2,10];

b=[9,7,6]’;

[x,n]=gauseidel(A,b,[0,0,0]’,1.0e-6)

例7-7  分别用Jacobi迭代和Gauss-Serdel迭代法求解下列线性方程组,看是否收敛。

命令如下:

a=[1,2,-2;1,1,1;2,2,1];

b=[9;7;6];

[x,n]=jacobi(a,b,[0;0;0])

[x,n]=gauseidel(a,b,[0;0;0])

7.2非线性方程数值求解

7.2.1 单变量非线性方程求解

在MATLAB中提供了一个fzero函数,可以用来求单变量非线性方程的根。该函数的调用格式为:

z=fzero(‘fname’,x0,tol,trace)

其中fname是待求根的函数文件名,x0为搜索的起点。一个函数可能有多个根,但fzero函数只给出离x0最近的那个根。tol控制结果的相对精度,缺省时取tol=eps,trace指定迭代信息是否在运算中显示,为1时显示,为0时不显示,缺省时取trace=0。

例7-8  求f(x)=x-10x+2=0在x0=0.5附近的根。

步骤如下:

(1) 建立函数文件funx.m。

function fx=funx(x)

fx=x-10.^x+2;

(2) 调用fzero函数求根。

z=fzero(‘funx’,0.5)

z =

0.3758

7.2.2 非线性方程组的求解

对于非线性方程组F(X)=0,用fsolve函数求其数值解。fsolve函数的调用格式为:

X=fsolve(‘fun’,X0,option)

其中X为返回的解,fun是用于定义需求解的非线性方程组的函数文件名,X0是求根过程的初值,option为最优化工具箱的选项设定。最优化工具箱提供了20多个选项,用户可以使用optimset命令将它们显示出来。如果想改变其中某个选项,则可以调用optimset()函数来完成。例如,Display选项决定函数调用时中间结果的显示方式,其中‘off’为不显示,‘iter’表示每步都显示,‘final’只显示最终结果。optimset(‘Display’,‘off’)将设定Display选项为‘off’。

例7-9  求下列非线性方程组在(0.5,0.5) 附近的数值解。

(1) 建立函数文件myfun.m。

function q=myfun(p)

x=p(1);

y=p(2);

q(1)=x-0.6*sin(x)-0.3*cos(y);

q(2)=y-0.6*cos(x)+0.3*sin(y);

(2) 在给定的初值x0=0.5,y0=0.5下,调用fsolve函数求方程的根。

x=fsolve(‘myfun’,[0.5,0.5]’,optimset(‘Display’,’off’))

x =

0.6354

0.3734

将求得的解代回原方程,可以检验结果是否正确,命令如下:

q=myfun(x)

q =

1.0e-009 *

0.2375    0.2957

可见得到了较高精度的结果。

7.3常微分方程初值问题的数值解法

7.3.1 龙格-库塔法简介

7.3.2 龙格-库塔法的实现

基于龙格-库塔法,MATLAB提供了求常微分方程数值解的函数,一般调用格式为:

[t,y]=ode23(‘fname’,tspan,y0)

[t,y]=ode45(‘fname’,tspan,y0)

其中fname是定义f(t,y)的函数文件名,该函数文件必须返回一个列向量。tspan形式为[t0,tf],表示求解区间。y0是初始状态列向量。t和y分别给出时间向量和相应的状态向量。

例7-10  设有初值问题,试求其数值解,并与精确解相比较(精确解为y(t)=)。

(1) 建立函数文件funt.m。

function yp=funt(t,y)

yp=(y^2-t-2)/4/(t+1);

(2) 求解微分方程。

t0=0;tf=10;

y0=2;

[t,y]=ode23(‘funt’,[t0,tf],y0);   %求数值解

y1=sqrt(t+1)+1;             %求精确解

t’

y’

y1′

y为数值解,y1为精确值,显然两者近似。

例7-11  求解著名的Van der Pol方程。

例7-12  有Lorenz模型的状态方程,试绘制系统相平面图。

7.4函数极值

MATLAB提供了基于单纯形算法求解函数极值的函数fmin和fmins,它们分别用于单变量函数和多变量函数的最小值,其调用格式为:

x=fmin(‘fname’,x1,x2)

x=fmins(‘fname’,x0)

这两个函数的调用格式相似。其中fmin函数用于求单变量函数的最小值点。fname是被最小化的目标函数名,x1和x2限定自变量的取值范围。fmins函数用于求多变量函数的最小值点,x0是求解的初始值向量。

MATLAB没有专门提供求函数最大值的函数,但只要注意到-f(x)在区间(a,b)上的最小值就是f(x)在(a,b)的最大值,所以fmin(f,x1,x2)返回函数f(x)在区间(x1,x2)上的最大值。

例7-13  求f(x)=x3-2x-5在[0,5]内的最小值点。

(1) 建立函数文件mymin.m。

function fx=mymin(x)

fx=x.^3-2*x-5;

(2) 调用fmin函数求最小值点。

x=fmin(‘mymin’,0,5)

x=

0.8165

喜欢 (0)or分享 (0)

matlab求函数极值教程,MATLAB程序设计教程(7)—MATLAB解方程与函数极值相关推荐

  1. matlab 解函数方程,MATLAB程序设计教程(7)—MATLAB解方程与函数极值

    MATLAB程序设计教程(7)--MATLAB解方程与函数极值 第7章MATLAB解方程与函数极值 7.1  线性方程组求解 7.2  非线性方程数值求解 7.3  常微分方程初值问题的数值解法 7. ...

  2. matlab解方程教程,MATLAB程序设计教程(7)—MATLAB解方程与函数极值

    第7章 MATLAB解方程与函数极值 7.1 线性方程组求解 7.2 非线性方程数值求解 7.3 常微分方程初值问题的数值解法 7.4 函数极值 7.1 线性方程组求解 7.1.1 直接解法 1.利用 ...

  3. matlab计算原点矩,关于用matlab求样本均值方差以及k阶原点矩的matlab程序

    关于用matlab求样本均值方差以及k阶原点矩的matlab 程序 关于用matlab求样本均值和方差以及matlab程 序 1n1. 样本均值,公式xX,(其中X为样本).程序如下: ,i,1in ...

  4. c语言程序设计5*5矩阵求出,实用C语言程序设计教程5数组和矩阵ppt221.ppt

    实用C语言程序设计教程5数组和矩阵ppt221 C语言程序设计 - 第5章 数组和矩阵 第5章 构造数据-- 数组和矩阵 本章教学目标 1.理解C语言中数组的本质及其在内存的存储结构 2.应用数组表示 ...

  5. jquery系列教程7-自定义jquery插件全解:对象函数、全局函数、选择器

    点击打开: jquery系列教程1-选择器全解 jquery系列教程2-style样式操作全解 jquery系列教程3-DOM操作全解 jquery系列教程4-事件操作全解 jquery系列教程5-动 ...

  6. c语言程序设计函数6,C语言程序设计_哈工大(6):函数.pdf

    圳 职 业 技 术 学 院Shenzhen Polytechnic 六单元 :函数 教学内容 函数 教学目标 应知 了解模块化程序的结构 掌握函数的定义方法 掌握函数的调用和参数传递 了解预处理 重点 ...

  7. MATLAB学习笔记(七)——MATLAB解方程与函数极值

    (一)线性方程组求解 包含n个未知数,由n个方程构成的线性方程组为: 其矩阵表示形式为: 其中 一.直接求解法 1.左除法 x=A\b; 如果A是奇异的,或者接近奇异的.MATLAB会发出警告信息的. ...

  8. matlab解方程最值点,MATLAB解方程与函数极值

    1.线性方程数值求解 主要是用到了计算方法里的LU分解等不过是加快了求解速度而已相对于inv(A)*b或者A\b 2.非线性方程数值求解 1 单变量非线性方程求解 在MATLAB中提供了一个fzero ...

  9. matlab 求旁瓣,主瓣、栅瓣和旁瓣(MATLAB源代码 解释)

    一.雷达天线 雷达天线可用方向增益.功率增益和有效孔径三个参数来表征.在归一化的时候,功率增益图和方向图统称为天线辐射方向图. 发射天线的方向性可定义为:最大辐射密度/平均辐射密度,孔径效率越高越高, ...

最新文章

  1. 【图论专题】欧拉路径和欧拉回路
  2. C#[Serializable]在C#中的作用-NET 中的对象序列化
  3. 区分主机 cpu 计算机及计算机系统,小学计算机教案(二)
  4. php gd库画线,[PHP] GD库(十)绘制线段与圆弧 imageline、imagesetstyle 与 imagearc 函数...
  5. 特斯拉超级充电桩亮相:充电5分钟能跑百公里
  6. 在一个Java版本上运行Eclipse IDE,但在另一个Java版本上运行
  7. MVVM  MVVM是Model-View-ViewModel的简写
  8. linux安装自带mysql吗_Linux安装mysql8
  9. 【Ajax技术】JQuery的应用与高级调试技巧
  10. 使用Reloader实现更新configmap后自动重启pod
  11. 503组史诗电影预告片音效合集动作破坏冲击紧张大气音效库 Hybrid Trailer
  12. android fragment 设置透明,DialogFragment背景透明设置
  13. seo关键词扩展-自动关键词拓展软件免费下载
  14. 【华为云技术分享】让电变“机灵”,华为云与开发者共同打造智慧用电
  15. 【python】cholesky
  16. 作为前端,如何帮帝都的朋友租到合适的房子
  17. 沪漂5年,工作这点事儿
  18. C++20 barrier
  19. 央视《家有妙招》整理版,共125招,值得永远收藏
  20. ERROR:Xst:899

热门文章

  1. 高瓴资本领投,国仪量子宣布完成B轮数亿元大笔融资
  2. JavaScript split()方法
  3. web前端 html+css+javascript网页设计实例 水果网站制作
  4. 中合国创杯2017年创客中国互联网+创新创业大赛项目初筛完成
  5. 如何实现从抖音内跳转到微信关注页面?
  6. Android获取手机图片
  7. 点击咨询弹出扣扣;聊天对话框
  8. Kubernetes(k8s)集群搭建,完整无坑,不需要科学上网~
  9. BFS——山峰与山谷
  10. Java企业级开发框架(三):changelog——0.9.0-SNAPSHOT