入坑MATLAB必会的吐血总结
本渣想回过头来整理一下MATLAB的一些基本的知识(很多东西比较琐碎,应该系统的梳理梳理),下文中没有提到的,自己用help查即可。
此文用来存个档,便于回顾。
SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。由于matlab各版本部分语法存在差异,可能会出现bug,用help查帮助文档即可。
变量名:字母数字串(第一个字符必须英文字母 | 字符间无空格 | 最多19个字符);
用%注解;
检查现存于工作空间(Workspace)的变量,可键入who;
检查更加详细的信息,可键入whos;
删除工作空间里的变量clear;
一些永久常数:
基本虚数单位 i或j;
系统的浮点精确度 eps;
无限大 inf;
系统所能表示的最大/最小数值 realmax / realmin;
非数值 NaN;
圆周率 pi;
函数的输入/输出参数个数 nargin / nargout;
搜寻路径:which(空格)文件名;
一、线性代数
1.矩阵
基本命令:
- 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为单位矩阵的行变换矩阵
例子:
解方程组
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
解线性方程组
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
解齐次线性方程组
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')
求非齐次线性方程组的通解
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
2.图形功能
这一块结合实例来了解相关函数。
二维图像:
①——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);
3.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≤+∞)
程序:
m=-10:0.05:10; n=-10:0.05:10; [x,y]=meshgrid(m,n); z=x.*y.*(1-(x.^2+y.^2)); mesh(x,y,z)
图形:
- 双曲面
直角坐标方程:
参数方程:x=asinθcosφ;y=bsinθsinφ;z=ccosθ (0≤θ≤π, 0≤φ<2π)
程序:
图形:
- 椭圆锥面
直角坐标方程:
参数方程:x=asinθcosφ;y=bsinθsinφ;z=ccosθ (0≤θ≤π, 0≤φ<2π)
程序:
图形:
- 柱面
直角坐标方程:
参数方程:x=asinθcosφ;y=bsinθsinφ;z=ccosθ (0≤θ≤π, 0≤φ<2π)
程序:
图形:
4.二重积分
5.三重积分
6.对弧长的曲线积分
7.对坐标的曲线积分
8.对面积的曲面积分
9.对坐标的曲面积分
10.级数
11.傅里叶级数
微分方程和微分方程组
三、概率统计
四、数值分析
五、其他数学运算
六、研究性学习
