Simulink入门(三)

1.曲面图的绘制

 

•曲面图的绘制由surf指令完成,该指令的调用格式与mesh指令类似,具体如下:

•(1)surf (X,Y,Z)

•(2)surf (Z)

•(3)surf (X,Y,Z,C)

•(4)surf(X,Y,Z,’PropertyName’,PropertyValue,…)

•与mesh指令不同的是,mesh指令所绘制的图形是网格划分的曲面图,而surf指令绘制得到的是平滑着色的三维曲面图,着色的方式是在得到相应的网格点后,对每一个网格依据该网格所代表的节点的色值(由变量C控制)来定义这一网格的颜色。

 

•采用surf命令实现曲面的绘制,程序如下:

•clc,clear,closeall

•X = -10:1:10; 

•Y = -10:1:10;

•[X,Y] = meshgrid(X,Y);

•Z = - X.^2 - Y.^2 + 10;

•surf(X,Y,Z)

•xlabel('x')

•ylabel('y')

•zlabel('z')

•axis tight

•colormap(jet)

•shading interp

•set(gca,'Ydir','reverse');

•set (gcf, 'color', 'w')

 

Simulink入门(三)

 

 

2. 特殊图形绘制

•MATLAB对于不同的三维曲面绘制,提供了不同的画图函数,例如slice切片函数、quiver3三维箭头标记函数、sphere等等,因此MATLAB丰富的图形可视化工具箱函数应用相当广泛。

 

 

•空间曲线及其运动方向的表现,编程如下:

•clc,clear,closeall

•t=0:0.1:1.5;

•Vx=2*t;

•Vy=2*t.^2;

•Vz=6*t.^3-t.^2;

•x=t.^2;

•y=(2/3)*t.^3;

•z=(6/4)*t.^4-(1/3)*t.^3;  %由速度得到曲线

•plot3(x,y,z,'r.-'),       %画飞行轨迹

•hold on  

•%算数值梯度

•Vx=gradient(x);

•Vy=gradient(y);

•Vz=gradient(z);

•quiver3(x,y,z,Vx,Vy,Vz), %画速度矢量图

•grid on       % 栅格化

•xlabel('x')

•ylabel('y')

•zlabel('z')

Simulink入门(三)

 

3.微积分问题的MATLAB求解

 

•符号变量在解决工程问题中应用较多,对于一个工程问题而言,一般首先从变量出发,把问题用符号变量表示出来(得到符号矩阵),然后通过符号变量求解得到一般表达式,根据该表达式,代入相应的初始条件,即可得到问题的具体的解。

1. 极限

•MATLAB提供了求极限函数limit(),函数调用格式为:y = limit(fun,x,x0)。

•其中,y为返回的函数极限值;

•    fun为要求解的函数;

•     x为函数自变量;

•     x0位函数自变量的取值,x趋近于x0。

•MATLAB求解极限问题有专门的函数,编程如下:

•clc,clear,closeall

•symsx a 

•I1=limit('(sin(x)-sin(3*x))/sin(x)',x,0)

•I2=limit('(tan(x)-tan(a))/(x-a)',x,a)

•I3=limit('(3*x-5)/(x^3*sin(1/x^2))',x,inf)

•运行程序输出结果如下:

•I1 =

•-2

•I2 =

•tan(a)^2 + 1

•I3 =

•3

2.导数

 

•diff是求微分最常用的函数,其输入参数既可以是函数表达式,也可以是符号矩阵。

•MATLAB常用的格式是:diff(f, x, n);

•其中,f关于x求n阶导数。

•MATLAB求解导数问题,编程如下:

•clc,clear,closeall

•symsx y 

•f=sym('exp(-2*x)*cos(3*x^(1/2))')

•diff(f,x)

•g=sym('g(x,y)')                    %建立抽象函数。

•f=sym('f(x,y,g(x,y))')                %建立复合抽象函数。

•diff(f,x)

•diff(f,x,2)

•运行程序输出结果如下:

•f =

•exp(-2*x)*cos(3*x^(1/2))

•ans=

•- 2*exp(-2*x)*cos(3*x^(1/2)) - (3*exp(-2*x)*sin(3*x^(1/2)))/(2*x^(1/2))

 

Simulink入门(三)

 

•g =

•g(x, y)

•f =

•f(x, y, g(x, y))

•ans=

•D([3], f)(x, y, g(x, y))*diff(g(x, y), x) + D([1], f)(x, y, g(x, y))

•ans=

•(D([3, 3], f)(x, y, g(x, y))*diff(g(x, y), x) + D([1, 3], f)(x, y, g(x, y)))*diff(g(x, y), x) + D([1, 3], f)(x, y, g(x, y))*diff(g(x, y), x) + D([3], f)(x, y, g(x, y))*diff(g(x, y), x, x) + D([1, 1], f)(x, y, g(x, y))

•数值求导指令diff,程序如下:

•clc,clear,closeall

•x=linspace(0,2*pi,50);

•y=sin(x);

•dydx=diff(y)./diff(x);

•plot(x(1:49),dydx),grid

•MATLAB int()函数是求积分最常用的函数,其输入参数可以是函数表达式。

•常用的格式是:int(f, r, x0, x1)。

•其中,f为所要积分的表达式;

•r为积分变量,若为定积分,则x0与x1为积分上下限。

•求解积分函数int,编写程序如下:

•clc,clear,closeall

•syms   x y z

•I1=int(sin(x*y+z),z)

•I2=int(1/(3+2*x+x^2),x,0,1)

•I3=int(1/(3+2*x+x^2),x,-inf,inf)

•运行程序输出结果如下:

•I1 =

•    -cos(z + x*y)

•I2 =

•    -(2^(1/2)*(atan(8^(1/2)/4) - atan(2^(1/2))))/2

•I3 =

•   (pi*2^(1/2))/2

3.  微分方程的数值解

 

 

•求解微积分方程你的数值解常用的MATLAB函数调用如下:

•[t, x] = ode23(‘xprime’, t0, tf, x0, tol, trace)

•[t, x] = ode45(‘xprime’, t0, tf, x0, tol, trace)

•或

•[t, x] = ode23(‘xprime’, [t0, tf], x0, tol, trace)

•[t, x] = ode45(‘xprime’, [t0, tf], x0, tol, trace)

•说明:

•(1)两个指令的调用格式相同,均为Runge-Kutta法。

•(2)该指令是针对一阶常微分设计的。因此,假如待解的是高阶微分方程,那么它必修先演化为形如 的一阶微分方程组,即“状态方程”。

•(3)’xprime’是定义 的函数名。该函数文件必须以 为一个列向量输出,以 为输入参量(注意输入变量之间的 关系,先“时间变量”后“状态变量”)。

•(4)输入参量 和 分别是积分的起始值和终止值。

•(5)输入参量 为初始状态列向量。

•(6)输出参量 和 分别给出“时间”向量和相应的状态向量。

•(7)tol控制解的精度,可缺省。缺省时,ode23默认tol=1.e-3;ode23默认tol=1.e-6。

•(8)输入参量trace控制求解的中间结果是否显示,可缺省,缺省时,默认为tol=0,不显示中间结果。

•(9)一般地,两者分别采用自适应变步长(即当解的变化较慢时采用较大的步长,从而使得计算速度快;当解的变化速度较快时步长会自动地变小,从而使得计算精度更高)的二、三阶Runge-Kutta算法和四、五阶Runge-Kutta算法,ode45比ode23的积分分段少,而运算速度快。

 

•建立方程组的函数文件如下:

•function dz=dzdx1(x,z)

•dz(1)=z(2);

•dz(2)=z(3);

•dz(3)=z(3)*x^(-1)-3*x^(-2)*z(2)+2*x^(-3)*z(1)+9*x^3*sin(x);

•dz=[dz(1);dz(2);dz(3)];

•end

•编写主程序如下:

•clc,clear,closeall

•H=[0.1,60]; 

•z0=[1;1;1];

•[x,z]=ode15s('dzdx1',H,z0);

•plot(x,z(:,1),'g--',x,z(:,2),'b*--',x,z(:,3),'mp--')

•xlabel('轴\it x');

•ylabel('轴\it y')

•grid on

•legend('方程解z1的曲线','方程解z2的曲线', '方程解z3的曲线')

 

Simulink入门(三)

 

4  龙贝格积分法微积分运算

•在MATLAB中编程实现的龙贝格积分法的函数为:[I,step]=Roberg(f,a,b,eps)。

•功能:龙贝格积分法求函数的数值积分。

•调用格式:[I,step]=Roberg(f,a,b,eps)。

•其中,I:积分值;

•step: 积分划分的子区间次数;

•f: 函数名;

•a: 积分下限;

•b: 积分上限;

•eps: 积分精度;

5.  有限差分方法求边值问题

•在MATLAB中编程实现的有限差分方法的函数为:

•[k,A,B1,X,Y,y,wucha,p]=yxcf(q1,q2,q3,a,b,alpha,beta,h)

•功能:有限差分方法求函数的边值问题。

•调用格式:[k,A,B1,X,Y,y,wucha,p]=yxcf(q1,q2,q3,a,b,alpha,beta,h)。

•其中,q1、q2、q3:方程系数;

•a为方程y的初始化值x0;

•b为方程y的区间终值xn;

•alpha为y(a)对应的值;

•beta为y(b)对应的值;

•h为求解步长;

•k为计算迭代步数;

•A为矩阵系数;

•B1为矩阵系数;

•Y为矩阵向量;

•y为求解目标方程的边值;

•wucha为求解误差;

•p等于[k',X',y,wucha'],为一个矩阵;

6.  样条函数求积分

 

•MATLAB中的样条工具箱中提供了求样条函数的积分的函数fnint。函数fnint的常见用法如下:

•q=fnint(Y)

•它表示求取样条函数Y的积分。

•在用函数fnint求积分之前,必须用样条工具箱中的函数csape对被积分函数进行样条插值拟合。

7.  常微分方程符号解

•MATLAB常微分方程符号解的语法是:

•dsolve('equation','condition')

•其中,equation代表常微分方程式即y'= g(x,y),且须以Dy代表一阶微分项y',D2y代表二阶微分项y'',condition则为初始条件。

•函数dsolve用来解符号常微分方程、方程组,如果没有初始条件,则求出通解,如果有初始条件,则求出特解。

•dsolve的调用格式如下:

•(1)dsolve('equation')  %给出微分方程的解析解,表示为t的函数;

•(2)dsolve('equation', 'condition')  %给出微分方程初值问题的解,表示为t的函数;

•(3)dsolve('equation', 'v')  %给出微分方程的解析解,表示为v的函数;

•(4)dsolve('equation', 'condition', 'v')  %给出微分方程初值问题的解,表示为v的函数。

 

8.非线性方程组求解

 

•函数:fsolve

•格式如下:

•x = fsolve(fun,x0)  %用fun定义向量函数,其定义方式为:先定义方程函数function F = myfun(x)。

•F =[表达式1;表达式2;…表达式m]  %保存为myfun.m,并用下面方式调用:x = fsolve(@myfun,x0),x0为初始估计值。

•x = fsolve(fun,x0,options)

•[x,fval] = fsolve(…)    %fval=F(x),即函数值向量

•[x,fval,exitflag] = fsolve(…)

•[x,fval,exitflag,output] = fsolve(…)

•[x,fval,exitflag,output,jacobian] = fsolve(…)  % jacobian为解x处的Jacobian阵。

 

 

 

•MATLAB中利用函数fminsearch求无约束多元函数最小值。

•函数:fminsearch

•格式如下:

•x = fminsearch(fun,x0)  %x0为初始点,fun为目标函数的表达式字符串或MATLAB自定义函数的函数柄。

•x = fminsearch(fun,x0,options)   % options查optimset

•[x,fval] = fminsearch(…)  %最优点的函数值

•[x,fval,exitflag] = fminsearch(…)  % exitflag与单变量情形一致

•[x,fval,exitflag,output] = fminsearch(…) %output与单变量情形一致

•注意:fminsearch采用了Nelder-Mead型简单搜寻法。

9.无约束最优化问题求解

 

•MATLAB中利用函数fminsearch求无约束多元函数最小值。

•函数:fminsearch

•格式如下:

•x = fminsearch(fun,x0)  %x0为初始点,fun为目标函数的表达式字符串或MATLAB自定义函数的函数柄。

•x = fminsearch(fun,x0,options)   % options查optimset

•[x,fval] = fminsearch(…)  %最优点的函数值

•[x,fval,exitflag] = fminsearch(…)  % exitflag与单变量情形一致

•[x,fval,exitflag,output] = fminsearch(…) %output与单变量情形一致

•注意:fminsearch采用了Nelder-Mead型简单搜寻法。

10.线性规划问题.

•线性规划问题是目标函数和约束条件均为线性函数的问题,在MATLAB 2013a版中,线性规划问题(Linear Programming)已用函数linprog取代了MATLAB 7.0版中的lp函数。当然,由于版本的向下兼容性,一般说来,低版本中的函数在高版中仍可使用。

•函数:linprog

•格式如下:

•x = linprog(f,A,b)  %求min    

•x = linprog(f,A,b,Aeq,beq)  %等式约束,若没有不等式约束,则A=[ ],b=[ ]。

•x = linprog(f,A,b,Aeq,beq,lb,ub)  %指定x的范围,若没有等式约束  ,则Aeq=[ ],beq=[ ]

•x = linprog(f,A,b,Aeq,beq,lb,ub,x0)   %设置初值x0

•x = linprog(f,A,b,Aeq,beq,lb,ub,x0,options)    % options为指定的优化参数

•[x,fval] = linprog(…)  % 返回目标函数最优值,即。

•[x,lambda,exitflag] = linprog(…)  % lambda为解的Lagrange乘子。

•[x, lambda,fval,exitflag] = linprog(…)  % 终止迭代的错误条件。

•[x,fval, lambda,exitflag,output] = linprog(…)  % output为关于优化的一些信息

•说明:若表示函数收敛于解,表示超过函数估值或迭代的最大数字,表示函数不收敛于解;若lambda=lower表示下界,lambda=upper表示上界ub,lambda=ineqlin表示不等式约束,lambda=eqlin表示等式约束,lambda中的非0元素表示对应的约束是有效约束;output=iterations表示迭代次数,output=algorithm表示使用的运算规则,output=cgiterations表示PCG迭代次数。

11.二次型规划问题.

 

•MATLAB 2014a版中的函数quadprog用来解决二次规划问题(quadratic programming)问题,且已经取代了低版本MATLABqp函数。

•函数:quadprog

•格式如下:

•x = quadprog(H,f,A,b)  %其中、、、为标准形中的参数,x为目标函数的最小值。

•x = quadprog(H,f,A,b,Aeq,beq)    %Aeq, beq满足等约束条件。

•x = quadprog(H,f,A,b,Aeq,beq,lb,ub)    % lb, ub分别为解x的下界与上界。

•x = quadprog(H,f,A,b,Aeq,beq,lb,ub,x0)    %x0为设置的初值

•x = quadprog(H,f,A,b,Aeq,beq,lb,ub,x0,options)     % options为指定的优化参数

•[x,fval] = quadprog(…)    %fval为目标函数最优值

•[x,fval,exitflag] = quadprog(…)    % exitflag与线性规划中参数意义相同

•[x,fval,exitflag,output] = quadprog(…)    % output与线性规划中参数意义相同

•[x,fval,exitflag,output,lambda] = quadprog(…)   % lambda与线性规划中参数意义相同

Simulink入门(三)