本渣想回過頭來整理一下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 有理輸出