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