入坑MATLAB必会的吐血总结
本渣想回过头来整理一下MATLAB的一些基本的知识(很多东西比较琐碎,应该系统的梳理梳理),下文中没有提到的,自己用help查即可。
此文用来存个档,便于回顾。
由于matlab各版本部分语法存在差异,可能会出现bug,用help查帮助文档即可。
里面的一些内容仅供参考,知识量有限,仅供入门。
后期可能会随缘写一点笔记。
如果没有装Matlab,我这里有一篇建模软件的博客:https://www.cnblogs.com/cruelty_angel/p/10563509.html
变量名:字母数字串(第一个字符必须英文字母 | 字符间无空格 | 最多19个字符);
用%注解;
检查现存于工作空间(Workspace)的变量,可键入who;
检查更加详细的信息,可键入whos;
删除工作空间里的变量clear;
一些永久常数:
基本虚数单位 i或j;
系统的浮点精确度 eps;
无限大 inf;
系统所能表示的最大/最小数值 realmax / realmin;
非数值 NaN;
圆周率 pi;
函数的输入/输出参数个数 nargin / nargout;
搜寻路径:which(空格)文件名;
一、线性代数
矩阵
基本命令:
- A的转置——A'
- A的行列式——det(A)
- 矩阵A的秩——rank(A)
- A的逆矩阵——inv(A)
- A的n次幂——A^n
- 矩阵A和B里的元素相乘——A .* B
- 选择A的第i行生成一个行向量——ai=A(i,:)
- 选择A的第j列生成一个列向量——aj=A(:,j)
- 生成n阶零矩阵——zeros(n)
- 生成n阶单位矩阵——eye(n)
- 两个向量的内积——a1 * a2'
其他命令:
- 存储工作空间变量——save 文件名 变量名
- 查询函数的用法——help 函数名
- 列出所有变量的详细资料——whos
- 演示程序demo——demo
特殊矩阵:
- 全一矩阵——y = ones(n) y = ones(m,n)
- 均匀分布随机矩阵——y = rand(n) y = rand(m,n)
- 正态分布随机矩阵——y = randn(n) y = randn(m,n)
- 线性等分向量——y = linspace(a,b) 默认100等分 %n等分: y = linspace(a,b,n)
- 对数等分向量——y = logspace(a,b) 默认50等分 %n等分:y = logspace(a,b,n)
- 矩阵A中元素的个数——n = numel(A)
- 以输入元素为对角线元素的矩阵——out = blkdiag(a,b,c...)
- n阶Hadamard矩阵——H = hadamard(n)
- Hankel矩阵——H = hankel(c) 第一列元素为c,反三角以下元素为0
- n阶Hilbert矩阵——H = hilb(n) H(i,j) = 1/(i+j-1)
- n阶逆Hilbert矩阵——H = invhilb(n)
- n阶魔方矩阵——M = magic(n)
向量的范数——n = norm(X) 具体help查询
矩阵的范数——n = norm(A) 具体help查询
其他运算:
- 矩阵A的特征值——D = eig(A)
- 特征向量矩阵X和特征值组成的对角阵D——[X,D] = eig(A)
- 将非奇异矩阵A正交化为Q——Q = orth(A) (Q' * Q = 单位矩阵)
- 由已定义的矩阵A,E,O,A作为矩阵的子块,生成矩阵B——B = [A,E;O,A]
- 矩阵A的列向量组的极大线性无关组——rref(A)
- 条件数——c = cond(A) 默认为2条件数 p条件数:c = cond(A,p)
数学定义为矩阵A的条件数等于A的范数与A的逆的范数的乘积,即cond(A) = ‖ A ‖·‖ A逆 ‖
LU = A——[L,U] = lu(A)
LU = PA——[L,U,P] = lu(A)
U为上三角阵,L为下三角阵或其变换形式,P为单位矩阵的行变换矩阵
例子:
①解方程组
求解方程组$\left\{\begin{array}{c}{5 x_{1}+4 x_{3}+2 x_{4}=3} \\ {x_{1}-x_{2}+2 x_{3}+x_{4}=1} \\ {4 x_{1}+x_{2}+2 x_{3}=1} \\ {x_{1}+x_{2}+x_{3}+x_{4}=0}\end{array}\right.$的解。
clear format rat %format函数控制输出格式 format rat是小数去用分数输出表示 A=[5,0,4,2;1,-1,2,1;4,1,2,0;1,1,1,1]; B=[3;1;1;0]; S=length(A(:,1)) R=rank(A) if S==R X=A\B else fprintf('error\n') end
②解线性方程组
求解线性方程组:
$\left\{\begin{array}{l}{x_{1}-2 x_{2}+3 x_{3}+x_{4}+x_{5}=7} \\ {x_{1}+x_{2}-x_{3}-x_{4}-2 x_{5}=2} \\ {2 x_{1}-x_{2}+x_{3}-2 x_{5}=7} \\ {2 x_{1}+2 x_{2}+5 x_{3}-x_{4}+x_{5}=18}\end{array}\right.$
clear A=[1,-2,3,1,1;1,1,-1,-1,-2;2,-1,1,0,-2;2,2,5,-1,1]; b=[7;2;7;18]; B=[A,b]; n=length(A(1,:)) RA=rank(A) RB=rank(B) if RA==RB if RA==n X=A\b else D=rref(B) end else fprintf('No Solution for the Equations') end
③解齐次线性方程组
$\left\{\begin{array}{c}{x_{1}+x_{2}+x_{3}+4 x_{4}-3 x_{5}=0} \\ {2 x_{1}+x_{2}+3 x_{3}+5 x_{4}-5 x_{5}=0} \\ {x_{1}-x_{2}+3 x_{3}-2 x_{4}-x_{5}=0} \\ {3 x_{1}+x_{2}+5 x_{3}+6 x_{4}-7 x_{5}=0}\end{array}\right.$
clear A=[1,1,1,4,-3;2,1,3,5,-5;1,-1,3,-2,-1;3,1,5,6,-7]; R=rank(A) %X=rref(A) %仅仅用rref的话,本题的秩=2<5,方程有非零解,需要自己再去做 %因此不必用rref,MATLAB提供了一个求矩阵令空间的函数null来方便求解 Y=null(A,'r')
④求非齐次线性方程组的通解
$\left\{\begin{array}{c}{x_{1}+5 x_{2}-x_{3}-x_{4}=-1} \\ {x_{1}-2 x_{2}+x_{3}+3 x_{4}=3} \\ {3 x_{1}+8 x_{2}-x_{3}+x_{4}=1} \\ {x_{1}-9 x_{2}+3 x_{3}+7 x_{4}=7}\end{array}\right.$
clear A=[1,5,-1,-1;1,-2,1,3;3,8,-1,1;1,-9,3,7]; b=[-1;3;1;7]; B=[A,b]; RA=rank(A) RB=rank(B) Y=null(A,'r') n=length(b) if RA==RB if RA==n X=A\B %方程组满秩时,求出唯一解 else p=pinv(A)*b %在方程组不满秩时,求出特解 Y=null(A,'r') %求出方程组的基础解系 n1=length(Y(1,:)) k=sym(['kI']) %这里是ki,是为了把数组k说明成字符型变量 for i=1:n1 %求出方程的全部解 k(i)=strcat('k',num2str(i)) p=p+k(i)*Y(:,i) end end else fprintf('No Solution for the Equations') end
图形功能
这一块结合实例来了解相关函数。
二维图像:
①——plot
x=-10:0.1:10; y1=3*x.^4+x.^2-1; plot(x,y1,'r') %x是向量,所以计算一定要表示成点乘
②——fplot
%函数 function y2=draw2(x) y2=sin(x)+x; end %在命令行输入 fplot(@draw2,[-5,5])
③——ezplot
y3='x.^2*exp(-x.^2)'; ezplot(y3)
④——两曲线
syms x y=log10(x+sqrt(1+x.^2)); dy=diff(y,x);%求导函数,但x不能先定义为向量,所以用subs让x1作为一符号代替表达式y中的默认变量 x1=-3:0.1:3; y1=subs(y,x1); dy1=subs(dy,x1); plot(x1,y1,'r',x1,dy1,'b')
三维图像:
①——plot3
t=0:0.1:6*pi; x=cos(t); y=sin(t); z=t; plot3(x,y,z)
②——参数方程
t=0:0.1:6*pi; x=1/2*cos(t)+1/2; y=1/2*sin(t); z=sqrt(1-x.^2-y.^2); plot3(x,y,z)
③——meshgrid和mesh
s=-10:0.1:10; t=-10:0.1:10; [x,y]=meshgrid(s,t);%由两向量生成网格点(x,y),与mesh()配合使用 z=x.^2-y.^2; mesh(x,y,z);%绘制着色的三维网纹去年
④——cylinder
s=-pi/5:pi/50:pi/5; [X,Y,Z]=cylinder(1./s,60);%绘制用向量表示的曲线围绕x轴旋转的曲面,与surf()配合使用,相当于mesh() surf(X,Y,Z);
%mesh(X,Y,Z);
MATLAB的程序结构
设计一段程序,分别用for循环和while循环求1+2+3+…+100的和,写出完成实验的程序。
clear; sum=0; for k=1:100 sum=sum+k;%s=s+k end sum
注意:i和j是系统的虚单位,原则上不能作为变量,建议换成k(sum属于系统函数名,同理,所以还是建议写成s)
%while循环 clear; s=0; k=1; while k<101 s=s+k; k=k+1; end s
%编写函数 function y=fsy42(x) if x>0 y=x*x else y=x*x*x end %以文件名fsy42.m保存在磁盘上,接着编写程序: fplot(@fsy42,[-4,4])
switch以及一些像break、return、continue之类的程序流程控制语句,过于easy,请自行查询。
补充实例:
%算N9 clear; s=0; k=1; while(s<=9) s=s+1/k; k=k+1; end N9=k-1 %算N20 clear; s=0; k=1; while(s<=20) s=s+1/k; k=k+1; end N20=k-1
clear; k=0; s=0; while(k<10) n=input('请输入数字:'); if(n>10) s=s+n; end k=k+1; end s num=sqrt(s)
二、微积分
1.极限和微分
函数类别 | MATLAB函数 |
幂函数 | x^a || sqrt(x) |
指数函数 | a^x || exp(x) |
对数函数 | log(x)【即lnx】 || log2(x) || log10(x) |
三角函数 | sin(x) || cos(x) || tan(x) || cot(x) || sec(x) || csc(x) |
反三角函数 | asin(x) || acos(x) || atan(x) || acot(x) || asec(x) || acsc(x) |
绝对值函数 | abs(x) |
求极限(摘自MATLAB2018说明文档):
>> help limit --- sym/limit 的帮助 --- limit Limit of an expression. limit(F,x,a) takes the limit of the symbolic expression F as x -> a. limit(F,a) uses symvar(F) as the independent variable. limit(F) uses a = 0 as the limit point. limit(F,x,a,'right') or limit(F,x,a,'left') specify the direction of a one-sided limit. Examples: syms x a t h; limit(sin(x)/x) returns 1 limit((x-2)/(x^2-4),2) returns 1/4 limit((1+2*t/x)^(3*x),x,inf) returns exp(6*t) limit(1/x,x,0,'right') returns inf limit(1/x,x,0,'left') returns -inf limit((sin(x+h)-sin(x))/h,h,0) returns cos(x) v = [(1 + a/x)^x, exp(-x)]; limit(v,x,inf,'left') returns [exp(a), 0]
求导(摘自MATLAB2018说明文档):
>> help diff diff - Differences and Approximate Derivatives This MATLAB function calculates differences between adjacent elements of X along the first array dimension whose size does not equal 1: Y = diff(X) Y = diff(X,n) Y = diff(X,n,dim)
补充:pretty函数可以使它作用的表达式更符合数学上的书写习惯。
>> help pretty --- sym/pretty 的帮助 --- pretty Pretty print a symbolic expression. pretty is not recommended. Use live scripts instead. Live scripts provide full math rendering while pretty uses plain-text formatting. pretty(S) prints the symbolic expression S in a format that resembles type-set mathematics.
2.不定积分与定积分
计算函数fun关于默认变量的不定积分:int(fun)
计算函数fun关于变量x的不定积分:int(fun,x)
计算函数fun关于变量x从a到b的定积分:int(fun,x,a,b)
如果因为版本更新等原因导致语法错误,请参照说明文档。
例子:
clear syms x a b c I1=int(sin(a*x)*sin(b*x)*sin(c*x),x) I2=int(x*exp(x)/(1+x)^2,x,0,1)
clear syms t y=exp(-t^2) F=int(y,t,0,x^2) int(x^2*diff(F,x),x,-2,3)
clear
syms x I1=int(1+x^2,x,-1,0)+int(exp(-x),x,0,1) eval(I1) %用于评估由表达式表示的matlab代码 I2=quad(@sy3_9f,-1,1) 其中sy3_9f.m如下: function y=sy3_9f(x) if x<=0 y=1+x.^2; %系统自动把变量换成向量,故用 .* ./ .^ 这些。而且,凡是维数不匹配,就有可能是把变量作为向量了 else y=exp(-x); end
%如果被积函数是一个分段函数,则需要以分段点为界分开积分
为什么要用quad?
并非所有的积分都可以用 int() 来完成运算,函数 int() 完成的是符号运算,而不是数值运算,因此,当积分不存在初等形式的原函数时,函数 int() 便不能完成积分运算。
而 quad() 函数用于计算函数的数值积分。
3.二次曲面
- 椭球面
直角坐标方程:
参数方程:x=asinθcosφ;y=bsinθsinφ;z=ccosθ (0≤θ≤π, 0≤φ<2π)
程序:
clear k=5; n=2^k-1; [x,y,z]=ellipsoid(0,0,0,5,4,3,n) %ellipsoid——椭圆 mesh(x,y,z); colormap(gray); axis equal %或者用参数方程(推荐) clear ezmesh('5*sin(a)*cos(b)','4*sin(a)*sin(b)','3*cos(a)',[0,pi],[0,2*pi])
axis equal
图形:
- 球面
直角坐标方程:
参数方程:x=Rsinθcosφ;y=Rsinθsinφ;z=Rcosθ (0≤θ≤π, 0≤φ<2π)
程序:
clear k=5; n=2^k-1; [x,y,z]=sphere(n) mesh(x,y,z); colormap(gray); axis equal %或者用参数方程(推荐) clear ezmesh('5*sin(a)*cos(b)','5*sin(a)*sin(b)','5*cos(a)',[0,pi],[0,2*pi])
axis equal
图形:
- 抛物面
椭圆抛物面
直角坐标方程:
参数方程:x=avcosφ;y=bvsinφ;z=v² (0≤v≤+∞, 0≤φ<2π)
程序:
ezmesh('2*u*cos(v)','3*u*sin(v)','4*u*u',[0,1],[0,2*pi]) axis equal
图形:
双曲抛物面
直角坐标方程:
参数方程:x=a(u+v);y=b(u-v);z=4uv
或者:x=au;y=bv;z=u²-v² (-∞≤u≤+∞, -∞≤v≤+∞)
程序:
clear x=-2:0.01:2; y=-3:0.1:3; [X,Y]=meshgrid(x,y); Z=X.*X/2-Y.*Y/3; mesh(X,Y,Z)
图形:
- 双曲面
单叶双曲面
直角坐标方程:
参数方程:x=a*secu*cosv;y=b*secu*sinv;z=c*tanu (-∞≤u≤+∞, 0≤v≤2π)
程序:
ezmesh('2*sec(u)*cos(v)','3*sec(u)*sin(v)','2*tan(u)',[-4,4],[0,2*pi]) axis equal title('ezmesh作的单叶双曲面')
图形:
双叶双曲面
直角坐标方程:
参数方程:x=a*tanu*cosv;y=b*tanu*sinv;z=c*secu (-∞≤u≤+∞, 0≤v≤2π)
程序:
ezmesh('2*tan(u)*cos(v)','3*tan(u)*sin(v)','2*sec(u)',[-4,4],[0,2*pi]) axis equal title('ezmesh作的双叶双曲面')
图形:
- 椭圆锥面
直角坐标方程:
参数方程:x=avcosφ;y=bvsinφ;z=cv ( 0≤φ<2π,-∞≤v≤+∞)
程序:
ezmesh('2*u*cos(v)','3*u*sin(v)','2*u',[-4,4],[0,2*pi]) axis equal title('ezmesh作的椭圆锥面')
图形:
- 椭圆柱面
直角坐标方程:
参数方程:x=acosu;y=bsinu;z=v ( 0≤φ<2π,-∞≤v≤+∞)
程序:
x1='3*cos(u)'; y1='2*sin(u)'; z1='v'; ezmesh(x1,y1,z1,[0,2*pi,0,4]); axis square
图形:
4.二重积分
直角坐标
%第一问 syms x y f=x/(1+x*y); int(int(f,y,0,1),x,0,1) %第二问 %求交点 clear syms x y [x,y]=solve(y==x*x+1,y==2*x,x,y) %在2018里这样,有些版本是加引号和单等号 %积分 clear syms x y f=x/(y+1); int(int(f,y,2*x,x*x+1),x,0,1) %第三问 clear syms x y f=1-x-y; int(int(f,y,0,1-x),x,0,1)
极坐标
%第一问 clear syms r f int(int(r*r*r,r,0,sqrt(2)),f,0,pi/2) %第二问 clear syms r f int(int(1,r,0,sec(f)*tan(f)),f,0,pi/4)
%三叶玫瑰线的一叶 clear syms r f int(int(r,r,0,cos(3*f)),f,-pi/6,pi/6) %心脏线 clear syms r f int(int(r,r,0,1-sin(f)),f,0,2*pi)
5.三重积分
直角坐标
clear syms z r s A=int(int(int(z*r,z,r*r,2),r,0,sqrt(2)),s,0,2*pi)-int(int(int(z*r,z,r*r,1),r,0,sqrt(1)),s,0,2*pi)
柱面坐标
clear syms z r s int(int(int(z*r,z,r*r,sqrt(2-r*r)),r,0,1),s,0,2*pi)
球坐标
clear syms r f g int(int(int(r*r*r*r*sin(g),r,0,1),g,0,pi),f,0,2*pi)
6.对弧长的曲线积分
%第一问 clear syms x y t x=t; y=2/3*sqrt(2*t*t*t); z=1/2*t*t; dx=diff(x,t); dy=diff(y,t); dz=diff(z,t); ds=sqrt(dx^2+dy^2+dz^2); f=x*y*exp(x*y); int(f*ds,t,0,1) %第二问 clear syms x y t a x=a*(t-sin(t)); y=a*(1-cos(t)); dx=diff(x,t); dy=diff(y,t); ds=sqrt(dx^2+dy^2); f=y*y; int(f*ds,t,0,2)
7.对坐标的曲线积分
%第一问 clear syms x y a t x=a*(t-sin(t)); y=a*(1-cos(t)); dx=diff(x); dy=diff(y); int((2*a-y)*dx+dy,t,0,2*pi) %第二问 clear syms x y z t a x=exp(t); y=exp(-t); z=a*t; dx=diff(x); dy=diff(y); dz=diff(z); int(y*dx-x*dy+(x*x+y*y)*dz,t,0,1)
8.对面积的曲面积分
%1 clear syms x y z z=2-(x*x+y*y); dzx=diff(z,x); dzy=diff(z,y); f1=1; f2=x*x+y*y; ds=sqrt(1+dzx^2+dzy^2); I1=int(int(f1*ds,x,0,sqrt(2)),y,0,sqrt(2)) I2=int(int(f2*ds,x,0,sqrt(2)),y,0,sqrt(2)) %2 clear syms x y z z=4-2*x-4*y/3; dzx=diff(z,x); dzy=diff(z,y); ds=sqrt(1+dzx^2+dzy^2); I=int(int(4*ds,y,0,(6-3*x)/2),x,0,2)
9.对坐标的曲面积分
%第一问 clear syms x y z R r sita x=r*sin(sita); y=r*cos(sita); z=-sqrt(R*R-x*x-y*y); int(int(x*x*y*y*z*r,r,0,R),sita,0,2*pi) %第二问 clear syms x y z I1=int(int(sqrt(1-y*y),y,0,1),z,0,3); I2=int(int(sqrt(1-x*x),x,0,1),z,0,3); I=I1+I2
10.级数
常数项级数与审敛
help symsum --- sym/symsum 的帮助 --- symsum Symbolic summation. symsum(f) evaluates the sum of a series, where expression f defines the terms of a series, with respect to the default symbolic variable defaultVar determined by symvar. The value of the default variable changes from 0 to defaultVar - 1. If f is a constant, the summation is with respect to 'x'. symsum(f,x) evaluates the sum of a series, where expression f defines the terms of a series, with respect to the symbolic variable x. The value of the variable x changes from 0 to x - 1. symsum(f,a,b) evaluates the sum of a series, where expression f defines the terms of a series, with respect to the default symbolic variable defaultVar determined by symvar. The value of the default variable changes from a to b. Specifying the range from a to b can also be done using a row or column vector with two elements, i.e., valid calls are also symsum(f,[a,b]) or symsum(f,[a b]) and symsum(f,[a;b]). symsum(f,x,a,b) evaluates the sum of a series, where expression f defines the terms of a series, with respect to the symbolic variable x. The value of the variable x changes from a to b. Specifying the range from a to b can also be done using a row or column vector with two elements, i.e., valid calls are also symsum(f,x,[a,b]) or symsum(f,x,[a b]) and symsum(f,x,[a;b]).
clear syms n f1=(n-1)/(n*2^n); f2=n*n*n/(3^n); I1=symsum(f1,n,1,inf) I2=symsum(f2,n,1,inf)
Taylor展开
taylor(function,x(变量),a(展开点,缺省时为麦克劳林级数),'Order',n(展开项数)) %详细资料help
clear syms x n taylor(cos(x),x,pi/3,'Order',10)
11.傅里叶级数
%第1问 clear syms x f=x*x*x+x*x; a0=int(f,x,-pi,pi)/pi; an=int(f*cos(5*x),x,-pi,pi)/pi bn=int(f*sin(5*x),x,-pi,pi)/pi %第2问 matlab2018死活不行 但是2016可以 这软件...... function [a0,a,b]=myfly(f,n) a0=fourieran(f,0); for i=1:n a(i)=fourieran(f,i); end for i=1:n b(i)=fourierbn(f,i); end %fourieran.m function an=fourieran(f,n) syms x an=int(f*cos(n*x),x,-pi,pi)/pi; %fourierbn.m function bn=fourierbn(f,n) syms x bn=int(f*sin(n*x),x,-pi,pi)/pi;
12.微分方程和微分方程组
X=dsolve(‘eqn1’,'eqn2',...),如果没有初值条件,求出通解,如果有初值条件,求出特解。
%第1问 clear dsolve('Dy=8-3*y','y(0)=2') %第2问 clear dsolve('(1+x*x)*D2y=2*x*Dy','y(0)=1','Dy(0)=3') %第3问 clear dsolve('D4y-2*D3y+D2y=0','x') %第4问 clear dsolve('2*Dx+4*x+Dy-y=exp(t),Dx+3*x+y=0','x(0)=3/2','y(0)=0')
三、概率统计
1.概率统计函数
M件产品,K件次品,抽取N件,N件中x件次品。
计算超几何分布的累积概率: P=hygecdf(x,M,K,N) %发现其中不多于x件次品的概率
计算超几何分布的概率密度分布: Px=hygepdf(x,M,K,N) %发现其中恰好x件次品的概率
逆累积分布计算: X=hygeinv(p,M,K,N) %逆累积,由概率求次品数
产生超几何分布随机数: P=hygernd(M,K,N,m,n) %产生m行n列的符合超几何分布的随机数
例子:
设有1000件零件,其中优等品300件,随机抽取50件来检查,计算:
①其中不多于10件优等品的概率。绘出这50件产品中优等品的概率分布图。
②根据①中算得的概率p,进行你累积概率计算,把算得的结果和10进行比较。
③其中恰好10件优等品的概率。给出随机变量的分布概率密度图像。
clear P1=hygecdf(10,1000,300,50) X=hygeinv(P1,1000,300,50) P2=hygepdf(10,1000,300,50) x=1:50; Px1=hygecdf(x,1000,300,50); Px2=hygepdf(x,1000,300,50); stairs(x,Px1); % stairs(x,y)绘制向量y的阶梯图,阶梯的宽度以向量x指定。 figure(1) stairs(x,Px2);
常用分布函数的字头:
分布 | 函数字头 |
二项分布 | bino |
几何分布 | geo |
超几何分布 | hyge |
泊松分布 | poiss |
均匀分布 | unif |
离散均匀分布 | unid |
指数分布 | exp |
正态分布 | norm |
T分布 | t |
F分布 | f |
β分布 | beta |
γ分布 | gam |
函数字头与pdf、cdf、inv、rnd组合就能得到相应的函数,具体用法help。
例子
计算数学期望和方差
分布名 | 计算命令 |
二项分布 | [E,D]=binostat(N,P) |
超几何分布 | [E,D]=hygestat(M,K,N) |
泊松分布 | [E,D]=poisstat(Lambda) |
均匀分布 | [E,D]=unifstat(A,B) |
指数分布 | [E,D]=expstat(P,Lambda) |
正态分布 | [E,D]=normstat(μ,σ) |
计算协方差——cov(),具体用法自行help
计算相关系数——corrcoef(),具体用法自行help
参数估计(详细help)
常用分布 | 参数估计命令 |
泊松分布 | [lambdahat,lambdaci]=poissfit(X,α) 返回水平α的λ参数估计和置信区间 |
均匀分布 | [ahat,bhat,aci,bci]=unifit(X,α) 返回水平α的参数估计和置信区间 |
指数分布 | [lambdahat,lambdaci]=expfit(X,α) 返回水平α的参数估计和置信区间 |
二项分布 | [phat,pci]=binofit(X,α) [参数估计,置信区间] |
正态分布 | [muhat,sigmahat,muci,sigmaci]=normfit(X,α) 返回水平α的期望、方差值和置信区间 |
2.统计量
样本的几何均值: m=geomean(X)
样本的调和均值: m=harmmean(X)
样本的算数平均值: m=mean(X)
样本数据的中值: m=median(X)
样本的极差: y=range(X)
样本的方差: y=var(X) || y=var(X,1)
样本的标准差: y=std(X)
协方差矩阵: C=cov(X)
任意阶的中心矩: m=moment(X,order)
相关系数的计算: R=corrcoef(X)
缺失数据的处理:用NaN来标注缺失或不确定的数据,使用以nan开头的函数进行相关的计算。(求和:nansum();求均值:nanmean;最小值:nanmin;最大值:nanmax;中值:nanmedian;标准差:nanstd等等)
例子:
%第一问 clear X=[1 2 4 2; 2 4 3 3; 3 3 4 4; 4 5 5 5]; %几何均值 geom=geomean(X) %调和均值 harm=harmmean(X) %算数平均值 meanX=mean(X) %中值 medianm=median(X) %极差 rangem=range(X) %方差 varx=var(X) var1x=var(X,1) %标准差 stdX=std(X) %协方差矩阵 covX=cov(X) %任意阶中心距 moment1=moment(X,1) moment2=moment(X,2) moment3=moment(X,3) moment4=moment(X,4) %相关系数 R=corrcoef(X) %第二问 clear X=[1 2 3 4 5 6 7 8 9 10]' * [10 9 8 7 6 5 4 3 2 1]; %几何均值 geom=geomean(X) %调和均值 harm=harmmean(X) %算数平均值 meanX=mean(X) %中值 medianm=median(X) %极差 rangem=range(X) %方差 varx=var(X) %若X为向量,返回X中元素的方差;若X为矩阵,返回一个行向量,每一个元素,为对应列的方差(var(X)是经n-1进行了标准化,n为数据长度) %对于正态分布,var(X)就成为了σ²的最小方差无偏估计量 var1x=var(X,1) %经n进行了标准化,得到关于其均值(惯性矩)的样本数据的二阶矩 %标准差 stdX=std(X) %协方差矩阵 covX=cov(X) %任意阶中心距 moment1=moment(X,1) moment2=moment(X,2) moment3=moment(X,3) moment4=moment(X,4) %相关系数 R=corrcoef(X) %第三问 clear m=magic(5); m([1 7 13 19 25])=[NaN NaN NaN NaN NaN]; %求和 sum1=nansum(m) %求均值 mean1=nanmean(m) %中值 medianm=nanmedian(m) %方差 varx=nanvar(m) var1x=nanvar(m,1) %标准差 stdX=nanstd(m) %其他 nanmin(m) nanmax(m)
四、数值分析
有必要先提及一下数值分析的三大工具——插值、拟合、逼近。
因为在生产和科学实验中,有时候自变量x和因变量y之间的函数关系 y=f(x) 不能写出表达式或者表达式过于复杂需要较大计算量而只能计算函数在若干点的函数值或导数值。如果你想知道其他点的函数值时,就需要估计函数在该点的值,为了估计函数在该点的值,就需要构造一个简单的函数 y=φ(x) ,使函数在观测点的值等于已知值,或者使函数在该点的导数值等于或者接近已知值。
根据测量数据的类型寻找φ(x)有很多种方法,这里说一下插值和拟合。
插值——测量数据的数据量小,而且数据值基本上是准确的时候。
插值的定义:在离散数据的基础上补插连续函数,使得这条连续曲线通过全部给定的离散数据点(利用有限个离散点处的取值状况,估算出函数在其他点处的近似值)
拟合——测量数据的数据量较大,或者测量值和真实值有误差时。
拟合的定义:把平面上一系列的点,用一条光滑的曲线连接起来。因为这条曲线有无数种可能,从而有各种拟合方法。拟合的曲线一般可以用函数表示,根据这个函数的不同有不同的拟合名字。
通俗意义上插值、拟合和逼近的区别在于:①拟合是已知点列,从整体上靠近它们;②插值是已知点列并且完全经过点列;③逼近是已知曲线,或者点列,通过逼近使得构造的函数无限靠近它们。
1.数据插值
一维插值
函数: yi = interp1(X,Y,xi,method)
method:
nearest(最近邻点插值)、spline(三次样条函数插值)
linear(线性插值)、cubic(三次函数插值,新版的三次函数插值最好把cubic改成pchip)
对于区间[min{xi},max{xi}]之外的数据,Matlab采用外推的方式来计算。
例子:
代码:
year=1900:10:2010; product=[75.995,91.972,105.711,123.203,131.699,150.697,179.323,203.212,226.505,249.633,256.344,267.893]; p1995=interp1(year,product,1995,'spline') x=1900:2010; y=interp1(year,product,x,'spline'); plot(year,product,'o',x,y)
二维插值
函数:Zi = interp2(X,Y,Z,Xi,Yi,method)
method和一维插值的那四个一样。
例子:
代码:
years=1950:10:1990; service=10:10:30; wage=[150.697 169.592 187.652 179.323 195.072 250.287 203.212 239.092 322.767 226.505 273.706 426.730 249.633 370.281 598.243]; w=interp2(service,years,wage,15,1975)
代码:
x=1:6; y=1:4; t=[12,10,11,11,13,15 16,22,28,35,27,20 18,21,26,32,28,25 20,25,30,33,32,20] subplot(1,2,1) mesh(x,y,t) x1=1:0.1:6; y1=1:0.1:4; [x2,y2]=meshgrid(x1,y1); t1=interp2(x,y,t,x2,y2,'cubic'); subplot(1,2,2) mesh(x1,y1,t1)
2.数据拟合
提到拟合,想先简单点一下最小二乘法。
最小二乘法是勒让德( A. M. Legendre)于1805年在其著作《计算慧星轨道的新方法》中提出的一种数学优化技术,它通过最小化误差的平方和寻找数据的最佳函数匹配。它的主要思想就是求解未知参数,使得理论值与观测值之差(即误差,或者说残差)的平方和达到最小:$E{\rm{ = }}\sum\limits_{i = 1}^n {{{\rm{e}}_i}^2} = {\sum\limits_{i = 1}^n {({y_i} - \mathop y\limits^\^ )} ^2}$
其中,观测值${{y_i}}$就是我们的多组样本,理论值${\mathop y\limits^\^ }$就是我们的假设拟合函数。目标函数也就是在机器学习中常说的损失函数E,我们的目标是得到使目标函数最小化时候的参数。
进行数据拟合,主要有两个函数: polyfit 和 lsqcurvefit 。
polyfit是多项式曲线拟合函数 p = polyfit(x,y,n)
注:polyval 计算在x中任意元素处的多项式p的估值
polyfit 求出已知数据x和y的n次拟合多项式f(x)的系数p,其中x、y、p都是向量,x的分量必须是单调的。
c = lsqcurvefit(fun,c0,x,y)
lsqcurvefit 用于各种类型曲线的拟合,c0是n维向量,与fun里的参数数目有关,用最小二乘法寻找符合经验公式的最优曲线。可用于非线性函数的数据拟合。
例子:
求如下给定数据的二次拟合曲线,并画出原始数据和拟合曲线的图形。x=[0.5,1.0,1.5,2.0,2.5,3.0],y=[1.75,2.45,3.81,4.80,7.00,8.60]
代码:
x=[0.5,1.0,1.5,2.0,2.5,3.0]; y=[1.75,2.45,3.81,4.80,7.00,8.60]; p=polyfit(x,y,2) x1=0.5:0.05:3.0; y1=polyval(p,x1); plot(x,y,'*r',x1,y1,'-b')
例子:
例子:
clear t=0:1:24; T=[15,14,14,14,14,15,16,18,20,22,23,25,28,31,32,31,29,27,25,24,22,20,18,17,16]; %二次函数 [p2,s2]=polyfit(t,T,2); T2=polyval(p2,t); subplot(1,3,1) plot(t,T,'*-',t,T2); title('二次函数拟合'); p2 deltaT2=sum((T2-T).*(T2-T)) %三次函数 [p3,s3]=polyfit(t,T,3); T3=polyval(p3,t); subplot(1,3,2) plot(t,T,'*-',t,T3); title('三次函数拟合'); p3 deltaT3=sum((T3-T).*(T3-T)) %函数C=a*exp(-b(t-c)²) Te0=log(T); [pe,se]=polyfit(t,Te0,2); b=pe(1); c=pe(2)/2/b; a=exp(pe(3)+c); Te1=polyval(pe,t); Te2=exp(Te1); subplot(1,3,3) plot(t,T,'*-',t,Te2); title('a*exp(-b(t-c)²)拟合'); a b c deltaTe=sum((Te2-T).*(Te2-T))
3.微分方程和微分方程组的数值解
前面讨论的是微分方程的解析解,这里讨论常微分方程的数值解。(因为有很多的微分方程和方程组是无法求出解析解的)
常微分方程ODE、偏微分方程PDE。
以ode45为例:
>> help ode45 ode45 - Solve nonstiff differential equations — medium order method This MATLAB function, where tspan = [t0 tf], integrates the system of differential equations from t0 to tf with initial conditions y0. [t,y] = ode45(odefun,tspan,y0) [t,y] = ode45(odefun,tspan,y0,options) [t,y,te,ye,ie] = ode45(odefun,tspan,y0,options) sol = ode45(___)
解初值问题:
function f=fun(x,y) f=y+2*x/y; %命令行: ode45(@fun,[0,1],1)
function f=fun(x,y) f=y+y*y; %命令行: ode15s(@fun,[0,0.6],1)
function example ode15s(@fun,[0,100],[0,1]) %----------% function f=fun(x,y) dy1dx = 0.04*(1-y(1))-(1-y(2)).*y(1)+0.0001*(1-y(2)).^2; dy2dx = -1e4*dy1dx+3000*(1-y(2)).^2; f=[dy1dx;dy2dx];
% 1 %函数first_ode,假设0≤x≤1 function first_ode [T,Y]=ode45(@fun,[0,10],2) function f=fun(x,y) f=8-3*y; %命令行 first_ode % 2 %函数second_ode,假设0≤x≤1 function second_ode [T,Y]=ode15s(@fun,[0,1],[1,3]) function f=fun(x,y) f=[y(2);2*x/(1+x*x)*y(2)]; %命令行输入: second_ode % 3 %函数third_ode,假设0≤x≤1 function third_ode [T,Y]=ode45(@fun,[0,1],[1,2,3,4]) function f=fun(x,y) f=[y(2);y(3);y(4);2*y(4)-y(3)] %命令行输入: third_ode % 4 %函数fourth_ode,假设0≤t≤1 function fourth_ode [T,Y]=ode45(@fun,[0,1],[3/2,0]) function f=fun(t,y) dy1dt=-3*y(1)-y(2); dy2dt=y(2)-4*y(1)-2*dy1dt+exp(t); f=[dy1dt;dy2dt]; %命令行输入: fourth_ode
4.非线性方程和方程组的求解
在MATLAB中,解决线性方程(组)和非线性方程(组)可以用solve()、fsolve()、fzero()等函数。
①solve()
用来解代数方程(组)的符号解,eqnN为方程组的第N个方程,varN为第N个变量。
主要用法:X=solve('eqn1','eqn2',...,'eqnN','var1','var2',...,'varN')
>> help solve solve - Equations and systems solver This MATLAB function solves the equation eqn for the variable var. S = solve(eqn,var) S = solve(eqn,var,Name,Value) Y = solve(eqns,vars) Y = solve(eqns,vars,Name,Value) [y1,...,yN] = solve(eqns,vars) [y1,...,yN] = solve(eqns,vars,Name,Value) [y1,...,yN,parameters,conditions] = solve(eqns,vars,'ReturnConditions',true)
例子:
②fsolve()
用来解非线性方程(组)的求解。
主要用法:X=fsolve(fun,x0,options)
>> help fsolve fsolve - Solve system of nonlinear equations This MATLAB function starts at x0 and tries to solve the equations fun(x) = 0, an array of zeros. x = fsolve(fun,x0) x = fsolve(fun,x0,options) x = fsolve(problem) [x,fval] = fsolve(___) [x,fval,exitflag,output] = fsolve(___) [x,fval,exitflag,output,jacobian] = fsolve(___)
例子:
%建立存放函数的m文件: function y=sy35(x) y(1)=x(1)-0.5*sin(x(1))-0.3*cos(x(2)) y(2)=x(2)-0.5*cos(x(1))+0.3*sin(x(2)) %命令行 clear format short x0=[0.1,0.1] %x0是变量x的初始值,其维数要与变量x的维数一致。 fsolve(@sy35,x0,optimset('fsolve')) %这里optimset部分是优化设置,可以不用
③fzero()
用来解非线性方程(组)。
主要用法:类似于fsolve()
>> help fzero fzero - Root of nonlinear function This MATLAB function tries to find a point x where fun(x) = 0. x = fzero(fun,x0) x = fzero(fun,x0,options) x = fzero(problem) [x,fval,exitflag,output] = fzero(___)
%2.1,初始值为0.1 X=fsolve('x-exp(-x)',0.1,optimset('fsolve')) %2.2 clear f='5*x.^2.*sin(x)-exp(-x)'; x0=fsolve(f,0:10); j=2; num(1)=x0(1); for i=1:9 if (abs(x0(i+1)-x0(i)>10^(-5))) num(j)=x0(i+1); j=j+1; end end num %2.3 %定义函数sy23,可以把x记作x1,y记作x2 function y=sy23(x) y(1)=x(1)-0.7*sin(x(1))-0.2*cos(x(2)) y(2)=x(2)-0.7*cos(x(1))-0.2*sin(x(2)) %命令行: clear format short x0=[0.1,0.1]; fsolve(@sy23,x0,optimset('fsolve')) %2.4 fzero(@(x)x.^2.*exp(-x.^2)-0.2,0)
五、优化问题求解
1.线性规划问题
线性规划的一般形式:
目标函数:
约束条件:
不等式约束矩阵:
等式约束矩阵:
列向量 b 和 d 为右端向量,满足约束条件的向量 被称为可行解,所有可行解的集合称为可行区域,最优解就是达到目标函数值最大的可行解。
linprog函数——求解线性规划
X=linprog(f,A,b)
[X,fval,exitflag,ouyput,lamnda]=linprog(f,A,b,Aeq,Beq,LB,UB,X0,options)
f——由目标函数的系数构成的向量
A——(不等式约束条件)系数矩阵
b——(不等式约束条件)右端向量
Aeq——(等式约束条件)系数矩阵
Beq——(等式约束条件)右端向量
LB——约束变量的下界
UB——约束变量的上界
X0——给定的变量的初始值
options——控制规划过程的参数系列
fval——优化结束后得到的目标函数值
exitflag——=0表示优化结果已经超过了函数的估计值或者已声明的最大迭代次数;>0表示优化过程中变量收敛于解X;<0表示不收敛。
output——有3个分量,iterations表示优化过程的迭代次数,cgiterations表示PCG迭代次数,algorithm表示优化所采用的运算规则。
lambda——有4个分量,ineqlin是先行不等式约束条件,eqlin是线性等式约束条件,upper是变量的上界约束条件,lower是变量的下界约束条件。
clear f=-[7000,10000]; A=[8,6;4,8;4,6]; b=[380,300,220]; [X,fval]=linprog(f,A,b)
clear f=-[5,4,6]; A=[1,-2,1;3,2,4;3,2,0]; b=[20,42,30]; LB=[0;0;0]; [X,fval,exitflag,output,lambda]=linprog(f,A,b,[],[],LB)
使用linprog()命令时,系统默认参数至少3个,如果要给定第5个参数,那么第4个参数也必须给出,否则系统无法认定是第五个参数,遇到无法给出时,则用空矩阵[]代替。
2.非线性优化问题
(1) 非线性一元函数的最小值——fminbnd()
常用格式有:
X=fminbnd(fun,x1,x2)
[X,fval,exitflag,output]=fminbnd(fun,x1,x2)
其中,fun为目标函数,变量x满足边界约束x1≤ x ≤x2,X为返回的满足fun取得最小值的x的值,fval为此时的目标函数值。
exitflag>0表示计算收敛,exitflag=0表示超过了最大迭代次数,exitflag<0表示计算不收敛。
output有3个分量,iterations表示优化过程的迭代次数,funcCount是代入函数值的次数,algorithm是优化算法。
>> help fminbnd fminbnd - Find minimum of single-variable function on fixed interval This MATLAB function returns a value x that is a local minimizer of the scalar valued function that is described in fun in the interval x1 < x < x2. x = fminbnd(fun,x1,x2) x = fminbnd(fun,x1,x2,options) x = fminbnd(problem) [x,fval] = fminbnd(___) [x,fval,exitflag] = fminbnd(___) [x,fval,exitflag,output] = fminbnd(___)
clear fun='(x^5+x^3+x^2-1)/(exp(x^2)+sin(-x))'; ezplot(fun,[-2,2]) [X,fval,exitflag,output]=fminbnd(fun,-2,2)
X = 0.2176 fval = -1.1312 exitflag = 1 output = iterations: 12 funcCount: 13 algorithm: 'golden section search, parabolic interpolation'
(2) 无约束非线性多元变量的优化
两个命令:
fminsearch() 适合处理阶次低但是间断点多的函数
fminunc() 适合处理高阶连续函数
Ⅰ、fminsearch()的格式:
X=fminsearch(fun,X0)
[X,fval,exitflag,output]=fminsearch(fun,X0,options)
该命令求解目标函数fun的最小值和相应的x值。
X0为x的初始值,fval为返回的函数值,exitflag>0表示计算收敛,exitflag=0表示超过了最大迭代次数,exitflag<0表示计算不收敛。exitflag>0表示计算收敛,exitflag=0表示超过了最大迭代次数,exitflag<0表示计算不收敛。(好叭,说过好几遍了)
options是一个结构,里面有控制优化过程的各种参数,参考optimset()命令来设置,一般情况不必改动(缺省即可)。
>> help fminsearch fminsearch - Find minimum of unconstrained multivariable function using derivative-free method This MATLAB function starts at the point x0 and attempts to find a local minimum x of the function described in fun. x = fminsearch(fun,x0) x = fminsearch(fun,x0,options) x = fminsearch(problem) [x,fval] = fminsearch(___) [x,fval,exitflag] = fminsearch(___) [x,fval,exitflag,output] = fminsearch(___)
clear fun1='sin(x)*sin(x)+cos(y)'; fun2='sin(x(1))*sin(x(1))+cos(x(2))'; ezmesh(fun1) [X,fval]=fminsearch(fun2,[0,0])
Ⅱ、fminunc()的格式:
X=fminunc(fun,X0)
[X,fval,exitflag,output,grad,hessian]=fminunc(fun,X0,options)
该命令通过计算寻找多变量目标函数fun的最小值,X0为优化的初始值,X为返回的变量的值,grad返回解点的梯度,hessian返回解点的汉森矩阵,其他参数同上。
>> help fminunc fminunc - Find minimum of unconstrained multivariable function This MATLAB function starts at the point x0 and attempts to find a local minimum x of the function described in fun. x = fminunc(fun,x0) x = fminunc(fun,x0,options) x = fminunc(problem) [x,fval] = fminunc(___) [x,fval,exitflag,output] = fminunc(___) [x,fval,exitflag,output,grad,hessian] = fminunc(___)
clear fun='exp(x(1))*(2*x(1)^2+3*x(2)^2+2*x(1)*x(2)+3*x(2)+1)'; X0=[0,0]; options=optimset('largescale','off','display','iter','tolx',1e-8,'tolfun',1e-8); [X,fval,exitflag,output,grad,hessian]=fminunc(fun,X0,options)
3.有约束非线性多变量优化问题
fmincon()——处理有约束的非线性多元函数的优化问题。
有约束多变量优化问题的数学模型为:
求一组变量,满足在给定的约束条件下,使目标函数最小。
目标函数一般为非线性函数,约束条件有:
fmincon()的格式如下:
X = fmincon(fun,x0,A,b)
X = fmincon(fun,x0,A,b,Aeq,beq,Lb,Ub)
X = fmincon(fun,x0,A,b,Aeq,beq,Lb,Ub,nonlcon,options)
[X,fval,exitflag,output] = fmincon(fun,x0,...)
[X,fval,exitflag,output,lambda,grad,Hessian] = fmincon(fun,x0,...)
fun是目标函数,x0是变量的初始值,X为返回的满足要求的变量的值,返回值fval为目标函数。
A和b是线性不等式约束,Aeq和Beq表示线性等式约束,Lb和Ub分别为变量的上界和下界约束,nonlcon表示非线性约束条件。
lambda为拉格朗日乘子,显示哪个约束条件有效,grad表示梯度,hessian为汉森矩阵,options为控制优化过程的优化参数向量。
>> help fmincon fmincon - Find minimum of constrained nonlinear multivariable function This MATLAB function starts at x0 and attempts to find a minimizer x of the function described in fun subject to the linear inequalities A*x ≤ b. 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 = fmincon(problem) [x,fval] = fmincon(___) [x,fval,exitflag,output] = fmincon(___) [x,fval,exitflag,output,lambda,grad,hessian] = fmincon(___)
命令总结 (地址)适用于复习
一、常用对象操作:除了一般windows窗口的常用功能键外。
1、!dir 可以查看当前工作目录的文件。 !dir& 可以在dos状态下查看。
2、who 可以查看当前工作空间变量名, whos 可以查看变量名细节。
3、功能键:
功能键 快捷键 说明
方向上键 Ctrl+P 返回前一行输入
方向下键 Ctrl+N 返回下一行输入
方向左键 Ctrl+B 光标向后移一个字符
方向右键 Ctrl+F 光标向前移一个字符
Ctrl+方向右键 Ctrl+R 光标向右移一个字符
Ctrl+方向左键 Ctrl+L 光标向左移一个字符
home Ctrl+A 光标移到行首
End Ctrl+E 光标移到行尾
Esc Ctrl+U 清除一行
Del Ctrl+D 清除光标所在的字符
Backspace Ctrl+H 删除光标前一个字符 Ctrl+K 删除到行尾
Ctrl+C 中断正在执行的命令
4、clc可以命令窗口显示的内容,但并不清除工作空间。
二、函数及运算
1、运算符:
+:加, -:减, *:乘, /: 除, \:左除 ^: 幂,‘:复数的共轭转置, ():制定运算顺序。
2、常用函数表:
sin( ) 正弦(变量为弧度)
cot( ) 余切(变量为弧度)
sind( ) 正弦(变量为度数)
cotd( ) 余切(变量为度数)
asin( ) 反正弦(返回弧度)
acot( ) 反余切(返回弧度)
asind( ) 反正弦(返回度数)
acotd( ) 反余切(返回度数)
cos( ) 余弦(变量为弧度)
exp( ) 指数
cosd( ) 余弦(变量为度数)
log( ) 对数
acos( ) 余正弦(返回弧度)
log10( ) 以10为底对数
acosd( ) 余正弦(返回度数)
sqrt( ) 开方
tan( ) 正切(变量为弧度)
realsqrt( ) 返回非负根
tand( ) 正切(变量为度数)
abs( ) 取绝对值
atan( ) 反正切(返回弧度)
angle( ) 返回复数的相位角
atand( ) 反正切(返回度数)
mod(x,y) 返回x/y的余数
sum( ) 向量元素求和
3、其余函数可以用 help elfun 和 help specfun 命令获得。
4、常用常数的值:
pi 3.1415926…….
realmin 最小浮点数,2^-1022
realmax 最大浮点数,(2-eps)2^1022
i 虚数单位
j 虚数单位
Inf 无限值
eps 浮点相对经度=2^-52
NaN 空值
三、数组和矩阵:
1、构造数组的方法:增量法 linspace(first,last,num) first和last为起始和终止数,num为需要的数组元素个数。
2、构造矩阵的方法:可以直接用[ ]来输入数组,也可以用以下提供的函数来生成矩阵。
ones( ) 创建一个所有元素都为1的矩阵,其中可以制定维数,1,2….个变量
zeros() 创建一个所有元素都为0的矩阵
eye() 创建对角元素为1,其他元素为0的矩阵
diag() 根据向量创建对角矩阵,即以向量的元素为对角元素
magic() 创建魔方矩阵
rand() 创建随机矩阵,服从均匀分布
randn() 创建随机矩阵,服从正态分布
randperm() 创建随机行向量
horcat C=[A,B],水平聚合矩阵,还可以用cat(1,A,B)
vercat C=[A;B],垂直聚合矩阵, 还可以用cat(2,A,B)
repmat(M,v,h) 将矩阵M在垂直方向上聚合v次,在水平方向上聚合h次
blkdiag(A,B) 以A,和B为块创建块对角矩阵
length 返回矩阵最长维的的长度
ndims 返回维数
numel 返回矩阵元素个数
size 返回每一维的长度,[rows,cols]=size(A)
reshape 重塑矩阵,reshape(A,2,6),将A变为2×6的矩阵,按列排列。
rot90 旋转矩阵90度,逆时针方向
fliplr 沿垂轴翻转矩阵
flipud 沿水平轴翻转矩阵
transpose 沿主对角线翻转矩阵
ctranspose 转置矩阵,也可用A’或A.’,这仅当矩阵为复数矩阵时才有区别
inv 矩阵的逆
det 矩阵的行列式值
trace 矩阵对角元素的和
norm 矩阵或矢量的范数,norm(a,1),norm(a,Inf)…….
normest 估计矩阵的最大范数矢量
chol 矩阵的cholesky分解
cholinc 不完全cholesky分解
lu LU分解
luinc 不完全LU分解
qr 正交分解
kron(A,B) A为m×n,B为p×q,则生成mp×nq的矩阵,A的每一个元素都会乘上B,并占据p×q大小的空间
rank 求出矩阵的刺
pinv 求伪逆矩阵
A^p 对A进行操作
A.^P 对A中的每一个元素进行操作
四、数值计算
1、线性方程组求解
(1)AX=B的解可以用X=A\B求。XA=B的解可以用X= A/B求。如果A是m×n的矩阵,当m=n时可以找到唯一解,m<n,不定解,解中至多有m个非零元素。如果m>n,超定系统,至少找到一组解。如果A是奇异的,且AX=B有解,可以用X=pinv(A)×B返回最小二乘解
(2)AX=b, A=L×U,[L,U]=lu(A), X=U\(L\b),即用LU分解求解。
(3)QR(正交)分解是将一矩阵表示为一正交矩阵和一上三角矩阵之积,A=Q×R[Q,R]=chol(A), X=Q\(U\b)
(4)cholesky分解类似。
2、特征值
D=eig(A)返回A的所有特征值组成的矩阵。[V,D]=eig(A),还返回特征向量矩阵。
3、A=U×S×UT,[U,S]=schur(A).其中S的对角线元素为A的特征值。
4、多项式Matlab里面的多项式是以向量来表示的,其具体操作函数如下:
conv 多项式的乘法
deconv 多项式的除法,【a,b】=deconv(s),返回商和余数
poly 求多项式的系数(由已知根求多项式的系数)
polyeig 求多项式的特征值
Polyfit(x,y,n) 多项式的曲线拟合,x,y为被拟合的向量,n为拟合多项式阶数。
polyder 求多项式的一阶导数,polyder(a,b)返回ab的导数
[a,b]=polyder(a,b) 返回a/b的导数。
polyint 多项式的积分
polyval 求多项式的值
polyvalm 以矩阵为变量求多项式的值
residue 部分分式展开式
roots 求多项式的根(返回所有根组成的向量)
注:用ploy(A)求出矩阵的特征多项式,然后再求其根,即为矩阵的特征值。
5、插值常用的插值函数如下:
griddata 数据网格化合曲面拟合
Griddata3 三维数据网格化合超曲面拟合
interp1 一维插值(yi=interp1(x,y,xi,’method’)Method=nearest/linear/spline/pchip/cubic
Interp2 二维插值zi=interp1(x,y,z,xi,yi’method’),bilinear
Interp3 三维插值
interpft 用快速傅立叶变换进行一维插值,help fft。
mkpp 使用分段多项式
spline 三次样条插值
pchip 分段hermit插值
6、函数最值的求解
fminbnd(‘f’,x1,x2,optiset(,))求f在 x1和x2之间的最小值。Optiset选项可以有‘Display’+‘iter’/’off’/’final’,分别表示显示计算过程/不显示/只显示最后结果。fminsearch求多元函数的最小值。fzero(‘f’,x1)求一元函数的零点。X1为起始点。同样可以用上面的选项。
五、图像绘制:
1、基本绘图函数
plot 绘制二维线性图形和两个坐标轴
plot3 绘制三维线性图形和两个坐标轴
fplot 在制定区间绘制某函数的图像。fplot(‘f’,区域,线型,颜色)
loglog 绘制对数图形及两个坐标轴(两个坐标都为对数坐标)semilogx 绘制半对数坐标图形
semilogy 绘制半对数坐标图形
2、线型: 颜色 线型
y 黄色 . 圆点线 v 向下箭头
g 绿色 -. 组合 > 向右箭头
b 蓝色 + 点为加号形 < 向左箭头
m 红紫色 o 空心圆形 p 五角星形
c 蓝紫色 * 星号 h 六角星形
w 白色 . 实心小点 hold on 添加图形
r 红色 x 叉号形状 grid on 添加网格
k 黑色 s 方形 - 实线
d 菱形 -- 虚线 ^ 向上箭头
3、可以用subplot(3,3,1)表示将绘图区域分为三行三列,目前使用第一区域。此时如要画不同的图形在一个窗口里,需要hold on。
附录1.1 管理用命令
函数名 功能描述 函数名 功能描述
addpath 增加一条搜索路径 rmpath 删除一条搜索路径
demo 运行Matlab演示程序 type 列出.M文件
doc 装入超文本文档 version 显示Matlab的版本号
help 启动联机帮助 what 列出当前目录下的有关文件
lasterr 显示最后一条信息 whatsnew 显示Matlab的新特性
lookfor 搜索关键词的帮助 which 造出函数与文件所在的目录
path 设置或查询Matlab路径
附录1.2管理变量与工作空间用命令
函数名 功能描述 函数名 功能描述
clear 删除内存中的变量与函数 pack 整理工作空间内存
disp 显示矩阵与文本 save 将工作空间中的变量存盘
length 查询向量的维数 size 查询矩阵的维数
load 从文件中装入数据 who,whos 列出工作空间中的变量名
附录1.3文件与操作系统处理命令
函数名 功能描述 函数名 功能描述
cd 改变当前工作目录 edit 编辑.M文件
delete 删除文件 matlabroot 获得Matlab的安装根目录
diary 将Matlab运行命令存盘 tempdir 获得系统的缓存目录
dir 列出当前目录的内容 tempname 获得一个缓存(temp)文件
! 执行操作系统命令
附录1.4窗口控制命令
函数名 功能描述 函数名 功能描述
echo 显示文件中的Matlab中的命令 more 控制命令窗口的输出页面
format 设置输出格式
附录1.5启动与退出命令
函数名 功能描述 函数名 功能描述
matlabrc 启动主程序 quit 退出Matlab环境
startup Matlab自启动程序
附录2 运算符号与特殊字符附录
2.1运算符号与特殊字符
函数名 功能描述 函数名 功能描述
+ 加 ... 续行标志
- 减 , 分行符(该行结果不显示)
* 矩阵乘 ; 分行符(该行结果显示)
.* 向量乘 % 注释标志
^ 矩阵乘方 ! 操作系统命令提示符
.^ 向量乘方 ' 矩阵转置
kron 矩阵kron积 . 向量转置
\ 矩阵左除 = 赋值运算
/ 矩阵右除 == 关系运算之相等
.\ 向量左除 ~= 关系运算之不等
./ 向量右除 < 关系运算之小于
: 向量生成或子阵提取 <= 关系运算之小于等于
() 下标运算或参数定义 > 关系运算之大于
[] 矩阵生成 >= 关系运算之大于等于
& 逻辑运算之与
. 结构字段获取符 | 逻辑运算之或
. 点乘运算,常与其他运算符联合使用(如.\)
~ 逻辑运算之非
xor 逻辑运算之异成
附录2.2逻辑函数
函数名 功能描述 函数名 功能描述
all 测试向量中所用元素是否为真 is*(一类函数) 检测向量状态.其中*表示一个确定的函数(isinf)
any 测试向量中是否有真元素 *isa 检测对象是否为某一个类的对象
exist 检验变量或文件是否定义 logical 将数字量转化为逻辑量
find 查找非零元素的下标
附录3 语言结构与调试
附录3.1编程语言
函数名 功能描述 函数名 功能描述
builtin 执行Matlab内建的函数 global 定义全局变量
eval 执行Matlab语句构成的字符串 nargchk 函数输入输出参数个数检验
feval 执行字符串指定的文件 script Matlab语句及文件信息
function Matlab函数定义关键词
附录3.2控制流程
函数名 功能描述 函数名 功能描述
break 中断循环执行的语句 if 条件转移语句
case 与switch结合实现多路转移 otherwise 多路转移中的缺省执行部分
else 与if一起使用的转移语句 return 返回调用函数
elseif 与if一起使用的转移语句 switch 与case结合实现多路转移
end 结束控制语句块 warning 显示警告信息
error 显示错误信息 while 循环语句
for 循环语句
附录3.3交互输入
函数名 功能描述 函数名 功能描述
input 请求输入 menu 菜单生成
keyboard 启动键盘管理 pause 暂停执行
附录3.4面向对象编程
函数名 功能描述 函数名 功能描述
class 生成对象 isa 判断对象是否属于某一类
double 转换成双精度型 superiorto 建立类的层次关系
inferiorto 建立类的层次关系 unit8 转换成8字节的无符号整数
inline 建立一个内嵌对象
附录3.5调试
函数名 功能描述 函数名 功能描述
dbclear 清除调试断点 dbstatus 列出所有断点情况
dbcont 调试继续执行 dbstep 单步执行
dbdown 改变局部工作空间内存 dbstop 设置调试断点
dbmex 启动对Mex文件的调试 sbtype 列出带命令行标号的.M文件
dbquit 退出调试模式 dbup 改变局部工作空间内容
dbstack 列出函数调用关系
附录4 基本矩阵与矩阵处理
附录4.1基本矩阵
函数名 功能描述 函数名 功能描述
eye 产生单位阵 rand 产生随机分布矩阵
linspace 构造线性分布的向量 randn 产生正态分布矩阵
logspace 构造等对数分布的向量 zeros 产生零矩阵
ones 产生元素全部为1的矩阵 : 产生向量
附录4.2特殊向量与常量
函数名 功能描述 函数名 功能描述
ans 缺省的计算结果变量 non 非数值常量常由0/0或Inf/Inf获得
computer 运行Matlab的机器类型 nargin 函数中参数输入个数
eps 精度容许误差(无穷小) nargout 函数中输出变量个数
flops 浮点运算计数 pi 圆周率
i 复数单元 realmax 最大浮点数值
inf 无穷大 realmin 最小浮点数值
inputname 输入参数名 varargin 函数中输入的可选参数
j 复数单元 varargout 函数中输出的可选参数
附录4.3时间与日期
函数名 功能描述 函数名 功能描述
calender 日历 eomday 计算月末
clock 时钟 etime 所用时间函数
cputime 所用的CPU时间 now 当前日期与时间
date 日期 tic 启动秒表计时器
datenum 日期(数字串格式) toc 读取秒表计时器
datestr 日期(字符串格式) weekday 星期函数
datevoc 日期(年月日分立格式)
附录4.4矩阵处理
函数名 功能描述 函数名 功能描述
cat 向量连接 reshape 改变矩阵行列个数
diag 建立对角矩阵或获取对角向量 rot90 将矩阵旋转90度
fliplr 按左右方向翻转矩阵元素 tril 取矩阵的下三角部分
flipud 按上下方向翻转矩阵元素 triu 取矩阵的上三角部分
repmat 复制并排列矩阵函数
附录5 特殊矩阵
函数名 功能描述 函数名 功能描述
compan 生成伴随矩阵 invhilb 生成逆hilbert矩阵
gallery 生成一些小的测试矩阵 magic 生成magic矩阵
hadamard 生成hadamard矩阵 pascal 生成pascal矩阵
hankel 生成hankel矩阵 toeplitz 生成toeplitz矩阵
hilb 生成hilbert矩阵 wilkinson 生成wilkinson特征值测试矩阵
附录6 数学函数
附录6.1三角函数
函数名 功能描述 函数名 功能描述
sin/asin 正弦/反正弦函数 sec/asec 正割/反正割函数
sinh/asinh 双曲正弦/反双曲正弦函数 sech/asech 双曲正割/反双曲正割函数
cos/acos 余弦/反余弦函数 csc/acsc 余割/反余割函数
cosh/acosh 双曲余弦/反双曲余弦函数 csch/acsch 双曲余割/反双曲余割函数
tan/atan 正切/反正切函数 cot/acot 余切/反余切函数
tanh/atanh 双曲正切/反双曲正切函数 coth/acoth 双曲余切/反双曲余切函数
atan2 四个象限内反正切函数
附录6.2指数函数
函数名 功能描述 函数名 功能描述
exp 指数函数 log10 常用对数函数
log 自然对数函数 sqrt 平方根函数
附录6.3复数函数
函数名 功能描述 函数名 功能描述
abs 绝对值函数 imag 求虚部函数
angle 角相位函数 real 求实部函数
conj 共轭复数函数
附录6.4数值处理
函数名 功能描述 函数名 功能描述
fix 沿零方向取整 round 舍入取整
floor 沿-∞方向取整 rem 求除法的余数
ceil 沿+∞方向取整 sign 符号函数
附录6.5其他特殊数学函数
函数名 功能描述 函数名 功能描述
airy airy函数 erfcx 比例互补误差函数
besselh bessel函数(hankel函数) erfinv 逆误差函数
bessili 改进的第一类bessel函数 expint 指数积分函数
besselk 改进的第二类bessel函数 gamma gamma函数
besselj 第一类bessel函数 gammainc 非完全gamma函数
bessely 第二类bessel函数 gammaln gamma对数函数
beta beta函数 gcd 最大公约数
betainc 非完全的beta函数 lcm 最小公倍数
betaln beta对数函数 log2 分割浮点数
elipj Jacobi椭圆函数 legendre legendre伴随函数
ellipke 完全椭圆积分 pow2 基2标量浮点数
erf 误差函数 rat 有理逼近
erfc 互补误差函数 rats 有理输出