Matlab仿真技术

乔世坤

目录

  • 1 实验一Matlab基础与入门
    • 1.1 Matlab简介
    • 1.2 变量与数值
    • 1.3 矩阵运算
    • 1.4 数组运算
    • 1.5 常用数学函数
    • 1.6 Matlab帮助系统
    • 1.7 实验内容
    • 1.8 思考题
  • 2 实验二 Matlab程序设计基础
    • 2.1 M文件
    • 2.2 Matlab程序流控制
    • 2.3 实验内容
    • 2.4 思考题
  • 3 实验三Matlab图形绘制
    • 3.1 二维曲线的绘制
    • 3.2 三维曲线的绘制
    • 3.3 实验内容
    • 3.4 思考题
  • 4 MATLAB数值计算与符号运算
    • 4.1 线性代数中的应用
    • 4.2 多项式运算
    • 4.3 数据分析与统计
    • 4.4 功能函数
    • 4.5 常微分方程的数值求值
    • 4.6 符号运算
    • 4.7 Matlab数值计算部分实验题
    • 4.8 Matlab符号运算部分实验题
    • 4.9 Matlab程序设计部分实验题
    • 4.10 思考题
  • 5 Simulink仿真基础
    • 5.1 Simulink概述
    • 5.2 Simulink建模与仿真
    • 5.3 子系统及其封装技术
    • 5.4 SIMULINK模块库简介
    • 5.5 Simulink仿真基础实验题
    • 5.6 Simulink仿真应用实验题
    • 5.7 思考题
  • 6 Matlab在电路分析中的应用
    • 6.1 Matlab在电路中的仿真应用
    • 6.2 数字逻辑电路仿真
    • 6.3 实验内容
    • 6.4 思考题
  • 7 MATLAB在信号与系统中的应用
    • 7.1 连续时间信号及其表示
    • 7.2 线性时不变系统
    • 7.3 线性时不变系统的时域分析
    • 7.4 线性时不变系统的频域分析
    • 7.5 实验内容
    • 7.6 思考题
  • 8 Matlab在数字信号处理中的应用
    • 8.1 信号的表示与信号的基本运算
    • 8.2 实验内容
    • 8.3 思考题
  • 9 MATLAB在通信原理中的应用
    • 9.1 脉冲编码调制仿真
    • 9.2 实验内容
功能函数
  • 1 文档
  • 2 PPT


4.4 功能函数

Matlab为用户提供了有关函数功能和数值分析的函数,帮助用户解决一些函数的极值、积分、微分等问题。

4.4.1函数的表示与绘图

1. 函数的表示

函数除了前面已学习的M文件形式表示外,还可以用内联函数和匿名函数形式表示。由于内联将在未来的版本中删除,下面简介匿名函数(Anonymous Functions。匿名函数是未存储在程序文件中的函数,但与数据类型为函数句柄变量相关联。匿名函数可以接受输入和返回输出,就像标准的函数一样。但它可以只包含一个可执行语句。例如:

>> sqr = @(x) x.^2;

>> sqr(3)

ans =

     9

>> a=1;b=2;c=3;

>> parabola = @(x) a*x.^2 + b*x + c;

>> parabola(2)                       

ans =

    11

2. 函数的绘图

函数的绘图函数包括:ezplot(二维函数绘图)、ezcontour (等高线绘图)ezplot3(三维函数绘图)、ezpolar(极坐标函数绘图)、ezmesh(三维网格绘图)、fplot(绘图函数)等,这些函数用法简单相似,其中fplot绘图细致,并确保在输出的图形中表示出所有的奇异点。ezplot是用于绘制单变量函数图的简便命令。


>> f = @(x)2*exp(-x).*sin(x);

>> fplot(f,[0 8]) ;

>> ezplot(f,[0 8]);


4-6应用fplot函数绘图    4-7 应用ezplot函数绘图


4.4.2函数的零极点分析

    求函数的最小值、零点是工程上常见问题,Matlab提供了这类函数。

1. 求一元函数最小值

    求一元函数在给定区间内的最小值可以用函数fminbnd()来实现。格式如下

x=fminbnd(fun ,x1,x2)

x=fminbnd(fun ,x1,x2, options)

[x,fval]=fminbnd(……)

说明在区间[x1 x2]内寻找函数最小值。funM文件的函数句柄或匿名函数x为对应最小值的自变量取值,使用options选项来指定优化器的参数。输出变量fval返回函数最小值。注意:函数fminbnd只能用于连续函数,只给出局部最小值,当最小值在指定区间的边界上时,函数收敛速度很慢。fminbnd只用于实数变量。

[4-19]求正弦函数在[0 10]区间内的最小值。

>> fminbnd(@sin,0,10)                             %计算sin(4.7124)验证

ans =

    4.7124

结果等于4.7124,即3*pi/2。函数可以使用optimset来设定函数参数。

>> fminbnd(@sin,0,10,optimset('Display','iter'))

  Func-count     x         f(x)         Procedure

    1        3.81966    -0.627289         initial

    2        6.18034    -0.102664                 golden

    3        2.36068     0.703928        golden

    4        4.62594    -0.996266          parabolic

    5        4.74595    -0.999437         parabolic

    6        4.71433    -0.999998          parabolic

    7        4.71238           -1          parabolic

    8        4.71242           -1          parabolic

    9        4.71235           -1          parabolic

 优化已终止:

 当前的x 满足使用 1.000000e-04 OPTIONS.TolX 的终止条件。

ans =

    4.7124

2. 求多元函数最小值

求多元函数最小值可以用函数fminsearch()来实现。使用该函数时必须指定初始x0,并返回它附近的局部最小值。格式如下:

x=fminbnd(fun ,x0, options)

x=fminbnd(fun ,x0, options)

[x,fval]=fminbnd(……)

说明:在初值x0附近寻找函数最小值。funM文件的函数句柄或匿名函数,x为对应最小值的自变量取值。使用options选项来指定优化器的参数。输出变量fval返回函数最小值。


1)首先定义函数。

function f = myfun(x,a)

f = x(1)^2 + a*x(2)^2;

2)然后执行如下命令。

>> a = 1.5;

>> x = fminsearch(@(x) myfun(x,a),[0,1])

x =

  1.0e-03 *

    0.9298   0.0312

或执行如下命令。

>> a = 1.5;

>> f =@(x)( x(1)^2 + a*x(2)^2);

>> x = fminsearch(f,[0,1])

x =

  1.0e-03 *

    0.9298   0.0312

3.求一元函数的零点

求一元函数的零点可以用函数fzero()来实现。格式如下

x=fzero (fun ,x0)

x=fzero (fun ,[x0,x1])

x=fzero (fun ,[x0,x1],options)

[x,fval]=fzero (……)

说明:只给出x0,表示在x0附近寻找函数的零点,给出[x0,x1]区间表示在区间内寻找函数的零点,返回对应零点的自变量值。使用options选项来指定优化器的参数,输出变量fval返回函数值。fzero只能返回一个局部零点。

例如:

>> x=fzero(@cos,2)

x =

    1.5708

>> [x,y]=fzero(@cos,-1)

x =

   -1.5708

y =

  6.1232e-17

以上三个函数都可以使用options选项,options可以使用函数optimset设定。options=optimset'param1',value1,'param2',value2, ……)用参数名及其对应的参数值设定优化器的参数。返回值options是结构体数据。

4.4.3函数的数值积分与微分

Matlab提供了quadquadltrapzdblquad函数来计算函数的数值积分。数值积分方法实际上是计算函数曲线下的面积。quad函数应用的是自适应递归辛普森(Simpson)方法求定积分,用于低阶数值积分;quadl函数采用比前者阶数更高的自适应定积分算法,采用了洛巴托(Lobatto)积分计算法则。quadlquad计算精度高。trapz采用计算若干梯形面积和来计算函数的近似积分。dblquad是求双重积分函数。下面举例说明函数的使用。

函数的微分也是进行科学计算的重要组成部分Matlab提供了diff函数可以分别实现函数的一阶微分与n阶微分的计算。

Matlab中还可以应用gradient函数来计算梯度


>> f=@(x)sin(x)./x

f =

    @(x)sin(x)./x

>> q=quad(f,0,pi)

q =

    1.8519

>> q=quadl(@(x)2./(1+x.^2),-1,1)

q =

    3.1416


>> f=@(x)3.*x.^2-1;

>> x=[2 4]; y=f(x);

>> trapz(x,y)

ans =

    58


>>s=dblquad('y*sin(x)+x*cos(y)',pi,2*pi,0,pi)

s =

   -9.8696


>> x=0:0.01:3; y=exp(x);

>> x1=x(1:length(x)-1);

>> y1=diff(y)./diff(x);


a=-2:0.2:2;

[x,y]=meshgrid(a);

z=exp(-(x.^2+y.^2+0.5*x.*y));           

[px,py]=gradient(z,0.2);                             %梯度场

quiver(a,a,px,py);                                      %画出梯度场

4-8 梯度场

程序结果如图4-8所示,图中箭头的方向代表梯度的方向箭头的大小代表梯度的模。