Matlab Notes(2): 基础编程知识

1. 输入与输出函数

fprintf(文件地址,格式,写入的变量):指数据写入指定文件。如:x=0:0.1:1; y=[x,exp(x)]; fid=fopen(‘vexp.txt’,’w’); fprintf(fid,’%6.2f %12.8f\n’,y); fclose(fid);

input():输入函数

disp:显示字符串或变量

pause(n):暂停n秒执行程序

nargin/nargout:函数输入与输出参数的个数

nargchk(low,high,nargin,’struct’):

varargin/varargout:未知的输入输出参数

inline():定义一个内联函数,只能对数值进行代入,不支持符号运算,效率高但占用内存大。如:

g = inline(‘t^2’)

g = inline(‘sin(2*pi*f + theta)’)

g = inline(‘sin(2*pi*f + theta)’, ‘f’, ‘theta’)

g = inline(‘x^P1’, 1)

y=g(x);若x是矩阵,y为相应大小的矩阵。

匿名函数的建立,如

function f=betaf(t,z,w)

f=t^(z-1)*(1-t)^(w-1)

在命令窗口输入Q=quadtx(@betaf,0,1,1.e-6,8/3,10/3);

2. 常用逻辑运算

all/any 经常用在if语句中 返回0或1;

isinf(x) 无穷大返回1;

isreal(x) 无虚部返回1;

istrl(x) 字符串返回1

isempty(tol) 若缺少则返回1

 isa(OBJ,’classname’)  ture if object is a given class

isinteger(A)   True for arrays of integer data type.(还有isnumeric/isfloat/isreal等)

isfinite(A)  True for finite elements.

Iscell 判别一个变量是否为细胞变量

3. 矩阵应用函数

3.1 提取矩阵的元素

A(:)    A的所有元素                A(:,:)   二维矩阵A的所有元素

A(:,k)   A的第 k 列,               A(k,:)   A的第 k 行

A(k:m)   A的第 k 到第 m 个元素    A(:,k:m)   A的第 k 到第 m 列组成的子矩阵

zeros(m,n) 生成一个m行n列的零矩阵,m=n时可写为zeros(n)
ones(m,n) 生成一个m行n列的元素合为1的矩阵,m=n时写为ones(n)
eye(m,n) 生成一个主对角线全为1的m行n列矩阵,m=n时写作eye(n)
dig(x) 若x是矩阵,则diag(x)为x的主对角线向量;若x是向量,diag(x)产生以x为对角线的对角矩阵
tril(A) 提取一个矩阵的下三角部分
triu(A) 提取一个矩阵的上三角部分
rand(m,n) 产生0-1间均匀分布的随机矩阵,m=n时简写为rand(n)
randn(m,n) 产生均值为0,方差为1的标准正态分布随机矩阵,m=n时简写为rand(n)
magic(n) 产生n阶魔术矩阵
vander(V) 产生以V为基础向量的范德蒙矩阵
hilb(n) 产生n阶希尔伯特矩阵(invhilb(n)为求n阶希尔伯特矩阵的逆)
toeplitz(x,y) 生成以x为第一列,y为第一行的托普利兹矩阵
pascal(n) 生成n阶帕斯卡矩阵(杨辉三角形)
fliplr 左右翻转 rot90(A,k)   k>0时,逆时针翻转90的k倍
flipud 上下翻转 rot90(A,k)   k<0时,顺时针旋转90的k倍
inv(A) 矩阵A的逆 pinv(A)     矩阵A的伪逆
det(A) 矩阵A的行列式
rank(A) 矩阵的秩 trace(A)    矩阵的迹
reshape(A,m,n) 是将矩阵的元素以列为单位进行重组,变为m行n列的矩阵。
size 查看矩阵的大小
linspace(a,b,n) 建立行向量,a/b分别为第一个和最后一个元素,n为总的元素个数,省略n自动产生100个元素的行向量
find(A==2) A中等于2的元素下标
ind2sub和sub2ind 序号和下标的转换
dot(a,b) 矩阵的a与b内积

删除矩阵中的元素:M(2)=[]  /M(:,2)=[]

扩展矩阵:repmat(A,1,2) 结果为:[A A]    压缩矩阵(删除矩阵中相同元素):unique(A)

jordan:矩阵的Jordan标准形如:  jordan(A)  [V J]=jordan(A)(V为相似变换矩阵)

eig(A):求矩阵A的全部特征值

[VD]=eig(A):求矩阵A的全部特征值,构成对角阵D,并求A的特征向量构成V的列向量

[V,D]=eig(A,’nobalance’):与上一种类似,上一种格式先对A作相似变换然后求矩阵A的特征值和特征向量,而这种格式直接求矩阵A的特征值和特征向量。

norm用于求矩阵的范数,调用格式常有:

norm(A)norm(A,2):计算矩阵A的2-范数        norm(A,1): 计算矩阵A的1-范数

norm(A,inf):计算矩阵A的无穷大-范数            norm(A,’for’):

三角分解函数:[L,U]=lu(A)

正交变换:[Q,R]=qr(A) 用于矩阵的正交――三角分解

奇异值分解:[U,S,V]=svd(A)

矩阵分析

矩阵函数:syms x     A=[sin(x) exp(x) 1;cos(x) x^2+1 log(x)]   diff(A)

funm为通用计算矩阵函数,A=[0 1;0 -2]  S=funm(A,@fun);   S=expm(A)

lookfor  按指定的关键词查询与之相关的命令

例:>> lookfor inverse 

 3.2 MATLAB基本数学函数
函数 功能 格式
sin/sinh 正弦函数与双曲正弦函数 Y=sin(X)/Y=sinh(X)
asin/asinh 反正弦函数与反双曲正弦函数 Y=asin(X)/Y=asinh(X)
cos/cosh 余弦函数与双曲余弦函数 Y=cos(X)/Y=cosh(X)
acos/acosh 反余弦函数与反双曲余弦函数 Y=acos(X)/Y=acosh(X)
tan/tanh 正切函数与双曲正切函数 Y=tan(X)/Y=tanh(X)
atan/atanh 反正切函数与反双曲正切函数 Y=atan(X)/Y=atanh(X)
fix 朝零方向取整 B=fix(A)
roud 朝最近的方向取整 Y=round(X)
floor 朝负无穷大方向取整 B=floor(A)
rem 求作除法后的余数 R=rem(X,Y)
ceil 朝正无穷大方向取整 B=ceil(A)
exp 以e为底数的指数函数 Y=exp(X)
expm 求矩阵的以e为底的指数函数 Y=expm(X)
log 自然对数,即以e为底数的对数 Y=log(X)
log10 常用对数 Y=log10(X)
sort 把输入的参量中的元素按从小到大的方向重新排列 B=sort(A)/B=sort(A,dim)

[B,INDEX]=sort(A,…)

abs 求数值的绝对值与复数的幅值 Y=abs(X)
conj 求复数的共轭值 ZC=conj(Z)
imag 求复数的虚数部分 Y=imag(Z)
real 求复数的实数部分 Y=real(Z)
angle 求复数的相角 P=angle(Z)
complex 用实数和虚数部分创建复数 Z=complex(a,b)

 

4. MATLAB数值运算

4.1 MATLAB多项式及其运算

多项式的一般形式为:f(x)=                        ,其中x可以是变量,也可以是矩阵形式。当x是矩阵时,f(x)代表矩阵多项式。在MATLAB中多项式可以表示为向量a=[a1,a2,a3,…,an](系数由高次向底次排列).

多项式构造函数:ploy2sym(c)    其中c为多项式一维系数矩阵

poly(a) a为多项式根组成的向量

乘法函数:h=conv(a,b)

除法函数:[q,r]=deconv(a,b)   其中q,r分别代表整除多项式和余数多项式

求值函数:polyval(p,x)       多项式在x点对应的值(x数或矩阵)

求根函数:x=roots(p) x的元素为方程的根

微分函数:ployder(p)        p为多项式系数矩阵

多项式插值:一维插值在MATLAB中可以用interp1来实现:yi=interp1(x,y,xi,method)

其中x和y是原已知的数据,xi是要内插值的数据点,method是托付方法。插值方法有:

‘nearest’-最近邻点插值,寻找最近的数据节点,由此得出函数值,此种方法执行快,构建的经验函数曲线直角转折;

‘linear’—为线性插值(缺省方式),将每个相邻的节点用直线连起来,形成一条直线,在样本点上斜率变化很大;

‘spline’—三次样条函数插值,在每个不区间上是三次多项式,执行时间长,但结果平滑;

‘pchip’—分段三次方程式插值  同’cubic’

多项式拟合: 在MATLAB中用函数polyfit来实现,语法格式为p=polyfit(x,y,n)和[p,s]=polyfit(x,y,n),其中x,y为已 知的数据组,n为要拟合的多项式阶次,向量p为返回的要拟合的多项式的系数,向量s为调用函数polyval获得的错误预估计值。

线性方程组的数值解:除了矩阵相除法求解之外,还可以用rref函数进行消去法求解,其调用格式:rref(a)  a为方程组的系数增广矩阵。

4.2 积分函数

quad():抛物线法求数值积分,适用于精度要求相对较低,积分相对困难.格式:quad(fun,a,b),注意此处的fun是函数,并且为数值形式,所以使用*、/、^等运算时要在其前面加上点即.*、./、.^等。

function f=fun(x)

f=exp(-0.8*x).*sin(x+pi/3)  %点乘运算

[I,n]=quad(‘fun’,0,5*pi)

function y = myfun(x)

y = 1./(x.^3-2*x-5);

Q = quad(@myfun,0,2);

两种方法均可

quadl():也是抛物线求积分,适用于精度要求相对较高,积分相对容易

trapz():梯形法求数值积分,格式为:trapz(x,y),其中x为带有步长的积分敬意y为数值形式的运算(相当于上面介绍的函数fun)

cumtrapz(X,Y):梯形公式的累积积分(x,y必须相同长度)

x=0:.1:1;

f=inline(‘2*x-3’);%inline的用法

trapz(x,f(x))

cumtrapz(x,f(x))   %累积积分

plot(x,ans)

ans =-2

ans =

Columns 1 through 8

0   -0.2900   -0.5600   -0.8100   -1.0400   -1.2500   -1.4400   -1.6100

Columns 9 through 11

-1.7600   -1.8900   -2.0000

dblquad():抛物线法求二重数值积分,格式:dblquad(fun,xmin,xmax,ymin,ymax),fun可以用inline定义,也可以通过某个函数文件的句柄传递。

5. MATLAB符号运算

在进行符号运算时,必须先定义基本的符号对象,可以是符号常量、符号变量、符号表达式等。符号对象是一种数据结构。构造符号变量和表达式sym和syms

建立符号表达式通常有以下2种方法:

(1) 用 sym 函数直接建立符号表达式。(2) 使用已经定义的符号变量组成符号表达式

查找符号表达式中的符号变量

findsym(expr)   按字母顺序列出符号表达式 expr 中的所有符号变量

findsym(expr, N)   按顺序列出 expr 中离 x 最近的 N 个符号变量

若表达式中有两个符号变量与 x 的距离相等,则ASCII 码大者优先。

用给定的数据替换符号表达式中的指定的符号变量

符号表达式的替换subs(f,x,a) ,  用 a 替换字符函数 f 中的字符变量 x,a 是可以是数/数值变量/表达式或字符变量/表达式

若 x 是一个由多个字符变量组成的数组或矩阵,则 a 应该具有与 x 相同的形状的数组或矩阵。比较一下以下命令:

f=sym(‘2*u’); f=2*u                     >> subs(f,’u’,2) ans=4

>> f2=subs(f,’u’,’u+2′) f2=2*(u+2)          >> a=3; ans=14

>> subs(f2,’u’,a+2) ans=2*((a+2)+2         >> subs(f2,’u’,’a+2′) f3=2*x+2*y

>> syms x y                              >> f3=subs(f,’u’,x+y) ans=6

simplify符号表达式化简函数    simple:使用多种规则化简

eval:将符号常量转换为数值结果(反过来有sym)            expand:展开

collect:合并同类项                                     talor:taylor(f,x,6,x0)

因式分解:factor(f)  如:syms x    f=x^6+1;   s=factor(f)

计算极限:limit     如:L=limit(‘(log(x+h)-log(x))/h’,h,0)  %单引号可省略掉

计算导数:diff      如求y=sin(ax):  A=diff(y)  B=diff(a)  C=diff(y,x,2)

计算不定积分、定积分、反常积分int,如syms x   f=(x^2+1)/(x^2-2*x+2)^2; g=cos(x)/(sin(x)+cos(x)); h=exp(-x^2);  I=int(f); J=int(g,0,pi/2); K=int(h,0,inf)

符号求和symsum,如:syms n  S=symsum(1/n^2,inf)    S1=symsum(1/n^2,1,10)      {另外syms n x   S2=symsum(x/n^2,n,1,inf)  } 当表达式较长时要加上单引号。

解代数方程和常微分方程:例如求

f=sym(‘a*x^2+b*x+c’)或f=’a*x^2+b*x+c’

solve(f)     [注solve(f,a)    ans=-(b*x+c)/x^2]

解微分方程dsolve(‘equation1’,’equaltion2’,…)  如求通解

syms x y

dsolve(‘Dy=x’,’x’)    ans=1/2*x^2+C1

求特解如

syms x y

dsolve(‘D2y=x+Dy’,’y(0)=1’,’Dy(0)=0’,’x’)     ans=-1/2*x^2+exp(x)-x

(比较一下:dsolve(‘D2y=x+Dy’,’y(0)=1’,’Dy(0)=0’))

如求方程组特解

syms x y

[x,y]=dsolve(‘Dx=y+x,Dy=2*x’)

(比较一下:dsolve(‘Dx=y+x,Dy=2*x’)和[x,y]=dsolve(‘Dx=y+x,Dy=2x’))