如何阅读matlab项目并调试运行成,【转】读书笔记:MATLAB
MATLAB(01)
今天開(kāi)始寫(xiě)讀書(shū)筆記,第一本書(shū)是《高等應(yīng)用數(shù)學(xué)問(wèn)題的MATLAB求解》。
MATLAB語(yǔ)言是科學(xué)研究者首選的計(jì)算機(jī)數(shù)學(xué)語(yǔ)言。大多數(shù)學(xué)生缺乏對(duì)應(yīng)用數(shù)學(xué)問(wèn)題的全面了解,不清楚什么問(wèn)題能用數(shù)學(xué)描述,什么樣的數(shù)學(xué)問(wèn)題能求解,以至于走了很多彎路。通過(guò)學(xué)習(xí)MATLAB語(yǔ)言可以使數(shù)學(xué)問(wèn)題求解能力顯著提高,即使對(duì)某些數(shù)學(xué)公式理解不夠深刻,只要學(xué)習(xí)了MATLAB語(yǔ)言也能容易地求解類(lèi)似問(wèn)題,畢竟科學(xué)研究者和工程技術(shù)人員通常不考慮為什么這樣做,而只考慮結(jié)果是什么。借助MATLAB數(shù)學(xué)基礎(chǔ)不深厚的人同樣能輕易利用計(jì)算機(jī)解決高深的應(yīng)用數(shù)學(xué)問(wèn)題。
第1章 計(jì)算機(jī)數(shù)學(xué)語(yǔ)言概述
1.1為什么學(xué)習(xí)計(jì)算機(jī)數(shù)學(xué)語(yǔ)言
并不是所有數(shù)學(xué)問(wèn)題都能手工推導(dǎo)的,手工推導(dǎo)有時(shí)是不易、不可靠、不精確甚至是不可能的,所以需要計(jì)算機(jī)的幫助。用計(jì)算機(jī)的方式有兩種,其一是數(shù)值分析,其二是計(jì)算機(jī)語(yǔ)言,前者只能解數(shù)值計(jì)算問(wèn)題,后者還可以解決像公式推導(dǎo)這樣的問(wèn)題。
許多專(zhuān)門(mén)的學(xué)科在介紹原理與方法時(shí)一般采用簡(jiǎn)單的例子,回避高階和復(fù)雜的例子,這樣得到的方法和結(jié)論只是理論上的,用于解決現(xiàn)實(shí)的實(shí)際問(wèn)題往往是比較困難的,所以需要借助計(jì)算機(jī)數(shù)學(xué)語(yǔ)言。
1.2 數(shù)學(xué)問(wèn)題的解析解與數(shù)值解
數(shù)學(xué)家往往關(guān)注解析解以及解的存在性的嚴(yán)格證明,而工程技術(shù)人員通常只關(guān)心最后的數(shù)值解。數(shù)學(xué)上,解析解不存在的情況很普遍,例如圓周率就沒(méi)有解析解,工程技術(shù)人員也不關(guān)心圓周率是怎么求得的,只是想知道能滿(mǎn)足精度要求的數(shù)值,一般的計(jì)算取3.1416即可,粗略的計(jì)算取3.14也未嘗不可。
第2章 MATLAB語(yǔ)言程序設(shè)計(jì)基礎(chǔ)
MATLAB的主要特點(diǎn):
簡(jiǎn)介高效 一條語(yǔ)句頂C/C++數(shù)百條
科學(xué)運(yùn)算能力強(qiáng)大 MATLAB以矩陣為基本單元
繪圖功能 論文中必須給出二維或三維圖形
工具箱 為各專(zhuān)業(yè)量身定制
動(dòng)態(tài)系統(tǒng)仿真 轉(zhuǎn)用ANSYS等專(zhuān)業(yè)軟件
2.1 MATLAB程序設(shè)計(jì)語(yǔ)言基礎(chǔ)
2.1.1 MATLAB語(yǔ)言的變量和常量
變量必須由字母打頭,且區(qū)分大小寫(xiě)。
MATLAB保留的變量:
eps——浮點(diǎn)運(yùn)算誤差限,默認(rèn)2.2201e-16,若某個(gè)值小于eps則會(huì)被視為0
i,j——循環(huán)變量,用于純虛數(shù)量,應(yīng)恢復(fù)i=sqrt(-1)
inf——無(wú)窮大,-inf為無(wú)窮小,若除數(shù)為0,MATLAB也不會(huì)中止運(yùn)算,而是給出一個(gè)“除0”警告,并將結(jié)果賦成inf
NaN——not a number不定式,用于0/0,inf/inf運(yùn)算
lasterr、lastwarn、pi
2.1.2 數(shù)據(jù)結(jié)構(gòu)
數(shù)值型數(shù)據(jù):一般為double(),在圖形處理等計(jì)算中通常使用uint8()uint16()int8()int32()等,u表示無(wú)正負(fù)號(hào),數(shù)字表示位數(shù)。
符號(hào)型數(shù)據(jù):用于推導(dǎo)公式和解析解法,使用前首先需要將采用的變量申明為符號(hào)變量
syms list props,例如syms a b,props可以是real,positive等。
變精度算法函數(shù)vpa()可以將符號(hào)型數(shù)值以任意精度顯示出來(lái),vpa(pi)將顯示圓周率的32位有效數(shù)字,
vpa(pi,100)將顯示圓周率的100位有效數(shù)字,pi也可以換成矩陣。
其他數(shù)據(jù)結(jié)構(gòu):字符串型數(shù)據(jù)、多位數(shù)組、單元數(shù)組、類(lèi)于對(duì)象。
2.1.3 MATLAB的基本語(yǔ)句結(jié)構(gòu)
分兩種:直接賦值語(yǔ)句、函數(shù)調(diào)用語(yǔ)句
直接賦值語(yǔ)句:
末尾帶分號(hào)則不會(huì)顯示運(yùn)算結(jié)果,不帶則直接顯示
如果沒(méi)有指定變量,則結(jié)果賦予保留變量ans
注釋以%打頭
矩陣輸入:A=[1,2,3;4 5,6;7 8 9]
函數(shù)調(diào)用語(yǔ)句:[返回變量列表]=函數(shù)名(輸入變量列表)
一個(gè)函數(shù)名對(duì)應(yīng)一個(gè).m文件或MATLAB內(nèi)部函數(shù)。
[]可以用逗號(hào)和空格分隔[U,S,V],(X,Y,Z)只能用逗號(hào)分隔,為了避免混亂以后所有分隔用逗號(hào)完成。
2.1.4 冒號(hào)表達(dá)式與子矩陣提取
v1=1:0.2:pi
向量v1=1 1.2 1.4 1.6 1.8 2.0 2.2 2.4 2.6 2.8 3.0
v2=1:pi
v2=1 2 3
v3=pi:-1:1
v3=3.1416 2.1416 1.1416
v4=1:-1:pi
Empty matrix
提取子矩陣:
:表示整行或整列
end表示最后一行或一列
B1=A(1:2:end,[2,3,4]) %奇數(shù)行234列
B2=A([1,2,3],[2,3,4]) 3行234列
B1=A(end:-1:1,:) %上下翻轉(zhuǎn),最后一行排在第一行,列排序不變
2.2 基本數(shù)學(xué)運(yùn)算
2.2.1 矩陣的代數(shù)運(yùn)算
矩陣轉(zhuǎn)置:如果矩陣元素含有復(fù)數(shù)元素,則轉(zhuǎn)置后取其共軛復(fù)數(shù)值,稱(chēng)為Hermit轉(zhuǎn)置,記為B=A*,MATLAB中用A’表示。而矩陣的一般轉(zhuǎn)置用A.’表示。
加減法運(yùn)算:A和B的維數(shù)若相同,則相應(yīng)元素相加減;若二者之一為標(biāo)量,則遍加減于每個(gè)元素;否則報(bào)錯(cuò)。
矩陣乘法:C=A*B,并不需要指定二者的維數(shù),若不相容則報(bào)錯(cuò)
矩陣的左除:A\B表示A-1B
矩陣的右除:B/A表示B A-1
矩陣翻轉(zhuǎn):fliplr(A)左右翻轉(zhuǎn),flipud(A)上下翻轉(zhuǎn),rot90(A)逆時(shí)針?lè)D(zhuǎn)90度
矩陣乘方運(yùn)算:只有方陣可進(jìn)行乘方運(yùn)算,B=A^x
點(diǎn)運(yùn)算:這是一種特殊且非常重要的運(yùn)算,即對(duì)應(yīng)元素的直接運(yùn)算,這要求二者維數(shù)相同。A.*B、A.^x、A.^A
2.2.2 矩陣的邏輯運(yùn)算
邏輯運(yùn)算的結(jié)果是一個(gè)矩陣,矩陣的元素非0即1。
與運(yùn)算:C=A&B,只有當(dāng)AB所有元素非0,C才為1,否則C取0
或運(yùn)算:C=A|B,只有當(dāng)AB所有元素為0,C才為0,否則C取1
非運(yùn)算:C=~A,只有當(dāng)A元素為0,C為1,否則C取0
異或運(yùn)算:C=xor(A,B),只有當(dāng)AB元素一個(gè)非0,一個(gè)為0,C才為1,否則取0,即只有二者邏輯結(jié)果不同才可取1,若相同則取0
2.2.3 矩陣的比較運(yùn)算
一般比較運(yùn)算的結(jié)果是一個(gè)矩陣,矩陣的元素非0即1。
C=A>B僅當(dāng)A的元素大于B的對(duì)應(yīng)元素C才取1,否則C取0.
類(lèi)似的還有< 、>=、<
=、==、~=等
find()、all()、any()函數(shù)
find()函數(shù)用于從矩陣中提取滿(mǎn)足條件的元素的下標(biāo),下標(biāo)的表示方式有兩種:
第一種,依次將矩陣的第一列、第二列???排列成一個(gè)列向量,輸出結(jié)果為這個(gè)列向量的下標(biāo),例如A=[1,2,3;4,5,6;7,8,9]變形為列向量就是A1={1,4,7,2,5,8,3,7,9},find(A>=5)’的結(jié)果是3
5 6 8 9即A1列向量中的這些下標(biāo)的元素滿(mǎn)足大于等于5的篩選條件。
第二種,更為直觀(guān)地輸出行列下標(biāo),[i,j]=find(B>4);[i,j]的輸出結(jié)果為
ans =
3 1
2 2
3 2
2 3
3 3
左側(cè)為行標(biāo),右側(cè)為列標(biāo)
all()、any()函數(shù)返回的都是一個(gè)行向量,元素的數(shù)量跟A矩陣的列數(shù)相等,每個(gè)元素非0即1。
all(A>4)返回的行向量表示A矩陣中哪一列的所有元素都大于4
any(A>4)返回的行向量表示A矩陣中哪一列中存在至少一個(gè)元素大于4
2.2.4 解析結(jié)果的化簡(jiǎn)和變換
變量s用于表示解析式之前必須首先聲明符號(hào)變量syms s
s1=simple(s)自動(dòng)選擇最簡(jiǎn)格式進(jìn)行化簡(jiǎn)
[s1,var1]=simple(s),字符串變量var1輸出自動(dòng)選擇的化簡(jiǎn)方法的名稱(chēng)
常用的化簡(jiǎn)方法有:
collect()合并同類(lèi)項(xiàng)
expand()展開(kāi)多項(xiàng)式
factor()因式分解
numden()提取多項(xiàng)式的分子和分母
sincos()三角函數(shù)化簡(jiǎn)
subs()用于變量替換
>> syms a b c x m p q
>> f=a*x^2+b*x+c;
>> g=subs(f,a,m)
g =m*x^2 + b*x + c
>> h=subs(g,{b,c},{p,q})
h =m*x^2 + p*x + q
2.2.5 基本數(shù)論運(yùn)算
floor()向負(fù)無(wú)窮方向取整
ceil()向正無(wú)窮方向取整
round就近取整
fix趨零取整
[n,m]=rat(A)將A中所有元素變換成最簡(jiǎn)有理數(shù),分子存儲(chǔ)在矩陣n中,分母m中
rem(A,B)A中元素對(duì)B中元素求模得出的余數(shù)
gcd(n,m) 最大公約數(shù)
lcm(n,m)最小公倍數(shù)
factor質(zhì)因數(shù)分解
isprime是否為質(zhì)數(shù),以0/1表示
A=1:100;B=A(isprime(A))
2.3 流程結(jié)構(gòu)
;表示當(dāng)前代碼未結(jié)束輸入,但是需要換行,所以并不會(huì)立刻執(zhí)行計(jì)算;有時(shí)一行代碼中間也使用;表示在一行中書(shū)寫(xiě)原本應(yīng)該多行書(shū)寫(xiě)的代碼。
for、while、if、switch case、try catch
如果能對(duì)整個(gè)矩陣進(jìn)行運(yùn)算時(shí),盡量不要采用循環(huán)結(jié)構(gòu)
s=0;
for i=1:100
s=s+1;
…
end
case{,,,}
try,A
catch,B
end
首先試探性地執(zhí)行A,如果沒(méi)有錯(cuò)誤則end,否則將錯(cuò)誤信息賦值給lasterr并中止A轉(zhuǎn)而執(zhí)行B。A通常是高效但不穩(wěn)定的算法,B通常是低效但穩(wěn)定的算法,B也可用于說(shuō)明A中的錯(cuò)誤原因
2.4 函數(shù)編寫(xiě)與調(diào)試
2.4.1 基本結(jié)構(gòu)
兩種源程序文件格式:M-文件、M-函數(shù)。常用后者。
保留變量nargin和nargout用于確定函數(shù)的輸入和輸出變量的個(gè)數(shù)。
[輸出變量列表]=函數(shù)名(輸入變量列表),均用逗號(hào)分隔。
help 函數(shù)名:顯示注釋語(yǔ)句內(nèi)容,但空格行下方的注釋不被顯示。
if abs(n-floor(n))>eps|n<0
error(‘n應(yīng)該是非負(fù)整數(shù)’);
上面的代碼涉及abs、floor、eps、error、|等符號(hào),用于判定是否為非負(fù)整數(shù)。
函數(shù)可以遞歸調(diào)用:
function srhf_fact(n)
if n>1
k=n*srhf_fact(n-1);
elseif any[0,1]==n
k=1
end
2.4.2 可變輸入輸出個(gè)數(shù)
如何建立起無(wú)限個(gè)輸入或輸出變量的函數(shù)?這種方式被廣泛采用。
conv(A,B)用于求多項(xiàng)式的乘積,多個(gè)多項(xiàng)式的乘積只能嵌套使用此函數(shù),即conv(C,
conv(A,B))。這樣很不方便,可以考慮編寫(xiě)一個(gè)新的函數(shù)convs,其輸入變量不限于2個(gè),而是無(wú)限個(gè),在MATLAB中“無(wú)限”并不是純粹數(shù)學(xué)上的無(wú)限,而是指輸入或輸出變量的個(gè)數(shù)不再于函數(shù)編寫(xiě)時(shí)加以限制,所以在函數(shù)中需要知道用戶(hù)在輸入變量列表中給出了幾個(gè)變量,這需要調(diào)用length函數(shù)。
函數(shù)輸入變量列表可以是一個(gè)變量(實(shí)際上是一個(gè)向量)
varargin,此變量是保留變量,它表示多個(gè)變量的集合,那么length(varargin)的輸出變量是一個(gè)正整數(shù),表示varargin中具體包含的變量數(shù)量。
function a=convs(varargin)
a=1;
varnum= length(varargin);
for i=1:varnum
a=conv(a,varargin{i});
end
end
2.4.3 inline函數(shù)與匿名函數(shù)
一個(gè)簡(jiǎn)單的函數(shù),沒(méi)有必要單獨(dú)創(chuàng)建一個(gè).m文件,只用一行代碼進(jìn)行描述即可。
function a=f(x,y)
a=sin(x.^2+y.^2)
end
上面的函數(shù)是在.m文件中的代碼,而有些情況下,如微分方程求解和最優(yōu)化問(wèn)題,這樣的函數(shù)可以采用inline函數(shù)的形式給出。
f=inline(‘sin(x.^2+y.^2)’,’x’,’y’)
以上兩種函數(shù)定義形式,無(wú)論采用哪種,都可以通過(guò)z=f(3,6)直接求出z=0.8509,顯然inline函數(shù)更為簡(jiǎn)便。
匿名函數(shù)跟inline函數(shù)類(lèi)似,區(qū)別有二:更簡(jiǎn)潔、可直接使用工作空間中的變量。
簡(jiǎn)潔體現(xiàn)在f=@(x,y) sin(x.^2+y.^2)
變量的優(yōu)勢(shì)十分明顯:一般函數(shù)中的變量,無(wú)論是輸入變量還是輸出變量只在函數(shù)內(nèi)部使用,跟工作空間中的變量是相對(duì)隔離的,工作變量作為輸入變量代入函數(shù),工作變量便替換函數(shù)變量進(jìn)行計(jì)算,最后函數(shù)將輸出變量的結(jié)果代入工作變量返回工作空間。這樣做雖然嚴(yán)謹(jǐn),有效避免了變量使用上的混亂,但有時(shí)不夠方便,匿名函數(shù)的引入,有效地將工作變量和函數(shù)變量結(jié)合起來(lái),使用上更為靈活,但有一點(diǎn)需要注意,匿名函數(shù)直接引用工作變量,只是引用當(dāng)時(shí)的工作變量的值,引用完成之后,如果工作變量的值發(fā)生變化,匿名函數(shù)所引用的工作變量值不會(huì)隨著變化,仍然是之前的值。
2.5 二維圖形繪制
2.5.1基本函數(shù):plot(t,y)
t1,t2,t3時(shí)刻的函數(shù)值分別是y(t1),y(t2),y(t3),將其輸入MATLAB就是兩個(gè)向量t=[t1,t2,t3],y=[
y(t1),y(t2),y(t3)
],這種曲線(xiàn)實(shí)際上是各個(gè)時(shí)刻對(duì)應(yīng)函數(shù)值之間的折線(xiàn),當(dāng)t向量足夠密集,看起來(lái)就是曲線(xiàn)了,所以在某些特殊區(qū)間(慢變化區(qū)間)可以取點(diǎn)較稀疏,以提高運(yùn)算速度,在另一些區(qū)間(快變化區(qū)間)則需要較密集,以得到這些特殊區(qū)間的較為準(zhǔn)確的圖形。
(1) t、y均為向量,如上,還有更為簡(jiǎn)單的形式plot([t1,t2,t3],[y1,y2,y3])
(2)
t為向量,y為矩陣。將y矩陣的每一行作為y向量與t共同繪制一條曲線(xiàn),曲線(xiàn)數(shù)量跟y矩陣行數(shù)相等,這要求y矩陣的列數(shù)跟t向量的元素個(gè)數(shù)相等。
(3) t、y均為矩陣。要求t、y矩陣行列數(shù)均相等,取t矩陣的一行與y矩陣的同一行組成向量對(duì)進(jìn)行繪制。
(4)
以上三種組合形式,如果不止一對(duì)t、y,而是多對(duì),那么不必多次使用plot函數(shù),可以這樣一次繪出所有的圖形plot(t1,y1,t2,y2,t3,y3)或plot(t1,y1,Option1,t2,y2,
Option2,t3,y3, Option3),Option的具體用法參見(jiàn)P30.
圖形的附屬命令:
grid on/off:打開(kāi)或關(guān)閉網(wǎng)格
hold on/off:保護(hù)當(dāng)前坐標(biāo),以后再用plot函數(shù)時(shí)新的曲線(xiàn)將疊印在現(xiàn)有坐標(biāo)系上
title():添加標(biāo)題
xlabel()和ylabel():給坐標(biāo)軸加標(biāo)注
(abs(x)>n):將此式與其他解析式點(diǎn)乘,當(dāng)x在(-n,n)區(qū)間以外此式取1,否則取0,這是分段函數(shù)在MATLAB中的表達(dá)方式。
所得圖形中有多個(gè)對(duì)象,如曲線(xiàn)、坐標(biāo)軸、圖形窗口等,每個(gè)對(duì)象都可以設(shè)置具體屬性,屬性也可以被讀取。
set(句柄,’屬性名1’,屬性值1,’屬性名2’,屬性值2…)
v=get(句柄,’屬性名1’)
屬性名必須加單引號(hào),屬性值不加。
2.5.2 特殊意義的圖形繪制函數(shù):參見(jiàn)P32.
2.5.3隱函數(shù)的繪制
隱函數(shù):f(x,y)=0
ezplot(‘f(x,y)’)或ezplot(‘f(x,y)’,[-m,n]) 僅在[-m,n]上繪制隱函數(shù)圖形
2.6 三維圖形繪制
2.6.1三維曲線(xiàn)繪制
plot3(x,y,z)或plot3(x1,y1,z1,選項(xiàng)1,…)
2.6.2 三維曲面繪制
已知z=f(x,y),先用meshgrid()繪制網(wǎng)格矩陣數(shù)據(jù)x,y,再基于此平面繪制三位曲面,mesh()網(wǎng)格圖,surf()表面圖,surfc()帶等高線(xiàn),surfl()帶光照,contour()等高線(xiàn),contour3()三維等高線(xiàn)。例:
[x,y]=meshgrid(0:10,-5:5) %在(x,y)平面上繪制一個(gè)正方形網(wǎng)格矩陣
z=x.^2+y.^2
surf(x,y,z)
axis(-31,31,0,62,0,1) %將所得圖形的立方體內(nèi)的部分放大,名為重設(shè)坐標(biāo)系,增大可讀性
shading faceted/interp/flat %修飾顯示形式,默認(rèn)第一個(gè)
set(gca,’xlim,[-5,5]) %將x軸限制在一個(gè)區(qū)間內(nèi)
2.6.3 三位圖形的視角
view(a,b),方位角a表示從-y軸向+x軸方向逆時(shí)向旋轉(zhuǎn)的角度,仰角b表示從xy平面向+z軸方向旋轉(zhuǎn)的角度,默認(rèn)情況下a=-37.5,b=30.
下圖是我用MATLAB繪制出的第一張圖,紀(jì)念一下。
z=x.^2+y.^2
總結(jié)
以上是生活随笔為你收集整理的如何阅读matlab项目并调试运行成,【转】读书笔记:MATLAB的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Linux - uptime命令平均负载
- 下一篇: matlab人脸追踪,求大神帮助我这个菜