数学建模赛前培训

更新时间:2023-11-08 23:46:01 阅读量: 教育文库 文档下载

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

Matlab简介

MATLAB软件的名字是由Matrix(矩阵)和Laboratory(实验室)两个单词的前三个字母组合而成。它是美国MathWorks公司出品的商业数学软件,用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境。

20世纪70年代,时任美国新墨西哥大学计算机科学系主任Cleve Moler为了减轻学生编程的负担,用FORTRAN编写了一组调用LINPACK和EISPACK矩阵软件工具包库程序的“通俗易用”的接口,这就是最早的MATLAB。

1984年由Little、Moler、Steve Bangert合作成立了的MathWorks公司,并且正式把MATLAB推向市场。从此时起,采用了C语言来编写MATLAB的内核,除了原有数值计算能力外,还新增了数据图视功能。

到20世纪90年代,MATLAB已成为国际控制界的标准计算软件。现今的MATLAB拥有更丰富的数据类型和结构、更友善的面向对象、更加快速精良的图形可视、更广博的数学和数据分析资源、更多的应用开发工具。

Desktop操作桌面简介 启动后默认界面如下图。

Command Window

该窗口是进行Matlab各种操作的主要窗口。在该窗内可以输入各类指令、函数、表达式;显示除了图形外所有的运算结果,错误时,给出相关出错提示。

图 1.3-1 几何独立的指令窗

【例】求[12+2?(74)] 32的算术运算结果。 (1)键盘输入: (12+2*(7-4))/3^2

(2)输完后,按回车键【Enter】执行该指令,显示结果如下: ans = 2

【说明】指令输入完后只有按回车键【Enter】才能执行;如果输入的指令不含赋值号,计算结果被赋于默认的变量ans。

数值、变量和表达式

数值的记述:数值采用“占64位内存的双精度”表示。其相对精度为eps,大约保持有效数字16位。数值范围在10-308?10308之间。

变量命名规则:变量名和函数名对大小写敏感;变量第一个字符必须是英文字母,最多包含63个字符(英文、数字和下划线),不能包括空格、标点、运算符;不能使Matlab的关键词和自用的变量名(eps,pi等)函数名(sin,exp等)、文件夹名(rwt,toolbox等)。

Matlab默认的数学常数

MATLAB为数学常数预定义的变量名

预定义变量 eps i 或 j Inf或inf intmax 含 义 浮点数相对精度 虚数单位(不能和C语言中的相混淆) 无穷大,如1/0 可表达的最大整数 默认2147483647 可表达的最小整数默认默认-2147483647 NaN或nan 预定义变量 含 义 不是一个数(Not a Number) 如0/0,ゥ/圆周率 最大正实数 realmax 默认1.7977′10最小正实数 realmin 默认1.7977′10-308308 pi intmin 【说明】预定义变量可被重新赋值;允许被0除,用NaN或Inf表示,不会导致程序中断,会有警告信息提示。

运算符和表达式

MATLAB表达式的基本运算符

加 减 乘 除 幂 圆括号 数学表达式 矩阵运算符 a + b a - b a * b a / b 或 b \\ a a ^ b ( ) 数组运算符 a + b a - b a .* b a ./ b 或 b .\\ a a .^ b ( ) a?b a?b a?b a?b ab ( ) 【说明】运算定义在复数域,对于方根问题,默认只返回一个主解;面向矩阵和数组设计,标量被看做1′1的矩阵或数组;数组运算的“乘 除 幂”运算,符号前有小黑点;除法分左除'\\'和右除'/',意义不同,斜线倾向于谁,谁被除。

5/3 5\\3

左除'\\'和右除'/'优先级相同,从左往右进行。 面向复数设计的运算 real(z):

复数z的实部 复数z的虚部 复数z的模

复数z的幅角(弧度)

imag(z): abs(z):

angle(z):

?1?5i3?7i?【例】对复数数组A??进行求实部、虚部、模和幅角的运算。 ??2?6i4?8i?(1)

AR=[1,3;2,4];AI=[5,7;6,8]; A=AR-AI*i (2) A_real=real(A) A_image=imag(A) (3) Am2=abs(A)

Aa2=angle(A)*180/pi 默认的输入显示方式

控制流关键字if, for, end等用蓝色字体表示;输入指令中的非控制指令、数字显示为黑色字体;字符串显示为紫色字体;注释为绿色字体;警告信息为红色字体。

运算结果的显示

常见数字输出结果为5位有效数字,这是“双精度”数据的默认输出格式。

指 令 format format short format long format short e format long e format short g format long g format rat format hex format + format bank format compact format loose 含 义 通常保证小数点后四位有效,最多不超 过7位;对于大于1000的实数,用5 位有效数字的科学记数形式显示。 小数点后15 位数字表示 5 位科学记数表示 15 位科学记数表示 举 例 说 明 从format short 和format short e中自动选 择最佳记数方式 从format long 和format long e中自动选 择最佳记数方式 近似有理数表示 十六进制表示 显示大矩阵用。正数、负数、零 分别用 + , - , 空格表示。 (金融)元、角、分表示 显示变量之间没有空行 在显示变量之间有空行 【说明】format short为默认显示格式。其余格式在设置后起效,Matlab重启后恢复默认显示格式。

指令行中的标点符号

MATLAB常用标点的功能

名 称 空格 逗号 , 标 点 作 用 输入量之间分隔;数组元素间分隔 显示计算结果与其后指令间分隔; 输入量之间分隔;数组元素间分隔 黑点 分号 冒号 注释号 单引号对 圆括号 方括号 花括号 赋值号 下连符 续行号 “At”号 惊叹号 . ; : % ' ' ( ) [ ] { } = _ ... @ ! 数值计算中的小数点;用在运算符前表示“数组”运算符 指令结尾,不显示结果;不显示计算结果与其后指令间分隔;数组行间分隔符 生成一维数组;单下标援引时表示全部元素构成的长列;多下标援引时表示该维上全部元素 由其“起首”的行为非执行的注释行 字符串记述符 改变运算次序;数组援引时使用;函数输入宗量列表时用 输入数组时;函数输出宗量列表时用 胞元数组记述符;图形中被控特殊字符括号 变量、函数、文件夹的连字符;图形中被控下脚标前导符 函数名前,形成函数句柄;匿名函数前导符;放在目录名前,形成“用户对象”类目录 【说明】符号为英文状态下输入。 指令窗的常用控制指令

常见的通用操作指令

指令 ans cd clf clc clear dir doc diary 含 义 最新计算结果的默认变量名 设置当前工作目录。 清除图形窗 清除指令窗中显示内容 清除MATLAB工作空间中保存的变量 列出指定目录下的文件和子目录清单 在MATLAB浏览器中,显示帮助信息 把指令窗输入记录为文件 指令 edit exit help more quit return type which 含 义 打开M文件编辑器 关闭/退出 MATLAB 在指令窗中显示帮助信息 使其后的显示内容分页进行 关闭/退出 MATLAB 返回到上层调用程序;结束键盘模式 显示指定M文件的内容 指出其后文件所在的目录 指令窗中指令行的编辑

sym(Num,'d') 双精度数字Num的“十进制浮点”近似表达的符号数字(32位)

【说明】Num是数值数字;注意sym('Num')和sym(Num)的区别,'Num'是数字字符串,表示理论真值,Num表示数字,默认为其双精度近似值;符号运算中,“双精度数字”自动按照sym(Num,'r')转换为符号数字。

符号数字向双精度数字转换 double(Num_sym)

把符号数字Num_sym转化为双精度数字

【说明】double('Num')与double(Num)的区别。前者把字符串'Num'转换为字符的ASCII码值数组。

double('13') double(13)

符号数字的任意精度表达形式

数值运算,产生阶段误差且会累积;符号计算,数值完全准确,且不产生累积,但是以降低运算速度慢和增加内存需求为代价。

digits digits(n)

显示当前环境下符号数字“十进制浮点”表示的有效数字位数 设定符号数字“十进制浮点”表示的有效数字位数(默认32位) 据表达式x得到digits指定精度下的符号数字xs 据表达式x得到n位有效数字的符号数字xs

xs=vpa(x) xs=vpa(x,n)

【说明】vpa函数运算精度受digits函数控制;vpa(x,n)仅在运行当时起作用,x为符号字符,也可为数值,运行结果xs为符号数字。

符号表达式的基本操作

collect(合并同类项)、expand(对指定项展开)、factor(进行因式分解)、horner(转换成嵌套形式)、numden(提取公因式)、simplify(恒等式简化)、pretty(习惯方式显示)、coeffs(获取符号多项式系数)等。最常用:

simple(EXPR)

把EXPR转换成最简形式

表达式中的置换操作 公因子法简化表达 RS=subexpr(S)

从S中自动提取公因子sigma,并用sigma重写S为RS 从S中自动提取公因子即为w,并用w重写S为RS 调用与RS=subexpr(S,'w')相同,均返回RS和w。

RS=subexpr(S,'w')

[RS,w]=subexpr(S,'w')

通用置换指令

RES=subs(ES,old,new) 用new置换ES中的old后产生RES RES=subs(ES,new)

用new置换ES中的自由变量后产生RES

subs输出结果取决于new的属性。

符号微积分

极限和导数的符号计算 limit(f,x,a)

求极限 limf(x)

x?alimit(f,x,a,'left') limit(f,x,a,'right') diff(f,x,n) 求左极限lim?f(x)

x?a求右极限lim?f(x)

x?adnf求f关于变量x的n阶导数n dxtaylor(f,x,a,'Order',n) 将函数f(x)在x?a处展为?k?0n?1f(k)(a)(x?a)k k!【说明】x缺省时,自变量由symvar自动确认,a缺省时默认为0,n缺省时默认为1;f为矩阵时,求极限和求导对元素操作;但自变量定义在整个矩阵上;diff在数值运算中用来求差分。

【例】极限 syms x n limit(sin(x)/x,x,0) limit((1+1/n)^n,n,inf) limit(exp(1/x),x,0,'left') limit(exp(1/x),x,0,'right') 【例】导数 syms x y D1=diff(exp(x*y)) D2=diff(exp(x*y),y,2)

D3 = diff(diff(exp(x*y),y,2),x,3)

【例】求f(x)?xex在x?0处展开的8阶Maclaurin公式。 r=taylor(x*exp(x),x,0,'Order',9) 序列/级数的符号求和 symsum(f,v,a,b)

求f在指定变量v取遍[a,b]中所有整数时的和?f(v)

v?ab【说明】f为矩阵时,求和对元素逐个进行,但自变量定义在整个矩阵上;v缺省时,f中的自由变量由symvar自动确认;b可取有限整数,也可取无穷大;a, b同时缺省时,默认求和区间为[0,v-1]。

【例】

(1)有限项求和?syms n k f1=1/(k*(k+1)); s1=symsum(f1,k,1,n) s11=symsum(f1,k,1,inf)

?x2k?11(2)无限项求和?,?。

k?12k?1k?1k(k?1)1。

k?1k(k?1)n?syms x k

f2=x^(2*k-1)/(2*k-1); s2=symsum(f2,k,1,inf)

符号积分 int(f,v)

给出f对指定变量v的(不带积分常数)的不定积分 给出f对指定变量v在[a,b]区间上的定积分

int(f,v,a,b)

【例】求定积分?xlnxdx, clear syms x f1=x*log(x) s1=int(f1,x)

?baxlnxdx,

?21xlnxdx。

s1=simple(s1)

s1 =(x^2*(log(x) - 1/2))/2 >> s1=simple(s1) s1 =x^2*(log(x)/2 - 1/4) s2=int(f1,'a','b') s3=int(f1,1,2)

?atbx2??dx。 【例】求??1?sinx??x???syms a b x t

f2=[a*t,b*x^2;1/x,sin(x)] INTf2=int(f2) pretty(INTf2)

【例】求三次积分?syms x y z

F2=int(int(int(x^2+y^2+z^2,z,sqrt(x*y),x^2*y),y,sqrt(x),x^2),x,1,2) VF2=vpa(F2)

微分方程的符号解法

求微分方程符号解的一般指令 常用格式:

S=dsolve('eq1,eq2,…,eqn'(微分方程),'cond1,cond2,…,condn'(初始条件),'v'(指定独立条件))

S=dsolve('eq1','eq2',…,'eqn','cond1','cond2',…,'condn','v')

【说明】输入包括三个部分:微分方程,初始条件,指定独立变量,微分方程部分必不可少,其余两部分可以忽略,输入量必须是字符串;

如不指定独立变量,默认为小写英文字母t;

21??xx2x2yxy(x2?y2?z2)dzdydx。

用“Dny”表示“y的n阶导数”;

输出量S是“结构对象”,如果y是因变量,那么关于它的解在S.y中。 若找不到“显式解”也找不到“隐式解”时,给出警告信息,S为空符号对象。 【例】求clear all

S=dsolve('Dx=y,Dy=-x') disp(' ')

disp(['微分方程的解',blanks(2),'x',blanks(22),'y']) disp([S.x,S.y])

【说明】注意clear命令,如没有,任意常数的表示可能会不同;输入应遵循“导数在前函数在后,导数阶次递减”的次序,否则可能出错。

【例】求两点边值问题:xy???3y??x2,y(1)?0,y(5)?0。 求解边值问题

y=dsolve('x*D2y-3*Dy=x^2','y(1)=0,y(5)=0','x') y =

(31*x^4)/468 - x^3/3 + 125/468

【例】求常微分方程y???2y??5y?exsin2x的通解。 dsolve('D2y-2*Dy+5*y=exp(x)*sin(2*x)','x')

?dx?y?1??dt【例】求常微分方程组?的通解。

dy??x?1??dtdxdy?y,??x的解。 dtdt[x,y]=dsolve('Dx=y+1,Dy=x+1','t')

符号矩阵分析和代数方程解 常用指令: det(A) diag(A)

方阵A的行列式的值

取矩阵A对角元构成向量,或由向量A构成对角阵 特征值分解,AV=VD,V特征值,D特征向量

[D,V]=eig(A)

inv(A) poly(A) rank(A) rref(A) tril(A) triu(A)

逆矩阵

矩阵A的特征多项式 矩阵A的秩 矩阵A的行阶梯矩阵 矩阵A的下三角阵 矩阵A的上三角阵

?a11【例】求矩阵??a21a12?的行列式、逆和特征根。 a22??(1)符号矩阵的行列式和逆 syms a11 a12 a21 a22 A=[a11,a12;a21,a22] DA=det(A) IA=inv(A)

(2)借助公因子表达符号矩阵的特征值 EA=subexpr(eig(A),'D') D =

(a11^2 - 2*a11*a22 + a22^2 + 4*a12*a21)^(1/2) EA =

a11/2 + a22/2 - D/2 a11/2 + a22/2 + D/2

线性方程组的符号解

np?d???q?22??n?d?q?p?10【例】求线性方程组?的解。

?q?d?n?p?4?q?p?n?8d?1?(1)采用左除“\\”符号

A=sym([1 1/2 1/2 -1;1 1 -1 1;1 -1/4 -1 1;-8 -1 1 1]); b=sym([0;10;0;1]);

X1=A\\b

(2)利用solve函数求解 eq1=sym('d+n/2+p/2-q'); eq2=sym('d+n-p+q-10'); eq3=sym('d-n/4-p+q'); eq4=sym('-8*d-n+p+q-1');

S=solve(eq1,eq2,eq3,eq4,'d','n','p','q'); disp([' d',' n',' p',' q']) disp([S.d,S.n,S.p,S.q]) d n p q [ 1, 8, 8, 9]

一般代数方程组的解

一般方程包括线性(Linear),非线性(Nonlinear)和超越方程(Transcedental)等。语法规则如下:

S=solve('eq1','eq2',…,'eqn','v1','v2',…,'vn') S=solve(exp1,exp2,…,expn,v1,v2,…vn)

求方程组关于指定变量的解 求方程组关于指定变量的解

【说明】'eq1','eq2',…,'eqn'为字符串表达式或字符串表示的方程,'v1','v2',…,'vn'为指定的求解变量名;exp1,exp2,…,expn,为符号表达式(不能有等号),v1,v2,…vn为指定的求解变量名;'eq1','eq2',…,'eqn'可不含等号,默认等于0;解S为构架数组;若不存在符号解,又不存在其他不确定参数时,给出数值解。

?uy2?vz?w?0【例2.6-4】求方程组?关于y,z的解。

?y?z?w?0S=solve('u*y^2+v*z+w=0','y+z+w=0','y','z') disp('S.y'),disp(S.y),disp('S.z'),disp(S.z) 【说明】

(1)一些正确的调用格式:

S=solve('u*y^2+v*z+w=0','y+z+w=0','z','y') S=solve('u*y^2+v*z+w','y+z+w','y,z') S=solve('u*y^2+v*z+w','y+z+w','z,y')

syms y z u v w, S=solve(u*y^2+v*z+w,y+z+w,z,y)

[y,z]=solve('u*y^2+v*z+w=0','y+z+w=0','y','z') %输出宗量顺序正确,结果才能正确 以下导致混乱(主要是输出宗量列表顺序): [z,y]=solve('u*y^2+v*z+w=0','y+z+w=0','y','z') [z,y]=solve('u*y^2+v*z+w=0','y+z+w=0','y,z')

(2)如果不指定变量,按照symvar或findsym默认变量确定。 [y,z]=solve('u*y^2+v*z+w=0','y+z+w=0') S=solve('u*y^2+v*z+w=0','y+z+w=0') 以上两个指令解出的是关于w,y的解。

np?d???q?22?【例】求解“欠定”方程组?n?d?q?p?10的解。

?n?q?d??p4?% y,z其实为w,y的解

syms d n p q

eq1=d+n/2+p/2-q;eq2=n+d+q-p-10;eq3=q+d-n/4-p; S=solve(eq1,eq2,eq3,d,n,p,q);

disp([' S.d',' S.n',' S.p',' S.q']) disp([S.d,S.n,S.p,S.q]) 【例】求(x?2)x?2的解。 clear all, syms x; s=solve('(x+2)^x=2','x') xs=(s+2)^s

符号计算结果的可视化

途径一:利用计算获得的符号表达式直接绘图

途径二:根据计算获得的符号表达式或符号数值结果,转换为数值数据,再利用数值绘图指令绘图。

直接可视化符号表达式

适用于多种类型函数:符号函数、字符串函数、M文件函数和句柄函数。此类函数以ez开头,意为Easy to。

ezcontour ezcontourf ezmesh ezmeshc ezplot ezplot3 ezpolar ezsurf ezsurfc

绘制等位线 绘制填色等位线 绘制网格线

绘制带等位线的网格线 绘制二维图形 绘制三维图形 绘制极坐标图 绘制曲面图 绘制带等位线曲面图

单独立变量符号函数的可视化 ezplot(Fx,[xmin,xmax])

在指定的x范围内绘制y?f(x)的平面曲线

ezplot(Fxy,[xmin,xmax,ymin,ymax]) 在指定的x,y范围内绘制F(x,y)?0的平面曲线 ezplot(xt,yt,[tmin,tmax])

在指定的t范围内绘制x?x(t),y?y(t)的平面曲线 在指定的t范围内绘制三维空间曲线

ezplot3(xt,yt,zt,[tmin,tmax])

【说明】输入函数必须有一个独立自由变量;

第一种格式,x范围如不设定,默认为0?x?2?;第二种格式,x,y范围如不设定,默认为0?x,y?2?,第三和第四种格式,t范围如不设定,默认为0?t?2?;

ezplot自动把绘制函数和自变量分别标为图名和横坐标,可以用title和xlable改写;ezplot不能设定曲线颜色,线型,可用set设置;不能同时绘制多条曲线,可采取措施实现。

t2?23t在[0,4?]间的图形。>> syms t 【例】绘制y?ecos32>> ezplot('2*cos(t)-cos(2*t)','2*sin(t)-sin(2*t)') >>

ezplot('sin(t)*cos(t)*log(abs(t))','(t*cos(t))^(1/2)*(abs(t)^0.3)')

ezplot('x^2+(y-(2/3)*((abs(x)+x^2-6)/(abs(x)+x^2+2)))^2-36')

syms t tao

y=2/3*exp(-t/2)*cos(sqrt(3)/2*t) ezplot(y,[0,4*pi]),

ylim([-0.2,0.7])

螺旋线:ezplot3(cos(t),sin(t),t,[0,6*pi]) 单位圆:ezplot('1-x^2-y^2',[-1,1,-1,1]);axis equal 双独立变量符号函数的可视化 ezsurf(Fxyz,dom_f)

绘制矩形区域上的二元函数F(x,y,z)=0的曲面 绘制圆形区域上二元函数F(x,y,z)=0的曲面 绘制矩形区域上的参数曲面x=x(s,t),y=y(s,t),z=z(s,t) 绘制圆形区域上的参数曲面x=x(s,t),y=y(s,t),z=z(s,t)

ezsurf(Fxyz,dom_f,'circ') ezsurt(x,y,z,dom_st,ngrid) ezsurf(x,y,z,dom_st,'cric')

【说明】输入函数必须有两个独立自由变量;

dom_f取[a,b]时表示a?x,y?b,dom_f取[a,b,c,d]时表示a?x?b,c?y?d,dom_st取[a,b]时表示a?s,t?b,dom_st取[a,b,c,d]时表示a?s?b;若缺省均在,c?t?d[?2?,2?]间。

ngrid指定绘图格点数,默认60,数值越大图形越精细; 'circ'指定在圆形区域绘图,圆域为极坐标系,圆心在(?b?a??d?c??????; 22????22a?bc?d,),半径为22ezsurf自动标示图名,轴名,可用title和xlable修改。 球面:ezsurf('sin(s)*cos(t)','sin(s)*sin(t)','cos(s)',[0,pi],[0,2*pi])

环面:ezsurf('(3+0.5*cos(s))*cos(t)','(3+0.5*cos(s))*sin(t)','0.5*sin(s)',[0,2*pi],[0,2*pi]) 圆锥面:ezsurf('sqrt(x^2+y^2)',[-1,1,-1,1],'circ') 【注意】使用axis equal使得坐标轴刻度相同。 【例】使用球面坐标参量绘制部分球壳。 clf

x='cos(s)*cos(t)'; y='cos(s)*sin(t)'; z='sin(s)';

ezsurf(x,y,z,[0,pi/2,0,3*pi/2]) view(17,40)

%观察视角控制

编程与M文件 M文件的建立

(1)MATLAB中自带M文件编辑器,可以单击命令窗口的File菜单->New->M-file,即可建立一个新的M文件;

(2)点击工具栏中的“新建”图标; (3)在命令窗口中输入edit。

在编辑完成后,进行存盘,单击File\\Save As,在打开的对话框中选择存盘文件夹,键入文件名即可。在命令窗口输入该文件名即可运行该程序。

M文件的分类

M文件的语法类似于C语言,它是一个简单的ASCII文本文件,执行程序时逐行解释运行程序,是一种解释性的编程语言。

M文件可以分为两类,脚本类文件(script files)和函数类文件(function files)。 (1)脚本类文件实际上是一串指令的集合,与在命令窗口中逐行执行文件中的所有指令的结果是一样的。没有输入和输出参数。

(2)函数类文件需要输入变量,返回输出变量。函数类M文件扩充了MATLAB的功能,也就是说函数类M文件利用MATLAB语言构造一个新的MATLAB函数,该函数的使用与MATLAB的内部函数一样。

脚本类M文件和函数类M文件的区别在于:函数类M文件可以传递参数,而脚本类M文件不具备参数传递功能;函数类M文件中定义及使用的变量都是局部变量,只在本函数的工作区内有效,一旦退出该函数,即为无效变量,而脚本类M文件中定义及使用的变量都是全局变量,在退出文件后仍为有效变量。

函数类M文件的结构

(1)函数声明行:函数类M文件的第一行以关键字“function”开始,同时说明了该函数的函数名,输入参数、输出参数。

如果没有这一行,该文件就是脚本类M文件,而不是函数类文件。

(2)H1(The first help text line)行:紧随函数声明行的第一注释行。MATALB中注释行用“%”开始,一般包括大写的函数文件名,运用关键词简要描述函数功能。H1行供look for查询和help使用。

(3)在线帮助文本区(Help text):H1行及其后续的连续注释行。通常包括函数输

出和输出变量的含义,调用格式说明。

(4)编写和修改记录:与在线帮助文本区相隔一个空行的注释行。标志编写、修改该文件的作者、日期、版本记录,用以软件档案的管理。

(5)函数体(Function body):用MATLAB指令实现函数的功能。为了便于阅读和理解,应该适当使用空格和注释。

从运算的角度,只有函数声明行和函数体是函数类M文件必不可少的部分,其余部分可以没有。

MATLAB控制流 for循环

for循环语句的语法如下: for 变量=初值:增量:终值 运算指令 end

增量的默认值为1,增量可以大于零也可以小于零。

注意:在for循环中避免使用i,j作为循环变量,因为MATLAB默认i,j为虚数的单位。

例如,利用for循环语句计算?n2,可输入

n?1100sum = 0; for n=1:100 sum = sum+n^2; end sum 输出结果为:

sum = 338350 while循环

while循环语句的语法如下: while 表达式

循环体 end

若表达式为真,则执行循环体的内容,执行完后再判断表达式是否为真,若不是,则跳出循环体,向下继续执行。

例如,利用while循环语句计算?n2,可输入

n?1100>> sum = 0; n=1; while n<=100 sum = sum+n^2; n = n+1; end sum break语句

break语句用于强迫终止for循环或者while循环。当遇到break语句时,程序将执行循环体外的下一条语句。在嵌套循环中,break语句只是跳出最近的循环语句。

continue语句

作用是中断本次的循环体运行,将程序的流程跳转到判断循环条件的语句处,继续下一次的循环语句,即在for循环或者while循环中用于直接跳至下一个循环的执行,在嵌套循环中,continue控制的是与自己最近的一个for循环或while循环。

它的使用方法是 continue;

下面举例说明break语句和continue语句的区别。例如,输入 >> sum = 0; for n=1:10 sum =sum+n; if n>5 break end end

sum 输出结果为:

sum = 21

该程序计算了自然数1到6的和,当n=6时结束循环。 如果将break换成continue,则输出结果为 sum = 55

该程序计算了自然数1到10的和。 if-else-end分支结构

这种分支结构有如下的语法。 (1)if 逻辑表达式 执行语句 end

该语法表示如果逻辑表达式为真,则执行语句。 例如,给向量按如下规则赋值。输入 for n=1:6 a(n) = n; if n>3 a(n)=6-n; end end a 输出结果为:

a =

1 2 3 2 1 0 (2)if 逻辑表达式 执行语句1 else 执行语句2 end

该语法表示如果逻辑表达式为真,则执行语句1,否则,执行语句2。 (3)if 逻辑表达式1 执行语句1 elseif 逻辑表达式2

执行语句2

elseif 逻辑表达式3

执行语句3

else 执行语句4

end

该语法表示有多条判别条件时的MATLAB语法规则。

?x?1, x?0?例如,用if语句为赋值y??x, x?0编写程序。可输入

?x?1, x?0?>> if x>0 y=x+1; elseif x==0 y=x; else y=x-1; end

switch-case分支结构

如果在一个程序中,必须针对某个变量的不同取值来执行不同的语句,则通常使用switch语句,其语法如下:

switch 表达式 case 常量表达式1 执行语句1 case 常量表达式2 执行语句2 ? ? ? ?

case 常量表达式m

a3=1:-0.1:0

b1=linspace(0,pi,4) b2=logspace(0,3,4) c1=[2 pi/2 sqrt(3) 3+5i] rng default c2=rand(1,5)

二维数组的创建

小规模数组的直接输入法

规则:整个数组用[]包括;行与行间用分号“;”或回车分隔;元素间用逗号“,”或空格分隔。

【例3.3-2】在MATLAB环境下,用下面三条指令创建二维数组C。 a=2.7358; b=33/79;

C=[1,2*a+i*b,b*sqrt(a);sin(pi/4),a+5*b,3.5+i] Matlab提供许多生成特殊数组的函数。

标准数组生成函数

指 令

含 义

指 令 ones zeros random randsrc

含 义 产生全1数组\\矩阵

产生全0数组\\矩阵

产生各种随机分布数组 在指定字符集上产生均布随机数组

diag eye magic rand

产生对角数组(二维) 产生单位数组(二维) 产生魔方数组(二维) 产生均匀分布随机数

randn 产生正态分布随机数 产生各种用途的测试数组\\矩阵

gallery

二维数组元素的编址和寻访

AM?N?a11a12?aa22??21?????aM1aM2?a1N??a2N????a?ij?M?N ??????aMN?二维数组元素的编址

(1)全下标编址(Subscripts)

由元素在数组中的行序号和列序号数对(i,j)唯一标示元素。 (2)单序号编址(Single Index) 单一序号编址,按列计算。 . 二维数组元素的寻访 (1)全下标寻访法 (2)单序号寻访法 (3)逻辑寻访法

子数组寻访格式汇总

全下标 寻访格式 单序号 寻访格式 逻辑 寻访格式

A(L)

“逻辑1”寻访,生成一维列数组,由于A数组同规模的“逻辑数组”L的1元素选出A的对应元素,按单序号排列。

格 式 A(r,c) A(r,:) A(:,c) A(:) A(ind)

A的“r指定行,c指定列”上的元素 A的“r指定行,全部列”上的元素 A的“全部行,c指定列”上的元素 A的“单序号全部元素”生成的列向量

“单序号”寻访,生成ind一维数组(由ind的行或列确定输出形式)。

数组构作技法综合

数组操作函数

指 令 diag repmat reshape

含 义

提取对角元;或生成对角矩阵

按指定的行数、列数铺放模块数组,以形成更大数组

在元素总数不变的前提下,改变数组的行数、列

flipud fliplr rot90

以数组水平中线为对称轴,上下交换元素位置 以数组垂直中线为对称轴,左右交换元素位置 数组逆时针旋转90度

【例 】数组操作函数reshape, diag, repmat的用法;空阵 [ ] 删除子数组的用法。 a=1:8

A=reshape(a,4,2) A=reshape(A,2,4)

b=diag(A) B=diag(b)

D1=repmat(B,2,4)

D1([1,3],: )=[ ]

关系操作 关系操作符: > 大于 >= 大于等于

< 小于 <= 小于等于 == 等于 ~= 不等于

%

标量可与任何维数组(元素)进行比较,返回结果与数组同维;相同维数组可比较,返回同维逻辑数组。

逻辑操作 逻辑操作符: & 与

| 或

~ 非

xor异或

逻辑操作与关系操作类似。

数值计算

与符号计算相比,数值计算在科研和工程中的应用更为广泛。

数值求和与近似数值积分 Sx=sum(X)

沿列方向求和Sx(k)??Xm?n(i,k)

i?1mScs=cumsum(X) St=trapz(x,y)

沿列方向求累计和

采用梯形法沿列方向求函数y关于自变量x的积分

Sct=cumtrapz(x,y) 采用梯形法沿列方向求函数y关于自变量x的累计积分 【说明】trapz给出采样点(x,y)所连折线下的面积,即函数y在自变量区间x上的近似积分。cumtrapz(x,y)计算结果Sct是一个与y同样大小的数组,Sct(k)是?近似值。数值积分的精度与积分区间的分割有关,分割越细,精度越高。

例如 x=1:5 sum(x) cumsum(x) x=1:9;

X=reshape(x,3,3) sum(X) cumsum(X)

?x(k)x(1)y(x)dx的

【例】求积分s(x)??2y(t)dt,其中y?0.2?sint。

0clear d=pi/8; t=0:d:pi/2; y=0.2+sin(t); s=sum(y); s_sa=d*s;

%高度为函数采样值的小矩形面积之和(不是积分) %连接各函数采样值的折线下的面积

s_ta=d*trapz(y);

disp(['sum求得积分',blanks(3),'trapz求得积分'])

disp([s_sa, s_ta]) t2=[t,t(end)+d]; y2=[y,nan];

%为stair函数需要,增加一个采样区间 %为stair函数需要,增加一个非数函数值 %绘制虚线阶梯函数

stairs(t2,y2,':k') hold on

plot(t,y,'r','LineWidth',3) h=stem(t,y,'LineWidth',2); set(h(1),'MarkerSize',10) axis([0,pi/2+d,0,1.5]) hold off shg

%将当前图形窗口置于最上层

%绘制针状图

sum求得积分 trapz求得积分 1.5762 1.3013

1.510.5000.20.40.60.811.21.41.61.8

图 4.1-4 sum 和trapz求积模式示意

【说明】d*sum(y)不是积分的近似值,因为通过图可以看出,阶梯虚线所占的自变量区间比积分区间多一个采样区间。

计算精度可控的数值积分

上述指令缺陷:难以控制精度;不能处理广义积分;计算速度相对较低。 q=integral(fun,xmin,xmax)

在xmin和xmax区间计算fun函数的精确积分(简单格式)

q=integral(fun,xmin,xmax,Name,Value) 作用同上(复杂格式) 【说明】fun:描述被积函数的M码匿名函数或函数句柄,注意函数要适应输入量

exitflag=-2,表示约束区域不可行,若exitflag=-3,表示问题无解,若exitflag=-4,表示执行迭代算法时遇到NaN,若exitflag=-5,表示原问题和对偶问题均不可行,若exitflag=-7,表示搜索方向太小,不能继续前进;output表明算法和迭代情况;lambda表示存储情况。

【例】 用linprog函数求下面的线性规划问题

min -5x1-4x2-6x3ìx1-x2+x3 20????3x1+2x2+4x3 42??? 3x1+2x2 30??s.. tí?0£x1,???0£x2??????0£x3输入如下: >> f = [-5, -4,-6]; A = [1 -1 1; 3 2 4; 3 2 0]; b = [20; 42; 30]; lb = zeros(3,1);

[x,fval,exitflag,output,lambda] = linprog(f,A,b,[],[],lb)

注意:由于该问题没有等式约束,所以输入格式中相应的位置用[]代替,变量没有上限约束,所以ub也用[]代替,但由于其在最后,可以不写。

【例】一家家具公司生产桌子和椅子,用于生产的全部劳动力共计450个工时,原料是400个单位的木材。每张桌子使用15个工时的劳动力,20个单位的木材,售价为80元。每张椅子使用10个工时,用料5个单位,售价45元。问为达到最大效益,应如何安排生产?

解 设生产桌子x个,椅子y个,建立如下模型:

max 80x+45yì20x+5y 400?????15x+10y 450 s.. tí?x30?????y30输入如下:

f = [-80,-45]; A = [20, 5; 15, 10]; b = [400, 450]; lb = zeros(2,1);

[x, fval, exitflag] = linprog(f,A,b,[],[],lb)

注意:由于linprog是求目标函数的最小值,如求目标函数f的最大值,可先求出?f的最小值fval,则-fval就是f的最大值。本例只输出最优解、最优值和退出标志,可见生产14个桌子,24个椅子,可获得最大利润2200元。

9.2 0-1规划

0-1规划是一种特殊形式的整数规划,它的决策变量仅取值0或1.一般用0表示放弃,1表示选取,故0-1规划可以用来处理选址问题、指派问题、装箱问题、项目评价、资金分配、生产计划安排等问题。

在MATALB中求解0-1规划问题函数为bintprog,其针对下述0-1规划: min z=f¢ x

ìA祝xb??? s.t. í Ae?qxbeq

??,2,n,???xi=0/1i,=1?其中f,x,b,beq为列向量,A,Aeq为矩阵。

使用格式为:

[x, fval, exitflag, output] = bintprog(f, A, b, Aeq, beq)

输入部分:其中各符号对应0-1规划问题标准形式中的向量和矩阵,如果约束条件中有缺少,则其相应位置用空矩阵[]代替。

输出部分:其中x为最优解,用列向量表示;fval为最优值;exitflag为退出标志,若exitflag=1表示函数有最优解,若exitflag=-1表示超过设定的迭代最大次数,若exitflag=-2,表示问题不可行,若exitflag=-4,表示搜索节点数超过了设定的搜索节点最大个数,若exitflag=-5,表示搜索时间超过了设定的指令运行的最大秒数,若exitflag=-6,表示LP求解器在某节点处求解LP松弛问题时的迭代次数超过了设定的迭代次数;output包含使用算法、迭代次数、搜索过的节点数、算法执行时间、算法终止

原因。

【例】 求解下述0-1规划问题。

max z?x1?2x2?2x3?6x4?4x5?3x1?2x2?x3?x4?2x5?5 ?s.. t2x?4x?2x?x?2x?5?12345?x?0或1(i?1,2,?,5)?i利用bintprog函数求解如下: f=-[1;2;2;-6;-4];

A=[3,2,-1,4,2; 2,4, -2,-1,-2]; b=[5;5] ;

[x,fval,exit,output]=bintprog(f,A,b) 非线性规划

有约束的一元函数的最小值

在MATLAB中使用fminbnd函数求一元函数y?f(x)在区间(x1,x2)上的最小值。其调用格式有:

[x,fval,exitflag,output] = fminbnd(fun,x1,x2,options)

其中输入参数fun为目标函数的表达式字符串或MATLAB定义的M函数,x1和x2为自变量x的取值范围,options为指定优化参数选项;输出参数x为函数fun在区间

x1

output为优化信息,参见optimset函数。

若参数exitflag>0,表示函数收敛于x,若exitflag=0,表示超过函数估计值或迭代的最大数字,exitflag<0表示函数不收敛于x;若参数output=iterations表示迭代次数,output=funccount表示函数赋值次数,output=algorithm表示所使用的算法。

x3+cosx+xlogx%【例】计算函数f(x)=在区间(0,1)内的最小值。

ex[x,fval,exitflag,output]=fminbnd('(x^3+cos(x)+x*log(x))/exp(x)',0,1)

表明该函数在x =0.5223时取最小值0.3974。 为简化输出结果,可输入:

[x,fval]=fminbnd('(x^3+cos(x)+x*log(x))/exp(x)',0,1)

无约束多元函数最小值 fminsearch函数 该函数的调用格式为:

[x,fval,exitflag,output]= fminsearch(fun,x0,options)

其中输入参数fun为目标函数的表达式字符串或MATLAB自定义的M函数,x0为初始点,options为指定优化参数选项;输出参数x为多元函数的最小值点,fval为最小值,exitflag和output与单变量情形一致。

32-10x1x2+x2%【例】求y=2x13+4x1x2的最小值点。

%在命令窗口输入:

[x,fval]=fminsearch('2*x(1)^3+4*x(1)*x(2)^3-10*x(1)*x(2)+x(2)^2', [0,0]) 输出结果为:

x =

1.0016 0.8335 fval = -3.3241

表明当x1=1.0016,x2=0.8335时函数的最小值为-3.3241。

有约束的多元函数最小值

非线性有约束的多元函数的标准形式为:

minxf(x)

ìC(x)£0????Ceq(x)=0?? s.t ?xbíA祝??Aeq?xbeq??????lb#xub其中:x,b,beq,lb,ub是向量,A,Aeq为矩阵,C(x)、Ceq(x)是返回向量的函数,f(x)为目标函数,f(x)、C(x)、Ceq(x)可以是非线性函数。

在MATLAB用fmincon函数,求有约束的多元函数的最小值,其调用格式有: x = fmincon(fun,x0,A,b) x = fmincon(fun,x0,A,b,Aeq,beq) x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub)

x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon) x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options) [x,fval] = fmincon(?) [x,fval,exitflag] = fmincon(?) [x,fval,exitflag,output] = fmincon(?) [x,fval,exitflag,output,lambda] = fmincon(?) [x,fval,exitflag,output,lambda,grad] = fmincon(?) [x,fval,exitflag,output,lambda,grad,hessian] = fmincon(?)

其中fun为目标函数,它可用前面的方法定义;x0为初始值;A、b满足线性不等式约束A祝xAeq?xb,若没有不等式约束,则取A=[],b=[];Aeq、beq满足等式约束

ub,若没有界,可设

beq,若没有,则取Aeq=[],beq=[];lb、ub满足lb#xlb=[],ub=[];nonlcon的作用是通过接受的向量x来计算非线性不等约束C(x)£0和等式约束Ceq(x)=0分别在x处的估计C和Ceq,通过M文件建立,如:

>>x = fmincon(@myfun,x0,A,b,Aeq,beq,lb,ub,@mycon),先建立非线性约束函数,并保存为mycon.m:function [C,Ceq] = mycon(x)

C = ? % 计算x处的非线性不等约束C(x)£0的函数值。 Ceq = ? % 计算x处的非线性等式约束Ceq(x)=0的函数值。

输出参数x为多元函数的最小值点,fval为最小值,exitflag和output与单变量情形一致,lambda是Lagrange乘子,它体现哪一个约束有效,grad为函数在解x处的梯度值,hessian为目标函数在解x处的海赛(Hessian)值。

【例】求下面问题在初始点x=(10, 10, 10)处的最优解。 min f(x)=-x1x2x3 sub.to 0?x12x2+2x3 72

解:约束条件的标准形式为 sub.to -x1-2x2-2x3 0

x1+2x2+2x3 72

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

Top