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