本渣想回过头来整理一下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)
&
请发表评论