MatLab
知识小结
matlab
常用到的永久变量。
ans :计算结果的默认变量名。
i j :基本虚数单位。
eps :系统的浮点 (F10a9Bg 个 oht) :
inf: 无限大,例 1/0
nan NaN :非数值 (N 航 a nmnb 谢 )
pi :圆周率 n(n = 3 . 1415926 .. ) 。
realmax :系统所能表示的最大数值。
realmin: 系统所能表示的最小数值,
nargin: 函数的输入参数个数:
nargout :函数的输出多数个数
① matlab 的所有运算都定义在复数城上。对于方根问题运算只返回处于第一象限的解。
⑦ matlab 分别用左斜/和右 / 来表示“左除和“右除”运算。对于标量运算而言,这两者的作用没有区别:但对于矩阵运算来说,二者将产生不同的结果。
多项式的表示方法和运算
p(x)=x^3-3x-5 可以表示为 p=[1 0 – 3 5], 求 x = 5 时的值用 plotval(p,5)
也可以求向量: a=[3 4 5],plotval(p,a)
函数 roots 求多项式的根 roots(p)
p=[1 0 -3 5];
r=roots(p)
由根重组多项式 poly( 根 )
q=poly(r)
real(q) 有时会产生虚根,这时用 real 抽取实根即可
conv(a,b) 函数 多项式乘法(执行两个数组的卷积)
a=[1 2 3 4];
b=[1 4 9 16];
c=conv(a,b)
多项式的加减法,低阶的多项式必须用首零填补,使其与高阶多项式有同样的阶次
多项式除法 [q , r]=deconv(c , b) 表示 b/c q 为商多项式, r 为余数
多项式的导数 polyder(f)
f=[ 2 4 5 6 2 1];
s=polyder(f)
多项式的曲线拟合
x=[1 2 3 4 5];
y=[5.6 40 150 250 498.9];
p=polyfit(x,y,n) 数据的 n 次多项式拟合 poly :矩阵的特征多项式、根集对应的多项式
x2=1:0.1:5; n 取 1 时,即为最小二乘法
y2=polyval(p,x2); 计算多项式的值 ( polyvalm 计算矩阵多项式)
plot(x,y,'*',x2,y2);grid on
最小二乘法
x=[1 2 3 4 5];
y=[5.6 40 150 250 498.9];
plot(x,y,’*’),lsline
多项式插值 ( p158 )
YI=interp1(x,y,XI,’method’) 一维插值
(XI 为插值点的自变量坐标向量 , 可以为数组或单个数。
method 为选择插值算法的方法,包括:
linear( 线性插值 )
cubic( 立方插值 )
spline( 三次样条插值 )
nearst( 最近临插值 )
例如:人口预测
year=1900:10:1900;
number=[78 91 105 … . 每十年的人口数 ];
x=1900:1:2000;
y=interp1(year,number,x,’spline’);
plot(year,numeber,’*’,x,y);grid on
一维博里叶变换插值使用函数 interpft 实现,计算含有周期函数值的矢量的傅里叶变换
然后使用更多的点进行傅里叶变换的逆变换,函数的使用格式如下: y=interpft(x,n) 其中 x 是含有周期函数值的矢量,并为等距的点, n 为返同等间距点的个数。
求解一元函数的最小值
y=fminbnd('humps',0.3,1) humps 为一内置函数
求解多元函数的最小值
函数 fminserch 用于求多元函数的最小值。它可以指定一个开始的矢量,并非指定一个区间。此函数返回一个矢量为此多元函数局部最小函数值对应的自变量
纹理成图功能
由 warp 函数的纹理成图功能实现平面图像在空间三维曲面上的显示。
将文件名为 flowers.tif 的图像分别投影到圆柱形和球星表面上
i=imread('flowers.tif');
[x,y,z]=cylinder;
subplot(1,2,1),warp(x,y,z,i);
[x,y,z]=sphere(50);
subplot(1,2,2),warp(x,y,z,i);
warp(x,y,z,i);
求函数的零点
求函数 humps 在 [1 , 2] 区间上的零点 fzero(‘humps’,[1,2]);
也可以给一个初始值 fzero( ‘ humps ’ ,0.9);
对于多项式可直接由 roots 求其根 roots(‘4*x^3+……’);
也可以用 solve
c=sym('c','real');
x=sym('x','real');
s=solve(x^3-x+c)
函数定积分
q=quadl(‘humps’,0,1) 求 humps 函数在 0 1 区间上的定积分,也可以用 quad 语句
二重积分 首先计算内积分,然后借助内积分的中间结果再求出二重积分的值,类似于积分中的分步积分法。
Result=dblquad(‘integrnd’,xin,xmax.,ymin,ymax) integrnd 为被积函数的名称字符串
符号积分运算 int(f)
最精确的是符号积分法
计算 s= ∫ 12[ ∫ 01xydx]dy
syms x y 中间为空格,不能为逗号
s=int(int( ‘ x^y ’ , ’ x ’ ,0,1), ’ y ’ ,1,2) 引号可省略
vpa(s) 显示 s 的值
内积分限为函数的二重积分
I= ∫ 14[ ∫√ y2(x2+y2)dx]dy
符号法 I=vpa(int(int( ‘ x^2+y^2’, ’ x ’ ,sqrt(y),2), ’ y ’ ,1,4)
微分运算( diff )
微分是描述一个函数在一点处的斜率,是函数的微观性质、因此积分对函数的形状在小范围内的改变不敏感,而微分很敏感。 —个函数的小的变化,容易产生相邻点的斜率的大的改变。由干微分这个固有的困难.所以尽可能避免数值微分.特别是对实验获得的数据进行微分。在这种情况,最好用最小二乘曲线拟合这种数据,然后对所得到的多项式进行微分;或用另一种方法对点数据进行三次样条拟合,然后寻找样条微分,但是,有时微分运算是不能避免的,在 MATLAB 中.用函数 diff 汁算一个矢量或者矩阵的微分 ( 也可以理解为差分 ) 。
a=[1 2 3 3 3 7 8 9];
b=diff(a) 一次微分
bb=diff(a,2) 二次微分
实际上 diff(a)=[a(2)-a(1),a(3)-a(2), …… ,a(n)-a(n-1)]
对于求矩阵的微分,即为求各列矢量的微分,从矢量的微分值可以判断矢量的单调性、是否等间距以及是否有重复的元素。
符号微分运算 (diff)
syms x t a
f =cos(a*x)
df =diff(f) 由 findsym 的规则,隐式的指定对 x 进行微分
dfa=diff(f,'a') 指定对变量 a 进行微分
dfa=diff(f,'a',3) 三次微分
diff 函数不仅作用在标量上,还可以在矩阵上,运算规则就是按矩阵的元素分别进行微分
syms a x
A=[cos(a*x),sin(a*x),-sin(a*x),cos(a*x)];
dA=diff(A)
微分方程 dsolve
在 matlab 中,符号表达式中包含字母 D 用来表示微分运算, D2,D3 分别对应第二,第三阶导数, D2y 表示 d2y/dt2 把 t 缺省了
y=dsolve( ‘ Dy=f(y) ’ ) 单个方程,单个输出
[u,v]=dsolve(‘Du=f(u,v)’,’Dv=g(u,v)’) 2 个方程, 2 个输出
s=dsolve(‘Dx=f(x,y,z)’,’Dy=g(x,y,z)’,’Dz=k(x,y,z)’)
s.x s.y s.z 3 个方程,架构数组
dsolve('Dx=-a*x') 结果: C1*exp(-a*t) 没给定初值,所以结果中含参变量
x=dsolve('Dx=-a*x','x(0)=1','s') 结果 exp(-a*s) 给定了初值,独立变量设为 s
计算多元函数的梯度
fx=gradient(f) f 是一个矢量返回 f 的一维数值梯度, fx 对应于 x 方向的微分。
[x,y]=meshgrid(-2:.2:2,-2:.2:2);
z=x.*exp(-x.^2-y.^2);
[px,py]=gradient(z,.2,.2);
contour(z),hold on 画等值线
quiver(px,py)
matlab 字符串运算
利用 sym 命令创建表达式
f=sym( ‘ cos(x)+sin(x) ’ ) 或 syms x , f=cos(x)+sin(x)
diff(f) 求其导数
(也可直接用命令 f=diff( ‘ cos(x)+cos(y) ’ )
当字符表达式中含有多于一个的变量时,只有—个变量是独立变量。如果不告诉 matlab 哪一个变量是独立变量,则可以通过 findsym 命令询问
利用 findsym 命令查询独立变量
f=sym('sin(a*x)+b')
findsym(f,1) 给出独立变量(一个变量,如果为 2 则给出 2 个变量)
findsym(f) 给出所有变量
符号表达式的化简和替换
collect 函数 collect ( f , v )表示将 f 表示为关于符号变量 v 的多项式形式,即关于 v 合并同类项, v 缺省,则用 findsym 确定的缺省变量
syms x y
f=x^2*y+y*x-x^2-2*x+1
collect(f) 得到 (-1+y)*x^2+(y-2)*x+1
collect(f,y) 得到 (x+x^2)*y+1-x^2-2*x
expand 函数 expand ( f )将 f 展开,写成和的形式
syms x
expand((x-1)^3) 得到 x^3-3*x^2+3*x-1
horner 函数 horner(f) 将 f 写成镶嵌套形式
syms x
horner(x^3-6*x^2) 得到 (-6+x)*x^2
factor 函数 factor ( f )将 f 转换成低阶有理多项式的乘积
syms x
f=x^3-6*x^2+11*x-6
factor(f) 得到 (x-1)*(x-2)*(x-3)
simplify(f) 函数 综合化简
simple(f) 函数的最简形式
syms x
f=2*sin(x^2)+cos(3*x)
simple(f) 如果不想看到中间过程,可 z=simple(f) 有时使用两次 simple 命令可以得到最简式
如果想知道哪个简化命令得到最后结果,可以加一个参数 how
[z,how]=simple(f)
符号表达式的替换
subs(f,new,old)
f='a*x^2+b*x+c'
subs(f,'t','x') 得到 a*(t)^2+b*(t)+c subs 是一个符号函数,返回一个符号变量
subexpr 函数 有时 matlab 返回的符号表达式难以理解,用 subexpr 函数,可以将表达式中重复出现的子式用一个符号表示,从而简化表达形式
c=sym('c','real');
x=sym('x','real');
s=solve(x^3-x+c)
a=subexpr(s) 得到 sigma = -108*c+12*(-12+81*c^2)^(1/2)
a =
[ 1/6*sigma^(1/3)+2/sigma^(1/3)]
[ -1/12*sigma^(1/3)-1/sigma^(1/3)+1/2*i*3^(1/2)*(1/6*sigma^(1/3)-2/sigma^(1/3))]
[ -1/12*sigma^(1/3)-1/sigma^(1/3)-1/2*i*3^(1/2)*(1/6*sigma^(1/3)-2/sigma^(1/3))]
pretty 函数有时也能起到同样的作用。
Pretty(f) 显示函数的习惯书写形式
线性方程组的求解
求解线性方程组,用反斜杠 /
a=hilb(3)
b=[1 2 3]'
a/b
矩阵的特征值和特征向量
用 eig(v,d) 函数, [v,d]=eig(A); 其中 d 将返回特征值, v 返回相应的特征向量,缺省第二个参数将只返回特征值
syms a b c real
A=[a b c; b c a; c a b];
[v,d]=eig(A);
为了观察更清楚,使用以前学过的替换函数,这里不用默认的 sigma ,而改用 M ,显式的代替繁琐的表达子式
vv=subexpr(v);
vs=subs(vv,'m','sigma') 运行结果为
vs =
[ 1, 1, 1]
[ -(c+(m)-a)/(c-b), -(c-(m)-a)/(c-b), 1]
[ -(a-(m)-b)/(c-b), -(a+(m)-b)/(c-b), 1]
再用 m 替换 d 中的表达子式
dd=subexpr(d);
ds=subs(dd,’m’,’sigma’)
运行结果为 ds =
[ (m), 0, 0]
[ 0, -(m), 0]
[ 0, 0, c+a+b]
note 求特征值也可用以下命令
f=poly(A) poly 函数 用来求 A 的特征多项式
d=solve(f) solve ( f )函数用来求多项式的解
svd( ) 函数 求矩阵的奇异值分解,将矩阵分解为两个正交矩阵和对角矩阵的乘积
a=sym(hilb(2))
[u,s,v]=svd(a)
代数方程和方程组
代数方程的求解可用 solve(f) 命令,如果 f 不含=, matlab 将给表达式置零。方程的未知量在默认的情况下由 findsym 决定或显式指出
syms a b c x
solve(a*x^2+b*x+c) 以 x 为默认变量
solve(a*x^2+b*x+c , a) 指定对 a 为变量
求含有等号的方程的解(一定要加单引号)
f=solve(‘cos(x)=sin(x)’)
x=solve('exp(x)=tan(x)') 如果不能求得符号解,就计算可变精度解。
求解方程组与单方程类似
解一个三元一次方程
v=solve('a*u^2+v^2','u-v=1','a^2-5*a+6')
结果为 v =
a: [4x1 sym] u: [4x1 sym] v: [4x1 sym]
一些常用的符号运算
极限运算 limit
limit(f) 求 x 到 0 的极限
limit(f,x,a) 或 limit(f,a) 求 x 到 a 的极限
limit(f,a, ’ left ’ ) limit(f,a, ’ right ’ ) 求 x 到 a 的左极限和右极限
limit(f,inf) 求 x 趋于无穷的极限
符号求和 symsum(s)
symsum(s) 以默认的 findsym 决定的变量求和
symsum(s,v) 以 s 中指定的变量 v 求和
symsum(s,a,b) symsum(s,v,a,b) 从 a 到 b 的有限项求和
syms k n
symsum(k) 从 0 到 k 求和
symsum(k,0,n-1) 从 0 到 n - 1 求和
symsum(1/k^2,1,inf) 无限项求和
泰勒级数 taylor(f)
taylor(f) 表示求 f 的 5 阶 talor 展开,可以增加参数指定展开的阶数(默认式 5 ),也可以对于多元函数指定展开的变量,还可以指定在哪个点展开
syms x t
taylor(exp(-x))
taylor(log(x),6,1) 在 1 点的 6 阶 taylor 展开
taylor(x^t,3,t) 对 t 的 3 阶 taylor 展开
积分变换
fourier 变换和逆变换 fourier ( f )
fourier 分析可以将信号转换为不同频率的正弦曲线。可对离散数据进行分析,也可对连续时间系统进行分析,特别在信号和图形处理领域。离散变换( DFT )作用于有限数据的采集,最有效的是快速 fourier 变换( FFT )
F=fourier(f) 独立变量 x ,返回关于参数 w 的函数
F=fourier(f,v) 返回函数 F 关于符号对象 v 的函数
F=fourier(f,u,v) 对关于 u 的函数 f 进行变换,而不是缺省的 w ,返回函数 F 是关于 v 的函数
syms t v w x
fourier(1/t)
fourier(exp(-t)*sym('Heaviside(t)'),v)
fourier(diff(sym('F(x)')),x,w)
Fourier 逆变换
f=ifourier(F) 缺省独立变量 w ,返回关于 x 的函数对 w 进行积分
f=ifourier(F,v) 返回函数 f 是关于符号对象 v 的函数,而不是缺省的 x
f=ifourier(F,u,v) 是关于 u 的函数 f 进行变换,而不是缺省的 x ,返回函数 f 是关于 v 的函数
Laplace 变换和逆变换 laplace(f)
应用于连续系统(微分方程)中,可以用来求解微分方程的初值问题
laplace(F) 缺省独立变量 t ,缺省返回关于 s 的函数 L
laplace(F,t) 返回关于 t 的函数 L ,而不是缺省的 s
laplace(F,w,z) 对函数 F 的自变量 w 积分,返回关于 z 的函数 L
逆变换
F=ilaplace(L) 缺省独立变量 s ,返回关于 t 的函数 F
F=ilaplace(L,y) 返回关于 y 的函数 F ,而不是缺省的 t
F=ilaplace(L,y,x) 对函数 L 的自变量 y 积分,返回关于 x 的函数 F
Z- 变换和逆变换 ztrans(f) 标量符号 f 的 Z -变换
F=ztrans(f) 缺省独立变量 n ,返回关于 z 的函数
F=ztrans(f,w) 返回关于符号变量 w 的函数 F ,而不是缺省的 z
F=ztrans(f,k,w) 关于 k 的符号变量作 Z -变换返回关于符号变量 w 的函数
逆变换 iztrans(F)
f=iztrans(F) 或 (F,k) 或 (F,w,k)
符号绘图函数
符号函数简易绘图函数 ezplot(f)
f 可以包含单个符号变量 x 的字符串或表达式,默认画图区间(- 2pi , 2pi ),如果 f 包含 x 和 y ,画出的图像是 f(x,y)=0 的图像,缺省区间是- 2pi<x<2pi,-2pi<y<2pi 。
Ezplot(f,xmin,xmax) 或 ezplot(f,[xmin,xmax]) 绘制在 xmin<x<xmax 区间上图像
syms x t
ezplot('t*cos(t)','t*sin(t)',[0,4*pi])
绘制符号图像函数 fplot(fun,lims,tol, ’ linespec ’ ,n)
其中 lims=[xmin,xmax] 或 [xmin,xmax,ymin,ymax] tol 为指定相对误差,默认 0.001 ‘ linespec ’指定绘图的线型 n 指定最少以 n + 1 个点绘图
[x,y]=fplot(fun,lims,…) 只返回用来绘图的点,并不绘图,可以自己调用 plot(x,y) 来绘制图形。
syms x
subplot(2,2,1),fplot('humps',[0,1])
f='abs(exp(x*(0:9))*ones(10,1))'
subplot(2,2,2),fplot(f,[0,2*pi])
subplot(2,2,3),fplot('sin(1./x)',[0.01,0.1],1e-3)
matlab 绘图
二维图形的绘制
plot 在 (x,y) 坐标下绘制二维图像 支持多个 x - y 二元结构
plot3 在 (x,y,z) 坐标下绘制三维图形
loglog 在 (x,y) 对数坐标下绘制二维图形
semilogx 在 x 为对数坐标, y 为线性坐标的二维坐标中绘图
semilogy 在 x 为线性坐标, y 为对数坐标的二维坐标中绘图
plotyy 在有两个 y 轴的坐标下绘图
plot 用法
plot(x,y,'--rs','linewidth',2,'markeredgecolor','k',...
'markerfacecolor','g','markersize',10)
plotyy 用法
plotyy(x1,y1,x2,y2) 以 x1 为标准,左轴为 y 轴绘制 y1 向量, x2 为基准,右轴为 y 轴,绘制 y2 向量
plotyy(x1,y1,x2,y2,fun) 用字符串 fun 指定的绘图函数 (plot ,semilogx,semilogy,loglog,stem)
plotyy((x1,y1,x2,y2,fun1,fun2)
t=0:pi/20:2*pi;
y=exp(sin(t));
plotyy(t,y,t,y,'plot','stem') stem 为二维杆图
[ax,h1,h2]=plotyy( … ) 返回左右两 y 轴的句柄(分别为 ax(1) ax(2) ,以及在两坐标轴中生成的图形对象的句柄,分别为 h1 h2
t=0:900;
A=1000;
a=0.005;
b=0.005;
z2=cos(b*t);
z1=A*exp(-a*t);
[haxes,hline1,hline2]=plotyy(t,z1,t,z2,'semilogy','plot');
axes(haxes(1))
ylabel('semilog plot') 对数坐标
axes(haxes(2))
ylabel('linear plot')
set(hline2,'linestyle','--')
其他二维图形绘图指令
bar(x,y) 二维条形图
hist(y,n) 直方图
histfit(y,n) 带拟和线的直方图, n 为直方的个数
stem(x,y) 火柴杆图
comet(x,y) 彗星状轨迹图
compass(x,y) 罗盘图
errorbar(x,y,l,u) 误差限图
feather(x,y) 羽毛状图
fill(x,y, ’ r ’ ) 二维填充函数 以红色填充
pie(x) 饼图
polar(t,r) 极坐标图 r 为幅值向量, t 为角度向量
t=0:0.1:8*pi;
r=cos(3*t/2)+1/2;
polar(t,r),xlabel('polar 指令 ')
quiver(x,y) 磁力线图
stairs(x,y) 阶梯图
loglog(x,y) 对数图
semilogx semilogy 半对数图
matlab 三维作图
plot3(x,y,z) 三维线条图
t=0:pi/50:15*pi;
plot3(sin(t),cos(t),t,'r*') 与 plot 相似
v=axis 返回各个轴的范围
text(0,0,0,'origin') 在某个坐标点加入文字
plot3 增加维数可以一次画多个图,使所个二维图形眼一个轴排列
三维网线图的绘制
mesh(x,y,z) 网格图
mesh(x,y,z,c) 四维作图 ,(x,y,z) 代表空间三维, c 代表颜色维
mesh(…,’property name’,property value,…) 设置曲面各属性的值
[x,y,z]=sphere(12);
mesh(x,y,z) , hidden off 曲面设置为透明
meshc(x,y,z) 画网格图和基本的等值线图
meshz(x,y,z) 画包含零平面的网格图
waterfall(x,y,z) 与 mesh 一样,只是在效果上它的网格线只在 x 轴一个方向出现,呈瀑布状水线
两个变量的标量指令 meshgrid(x) 或 meshgrid(x,y) (p179)
将两个一维向量生成两个二维向量,以便进行 z=f(x,y) 运算,算出 z 的所有值, z 为 x y 的标量指令
[X,Y]=meshgrid(x) meshgrid(x,x) 的简略式
[X,Y]=meshgrid(x,y)
[X,Y,Z]=meshgrid(x,y,z) 用于三维图形的绘制
[x,y]=meshgrid([-2:0.1:2]);
z=x.*exp(-x.^2-y.^2);
plot3(x,y,z)
surf(x,y,z,c) 着色表面图
surf(x,y,z) 隐含着 c=z
surf ( z ) 隐含着 x , y 的值为 surf 指令根据 z 的尺寸自动生成
surfc 画出具有基本等值线的曲面图
surfl 画出一个具有亮度的曲面图
shading flat 网线图的某整条线段或曲面图的某个贴片都着一种颜色
shading interp 某一线段或贴片上各点的颜色由线或片的顶端颜色经线性插值而得
曲面图不能设成网格图那样透明,但需要时,可以在孔洞处将数据设成 nun
等高线的绘制
在二维空间绘制等高线 contour
contour(x,y,z,n) 绘制 n 条等值线( n 可省略)
contour(x,y,z,v) 在向量 v 所指定的高度上绘制等高线(可省)
c=contour(x,y,z) 计算等值线的高度值
c=contourc(x,y,z,n) 计算 n 条等高线的 x - y 坐标数据
c=contourc(x,y,z,v) 计算向量 v 所指定的等高线的 x - y 坐标数据
clabel(c) 给 c 阵所表示的等高线加注高度标识
clabel(c,v) 给向量 v 所指定的等高线加注高度标识
clabel(c,’manual’) 借助鼠标给点中的等高线加注高度标识
三维空间绘制等高线 contour3(x,y,z)
[x,y,z]=peaks(30);
contour3(x,y,z,16,'g')
二元函数的伪彩图 pcolor(x,y,z)
是指令 surf 的二维等效指令,代表伪彩色,可与 contour 单色等值线结合画彩色等值线图
[x,y,z]=peaks(30);
pcolor(x,y,z); 伪彩色
shading interp 颜色插值,使颜色平均渐变
hold on,contour(x,y,z,20,'k')... 画等值线
colorbar('horiz') 水平颜色标尺
c=contour(x,y,z,8);
clabel(c) 标注等高线
矢量场图 ( 速度图 )quiver
用于描述函数 z=f(x,y) 在点 (x,y) 的梯度大小和方向
[X,Y]=meshgrid(x,y) X,Y 为 Z 阵元素的坐标矩阵
[U,V]=gradient(Z,dx,dy) U , V 分别为 Z 对 x 对 y 的导数, dx dy 是 x y 方向上的计算步长
quiver(X,Y,U,V,s,’linespec’,’filled’) U , V 为必选项,决定矢量场图中各矢量的大小和方向, s 为指定所画箭头的大小,缺省时取 1,linespec 为字符串,指定合法的线形和彩色, filled 用于填充定义的绘图标识符
[x,y]=meshgrid(-2:.2:2,-1:.15:1);
z=x.*exp(-y.^2);
[px,py]=gradient(z,.2,.15);
contour(x,y,z);
hold on,quiver(x,y,px,py),axis image
多边形的填色 fill(x,y,c)
c 定义颜色字符串,可以是’ r ’ , ’ b ’等,也可以用 RGB 三色表示 [r,g,b] 值为 0-1
图形的四维表现
ans :计算结果的默认变量名。
i j :基本虚数单位。
eps :系统的浮点 (F10a9Bg 个 oht) :
inf: 无限大,例 1/0
nan NaN :非数值 (N 航 a nmnb 谢 )
pi :圆周率 n(n = 3 . 1415926 .. ) 。
realmax :系统所能表示的最大数值。
realmin: 系统所能表示的最小数值,
nargin: 函数的输入参数个数:
nargout :函数的输出多数个数
① matlab 的所有运算都定义在复数城上。对于方根问题运算只返回处于第一象限的解。
⑦ matlab 分别用左斜/和右 / 来表示“左除和“右除”运算。对于标量运算而言,这两者的作用没有区别:但对于矩阵运算来说,二者将产生不同的结果。
多项式的表示方法和运算
p(x)=x^3-3x-5 可以表示为 p=[1 0 – 3 5], 求 x = 5 时的值用 plotval(p,5)
也可以求向量: a=[3 4 5],plotval(p,a)
函数 roots 求多项式的根 roots(p)
p=[1 0 -3 5];
r=roots(p)
由根重组多项式 poly( 根 )
q=poly(r)
real(q) 有时会产生虚根,这时用 real 抽取实根即可
conv(a,b) 函数 多项式乘法(执行两个数组的卷积)
a=[1 2 3 4];
b=[1 4 9 16];
c=conv(a,b)
多项式的加减法,低阶的多项式必须用首零填补,使其与高阶多项式有同样的阶次
多项式除法 [q , r]=deconv(c , b) 表示 b/c q 为商多项式, r 为余数
多项式的导数 polyder(f)
f=[ 2 4 5 6 2 1];
s=polyder(f)
多项式的曲线拟合
x=[1 2 3 4 5];
y=[5.6 40 150 250 498.9];
p=polyfit(x,y,n) 数据的 n 次多项式拟合 poly :矩阵的特征多项式、根集对应的多项式
x2=1:0.1:5; n 取 1 时,即为最小二乘法
y2=polyval(p,x2); 计算多项式的值 ( polyvalm 计算矩阵多项式)
plot(x,y,'*',x2,y2);grid on
最小二乘法
x=[1 2 3 4 5];
y=[5.6 40 150 250 498.9];
plot(x,y,’*’),lsline
多项式插值 ( p158 )
YI=interp1(x,y,XI,’method’) 一维插值
(XI 为插值点的自变量坐标向量 , 可以为数组或单个数。
method 为选择插值算法的方法,包括:
linear( 线性插值 )
cubic( 立方插值 )
spline( 三次样条插值 )
nearst( 最近临插值 )
例如:人口预测
year=1900:10:1900;
number=[78 91 105 … . 每十年的人口数 ];
x=1900:1:2000;
y=interp1(year,number,x,’spline’);
plot(year,numeber,’*’,x,y);grid on
一维博里叶变换插值使用函数 interpft 实现,计算含有周期函数值的矢量的傅里叶变换
然后使用更多的点进行傅里叶变换的逆变换,函数的使用格式如下: y=interpft(x,n) 其中 x 是含有周期函数值的矢量,并为等距的点, n 为返同等间距点的个数。
求解一元函数的最小值
y=fminbnd('humps',0.3,1) humps 为一内置函数
求解多元函数的最小值
函数 fminserch 用于求多元函数的最小值。它可以指定一个开始的矢量,并非指定一个区间。此函数返回一个矢量为此多元函数局部最小函数值对应的自变量
纹理成图功能
由 warp 函数的纹理成图功能实现平面图像在空间三维曲面上的显示。
将文件名为 flowers.tif 的图像分别投影到圆柱形和球星表面上
i=imread('flowers.tif');
[x,y,z]=cylinder;
subplot(1,2,1),warp(x,y,z,i);
[x,y,z]=sphere(50);
subplot(1,2,2),warp(x,y,z,i);
warp(x,y,z,i);
求函数的零点
求函数 humps 在 [1 , 2] 区间上的零点 fzero(‘humps’,[1,2]);
也可以给一个初始值 fzero( ‘ humps ’ ,0.9);
对于多项式可直接由 roots 求其根 roots(‘4*x^3+……’);
也可以用 solve
c=sym('c','real');
x=sym('x','real');
s=solve(x^3-x+c)
函数定积分
q=quadl(‘humps’,0,1) 求 humps 函数在 0 1 区间上的定积分,也可以用 quad 语句
二重积分 首先计算内积分,然后借助内积分的中间结果再求出二重积分的值,类似于积分中的分步积分法。
Result=dblquad(‘integrnd’,xin,xmax.,ymin,ymax) integrnd 为被积函数的名称字符串
符号积分运算 int(f)
最精确的是符号积分法
计算 s= ∫ 12[ ∫ 01xydx]dy
syms x y 中间为空格,不能为逗号
s=int(int( ‘ x^y ’ , ’ x ’ ,0,1), ’ y ’ ,1,2) 引号可省略
vpa(s) 显示 s 的值
内积分限为函数的二重积分
I= ∫ 14[ ∫√ y2(x2+y2)dx]dy
符号法 I=vpa(int(int( ‘ x^2+y^2’, ’ x ’ ,sqrt(y),2), ’ y ’ ,1,4)
微分运算( diff )
微分是描述一个函数在一点处的斜率,是函数的微观性质、因此积分对函数的形状在小范围内的改变不敏感,而微分很敏感。 —个函数的小的变化,容易产生相邻点的斜率的大的改变。由干微分这个固有的困难.所以尽可能避免数值微分.特别是对实验获得的数据进行微分。在这种情况,最好用最小二乘曲线拟合这种数据,然后对所得到的多项式进行微分;或用另一种方法对点数据进行三次样条拟合,然后寻找样条微分,但是,有时微分运算是不能避免的,在 MATLAB 中.用函数 diff 汁算一个矢量或者矩阵的微分 ( 也可以理解为差分 ) 。
a=[1 2 3 3 3 7 8 9];
b=diff(a) 一次微分
bb=diff(a,2) 二次微分
实际上 diff(a)=[a(2)-a(1),a(3)-a(2), …… ,a(n)-a(n-1)]
对于求矩阵的微分,即为求各列矢量的微分,从矢量的微分值可以判断矢量的单调性、是否等间距以及是否有重复的元素。
符号微分运算 (diff)
syms x t a
f =cos(a*x)
df =diff(f) 由 findsym 的规则,隐式的指定对 x 进行微分
dfa=diff(f,'a') 指定对变量 a 进行微分
dfa=diff(f,'a',3) 三次微分
diff 函数不仅作用在标量上,还可以在矩阵上,运算规则就是按矩阵的元素分别进行微分
syms a x
A=[cos(a*x),sin(a*x),-sin(a*x),cos(a*x)];
dA=diff(A)
微分方程 dsolve
在 matlab 中,符号表达式中包含字母 D 用来表示微分运算, D2,D3 分别对应第二,第三阶导数, D2y 表示 d2y/dt2 把 t 缺省了
y=dsolve( ‘ Dy=f(y) ’ ) 单个方程,单个输出
[u,v]=dsolve(‘Du=f(u,v)’,’Dv=g(u,v)’) 2 个方程, 2 个输出
s=dsolve(‘Dx=f(x,y,z)’,’Dy=g(x,y,z)’,’Dz=k(x,y,z)’)
s.x s.y s.z 3 个方程,架构数组
dsolve('Dx=-a*x') 结果: C1*exp(-a*t) 没给定初值,所以结果中含参变量
x=dsolve('Dx=-a*x','x(0)=1','s') 结果 exp(-a*s) 给定了初值,独立变量设为 s
计算多元函数的梯度
fx=gradient(f) f 是一个矢量返回 f 的一维数值梯度, fx 对应于 x 方向的微分。
[x,y]=meshgrid(-2:.2:2,-2:.2:2);
z=x.*exp(-x.^2-y.^2);
[px,py]=gradient(z,.2,.2);
contour(z),hold on 画等值线
quiver(px,py)
matlab 字符串运算
利用 sym 命令创建表达式
f=sym( ‘ cos(x)+sin(x) ’ ) 或 syms x , f=cos(x)+sin(x)
diff(f) 求其导数
(也可直接用命令 f=diff( ‘ cos(x)+cos(y) ’ )
当字符表达式中含有多于一个的变量时,只有—个变量是独立变量。如果不告诉 matlab 哪一个变量是独立变量,则可以通过 findsym 命令询问
利用 findsym 命令查询独立变量
f=sym('sin(a*x)+b')
findsym(f,1) 给出独立变量(一个变量,如果为 2 则给出 2 个变量)
findsym(f) 给出所有变量
符号表达式的化简和替换
collect 函数 collect ( f , v )表示将 f 表示为关于符号变量 v 的多项式形式,即关于 v 合并同类项, v 缺省,则用 findsym 确定的缺省变量
syms x y
f=x^2*y+y*x-x^2-2*x+1
collect(f) 得到 (-1+y)*x^2+(y-2)*x+1
collect(f,y) 得到 (x+x^2)*y+1-x^2-2*x
expand 函数 expand ( f )将 f 展开,写成和的形式
syms x
expand((x-1)^3) 得到 x^3-3*x^2+3*x-1
horner 函数 horner(f) 将 f 写成镶嵌套形式
syms x
horner(x^3-6*x^2) 得到 (-6+x)*x^2
factor 函数 factor ( f )将 f 转换成低阶有理多项式的乘积
syms x
f=x^3-6*x^2+11*x-6
factor(f) 得到 (x-1)*(x-2)*(x-3)
simplify(f) 函数 综合化简
simple(f) 函数的最简形式
syms x
f=2*sin(x^2)+cos(3*x)
simple(f) 如果不想看到中间过程,可 z=simple(f) 有时使用两次 simple 命令可以得到最简式
如果想知道哪个简化命令得到最后结果,可以加一个参数 how
[z,how]=simple(f)
符号表达式的替换
subs(f,new,old)
f='a*x^2+b*x+c'
subs(f,'t','x') 得到 a*(t)^2+b*(t)+c subs 是一个符号函数,返回一个符号变量
subexpr 函数 有时 matlab 返回的符号表达式难以理解,用 subexpr 函数,可以将表达式中重复出现的子式用一个符号表示,从而简化表达形式
c=sym('c','real');
x=sym('x','real');
s=solve(x^3-x+c)
a=subexpr(s) 得到 sigma = -108*c+12*(-12+81*c^2)^(1/2)
a =
[ 1/6*sigma^(1/3)+2/sigma^(1/3)]
[ -1/12*sigma^(1/3)-1/sigma^(1/3)+1/2*i*3^(1/2)*(1/6*sigma^(1/3)-2/sigma^(1/3))]
[ -1/12*sigma^(1/3)-1/sigma^(1/3)-1/2*i*3^(1/2)*(1/6*sigma^(1/3)-2/sigma^(1/3))]
pretty 函数有时也能起到同样的作用。
Pretty(f) 显示函数的习惯书写形式
线性方程组的求解
求解线性方程组,用反斜杠 /
a=hilb(3)
b=[1 2 3]'
a/b
矩阵的特征值和特征向量
用 eig(v,d) 函数, [v,d]=eig(A); 其中 d 将返回特征值, v 返回相应的特征向量,缺省第二个参数将只返回特征值
syms a b c real
A=[a b c; b c a; c a b];
[v,d]=eig(A);
为了观察更清楚,使用以前学过的替换函数,这里不用默认的 sigma ,而改用 M ,显式的代替繁琐的表达子式
vv=subexpr(v);
vs=subs(vv,'m','sigma') 运行结果为
vs =
[ 1, 1, 1]
[ -(c+(m)-a)/(c-b), -(c-(m)-a)/(c-b), 1]
[ -(a-(m)-b)/(c-b), -(a+(m)-b)/(c-b), 1]
再用 m 替换 d 中的表达子式
dd=subexpr(d);
ds=subs(dd,’m’,’sigma’)
运行结果为 ds =
[ (m), 0, 0]
[ 0, -(m), 0]
[ 0, 0, c+a+b]
note 求特征值也可用以下命令
f=poly(A) poly 函数 用来求 A 的特征多项式
d=solve(f) solve ( f )函数用来求多项式的解
svd( ) 函数 求矩阵的奇异值分解,将矩阵分解为两个正交矩阵和对角矩阵的乘积
a=sym(hilb(2))
[u,s,v]=svd(a)
代数方程和方程组
代数方程的求解可用 solve(f) 命令,如果 f 不含=, matlab 将给表达式置零。方程的未知量在默认的情况下由 findsym 决定或显式指出
syms a b c x
solve(a*x^2+b*x+c) 以 x 为默认变量
solve(a*x^2+b*x+c , a) 指定对 a 为变量
求含有等号的方程的解(一定要加单引号)
f=solve(‘cos(x)=sin(x)’)
x=solve('exp(x)=tan(x)') 如果不能求得符号解,就计算可变精度解。
求解方程组与单方程类似
解一个三元一次方程
v=solve('a*u^2+v^2','u-v=1','a^2-5*a+6')
结果为 v =
a: [4x1 sym] u: [4x1 sym] v: [4x1 sym]
一些常用的符号运算
极限运算 limit
limit(f) 求 x 到 0 的极限
limit(f,x,a) 或 limit(f,a) 求 x 到 a 的极限
limit(f,a, ’ left ’ ) limit(f,a, ’ right ’ ) 求 x 到 a 的左极限和右极限
limit(f,inf) 求 x 趋于无穷的极限
符号求和 symsum(s)
symsum(s) 以默认的 findsym 决定的变量求和
symsum(s,v) 以 s 中指定的变量 v 求和
symsum(s,a,b) symsum(s,v,a,b) 从 a 到 b 的有限项求和
syms k n
symsum(k) 从 0 到 k 求和
symsum(k,0,n-1) 从 0 到 n - 1 求和
symsum(1/k^2,1,inf) 无限项求和
泰勒级数 taylor(f)
taylor(f) 表示求 f 的 5 阶 talor 展开,可以增加参数指定展开的阶数(默认式 5 ),也可以对于多元函数指定展开的变量,还可以指定在哪个点展开
syms x t
taylor(exp(-x))
taylor(log(x),6,1) 在 1 点的 6 阶 taylor 展开
taylor(x^t,3,t) 对 t 的 3 阶 taylor 展开
积分变换
fourier 变换和逆变换 fourier ( f )
fourier 分析可以将信号转换为不同频率的正弦曲线。可对离散数据进行分析,也可对连续时间系统进行分析,特别在信号和图形处理领域。离散变换( DFT )作用于有限数据的采集,最有效的是快速 fourier 变换( FFT )
F=fourier(f) 独立变量 x ,返回关于参数 w 的函数
F=fourier(f,v) 返回函数 F 关于符号对象 v 的函数
F=fourier(f,u,v) 对关于 u 的函数 f 进行变换,而不是缺省的 w ,返回函数 F 是关于 v 的函数
syms t v w x
fourier(1/t)
fourier(exp(-t)*sym('Heaviside(t)'),v)
fourier(diff(sym('F(x)')),x,w)
Fourier 逆变换
f=ifourier(F) 缺省独立变量 w ,返回关于 x 的函数对 w 进行积分
f=ifourier(F,v) 返回函数 f 是关于符号对象 v 的函数,而不是缺省的 x
f=ifourier(F,u,v) 是关于 u 的函数 f 进行变换,而不是缺省的 x ,返回函数 f 是关于 v 的函数
Laplace 变换和逆变换 laplace(f)
应用于连续系统(微分方程)中,可以用来求解微分方程的初值问题
laplace(F) 缺省独立变量 t ,缺省返回关于 s 的函数 L
laplace(F,t) 返回关于 t 的函数 L ,而不是缺省的 s
laplace(F,w,z) 对函数 F 的自变量 w 积分,返回关于 z 的函数 L
逆变换
F=ilaplace(L) 缺省独立变量 s ,返回关于 t 的函数 F
F=ilaplace(L,y) 返回关于 y 的函数 F ,而不是缺省的 t
F=ilaplace(L,y,x) 对函数 L 的自变量 y 积分,返回关于 x 的函数 F
Z- 变换和逆变换 ztrans(f) 标量符号 f 的 Z -变换
F=ztrans(f) 缺省独立变量 n ,返回关于 z 的函数
F=ztrans(f,w) 返回关于符号变量 w 的函数 F ,而不是缺省的 z
F=ztrans(f,k,w) 关于 k 的符号变量作 Z -变换返回关于符号变量 w 的函数
逆变换 iztrans(F)
f=iztrans(F) 或 (F,k) 或 (F,w,k)
符号绘图函数
符号函数简易绘图函数 ezplot(f)
f 可以包含单个符号变量 x 的字符串或表达式,默认画图区间(- 2pi , 2pi ),如果 f 包含 x 和 y ,画出的图像是 f(x,y)=0 的图像,缺省区间是- 2pi<x<2pi,-2pi<y<2pi 。
Ezplot(f,xmin,xmax) 或 ezplot(f,[xmin,xmax]) 绘制在 xmin<x<xmax 区间上图像
syms x t
ezplot('t*cos(t)','t*sin(t)',[0,4*pi])
绘制符号图像函数 fplot(fun,lims,tol, ’ linespec ’ ,n)
其中 lims=[xmin,xmax] 或 [xmin,xmax,ymin,ymax] tol 为指定相对误差,默认 0.001 ‘ linespec ’指定绘图的线型 n 指定最少以 n + 1 个点绘图
[x,y]=fplot(fun,lims,…) 只返回用来绘图的点,并不绘图,可以自己调用 plot(x,y) 来绘制图形。
syms x
subplot(2,2,1),fplot('humps',[0,1])
f='abs(exp(x*(0:9))*ones(10,1))'
subplot(2,2,2),fplot(f,[0,2*pi])
subplot(2,2,3),fplot('sin(1./x)',[0.01,0.1],1e-3)
matlab 绘图
二维图形的绘制
plot 在 (x,y) 坐标下绘制二维图像 支持多个 x - y 二元结构
plot3 在 (x,y,z) 坐标下绘制三维图形
loglog 在 (x,y) 对数坐标下绘制二维图形
semilogx 在 x 为对数坐标, y 为线性坐标的二维坐标中绘图
semilogy 在 x 为线性坐标, y 为对数坐标的二维坐标中绘图
plotyy 在有两个 y 轴的坐标下绘图
plot 用法
plot(x,y,'--rs','linewidth',2,'markeredgecolor','k',...
'markerfacecolor','g','markersize',10)
plotyy 用法
plotyy(x1,y1,x2,y2) 以 x1 为标准,左轴为 y 轴绘制 y1 向量, x2 为基准,右轴为 y 轴,绘制 y2 向量
plotyy(x1,y1,x2,y2,fun) 用字符串 fun 指定的绘图函数 (plot ,semilogx,semilogy,loglog,stem)
plotyy((x1,y1,x2,y2,fun1,fun2)
t=0:pi/20:2*pi;
y=exp(sin(t));
plotyy(t,y,t,y,'plot','stem') stem 为二维杆图
[ax,h1,h2]=plotyy( … ) 返回左右两 y 轴的句柄(分别为 ax(1) ax(2) ,以及在两坐标轴中生成的图形对象的句柄,分别为 h1 h2
t=0:900;
A=1000;
a=0.005;
b=0.005;
z2=cos(b*t);
z1=A*exp(-a*t);
[haxes,hline1,hline2]=plotyy(t,z1,t,z2,'semilogy','plot');
axes(haxes(1))
ylabel('semilog plot') 对数坐标
axes(haxes(2))
ylabel('linear plot')
set(hline2,'linestyle','--')
其他二维图形绘图指令
bar(x,y) 二维条形图
hist(y,n) 直方图
histfit(y,n) 带拟和线的直方图, n 为直方的个数
stem(x,y) 火柴杆图
comet(x,y) 彗星状轨迹图
compass(x,y) 罗盘图
errorbar(x,y,l,u) 误差限图
feather(x,y) 羽毛状图
fill(x,y, ’ r ’ ) 二维填充函数 以红色填充
pie(x) 饼图
polar(t,r) 极坐标图 r 为幅值向量, t 为角度向量
t=0:0.1:8*pi;
r=cos(3*t/2)+1/2;
polar(t,r),xlabel('polar 指令 ')
quiver(x,y) 磁力线图
stairs(x,y) 阶梯图
loglog(x,y) 对数图
semilogx semilogy 半对数图
matlab 三维作图
plot3(x,y,z) 三维线条图
t=0:pi/50:15*pi;
plot3(sin(t),cos(t),t,'r*') 与 plot 相似
v=axis 返回各个轴的范围
text(0,0,0,'origin') 在某个坐标点加入文字
plot3 增加维数可以一次画多个图,使所个二维图形眼一个轴排列
三维网线图的绘制
mesh(x,y,z) 网格图
mesh(x,y,z,c) 四维作图 ,(x,y,z) 代表空间三维, c 代表颜色维
mesh(…,’property name’,property value,…) 设置曲面各属性的值
[x,y,z]=sphere(12);
mesh(x,y,z) , hidden off 曲面设置为透明
meshc(x,y,z) 画网格图和基本的等值线图
meshz(x,y,z) 画包含零平面的网格图
waterfall(x,y,z) 与 mesh 一样,只是在效果上它的网格线只在 x 轴一个方向出现,呈瀑布状水线
两个变量的标量指令 meshgrid(x) 或 meshgrid(x,y) (p179)
将两个一维向量生成两个二维向量,以便进行 z=f(x,y) 运算,算出 z 的所有值, z 为 x y 的标量指令
[X,Y]=meshgrid(x) meshgrid(x,x) 的简略式
[X,Y]=meshgrid(x,y)
[X,Y,Z]=meshgrid(x,y,z) 用于三维图形的绘制
[x,y]=meshgrid([-2:0.1:2]);
z=x.*exp(-x.^2-y.^2);
plot3(x,y,z)
surf(x,y,z,c) 着色表面图
surf(x,y,z) 隐含着 c=z
surf ( z ) 隐含着 x , y 的值为 surf 指令根据 z 的尺寸自动生成
surfc 画出具有基本等值线的曲面图
surfl 画出一个具有亮度的曲面图
shading flat 网线图的某整条线段或曲面图的某个贴片都着一种颜色
shading interp 某一线段或贴片上各点的颜色由线或片的顶端颜色经线性插值而得
曲面图不能设成网格图那样透明,但需要时,可以在孔洞处将数据设成 nun
等高线的绘制
在二维空间绘制等高线 contour
contour(x,y,z,n) 绘制 n 条等值线( n 可省略)
contour(x,y,z,v) 在向量 v 所指定的高度上绘制等高线(可省)
c=contour(x,y,z) 计算等值线的高度值
c=contourc(x,y,z,n) 计算 n 条等高线的 x - y 坐标数据
c=contourc(x,y,z,v) 计算向量 v 所指定的等高线的 x - y 坐标数据
clabel(c) 给 c 阵所表示的等高线加注高度标识
clabel(c,v) 给向量 v 所指定的等高线加注高度标识
clabel(c,’manual’) 借助鼠标给点中的等高线加注高度标识
三维空间绘制等高线 contour3(x,y,z)
[x,y,z]=peaks(30);
contour3(x,y,z,16,'g')
二元函数的伪彩图 pcolor(x,y,z)
是指令 surf 的二维等效指令,代表伪彩色,可与 contour 单色等值线结合画彩色等值线图
[x,y,z]=peaks(30);
pcolor(x,y,z); 伪彩色
shading interp 颜色插值,使颜色平均渐变
hold on,contour(x,y,z,20,'k')... 画等值线
colorbar('horiz') 水平颜色标尺
c=contour(x,y,z,8);
clabel(c) 标注等高线
矢量场图 ( 速度图 )quiver
用于描述函数 z=f(x,y) 在点 (x,y) 的梯度大小和方向
[X,Y]=meshgrid(x,y) X,Y 为 Z 阵元素的坐标矩阵
[U,V]=gradient(Z,dx,dy) U , V 分别为 Z 对 x 对 y 的导数, dx dy 是 x y 方向上的计算步长
quiver(X,Y,U,V,s,’linespec’,’filled’) U , V 为必选项,决定矢量场图中各矢量的大小和方向, s 为指定所画箭头的大小,缺省时取 1,linespec 为字符串,指定合法的线形和彩色, filled 用于填充定义的绘图标识符
[x,y]=meshgrid(-2:.2:2,-1:.15:1);
z=x.*exp(-y.^2);
[px,py]=gradient(z,.2,.15);
contour(x,y,z);
hold on,quiver(x,y,px,py),axis image
多边形的填色 fill(x,y,c)
c 定义颜色字符串,可以是’ r ’ , ’ b ’等,也可以用 RGB 三色表示 [r,g,b] 值为 0-1
图形的四维表现