MATLAB介紹

刘德旺 2024-09-09 13:00 10次浏览 0 条评论 taohigo.com

一、MATLAB軟件介紹

1、軟件概況

MATLAB是美國Math Works 公司開發的大型數學計算軟件,它具有強大的矩陣處理功能和繪圖功能,已經廣泛地應用於科學研究和工程技術的各個領域。在科學研究和工程應用中,往往要進行大量的數學計算,其中包括矩陣運算。這些運算一般來說難以用手工精確和快捷地進行,而要借助計算機編制相應的程序做近似計算。

MATLAB的主要功能具體包括:一般數值分析、矩陣運算、數字信號處理、建模和系統控制和優化等應用程序,並集應用程序和圖形於一便於使用的集成環境中。在此環境下所解問題的Matlab語言表述形式和其數學表達形式相同,不需要按傳統的方法編程。

MATLAB語言的這一特點大大降低瞭對使用者的數學基礎和計算機語言知識的要求,而且使編程效率和計算效率極高,還可在計算機上直接輸出結果和精美的圖形拷貝。

2、MATLAB語言特點

(1)編程語言接近人的思維方式,編程效率高,易學易懂 它是一種面向科學與工程計算的高級語言,允許用數學形式的語言編寫程序,且比其他計算機語言更加接近我們書寫計算公式的思維方式,用Matlab編寫程序猶如在演算紙上排列出公式與求解問題。因此,Matlab語言也可通俗地稱為演算紙式科學算法語言由於它編寫簡單,所以編程效率高,易學易懂。 (2)程序調試方便靈活 Matlab語言是一種解釋執行的語言,它靈活、方便,其調試程序手段豐富,調試速度快,需要學習時間少。Matlab語言與其它語言相比,省去瞭編輯、編譯、連接以及執行和調試四個步驟。它把編輯、編譯、連接和執行融為一體。它能在同一畫面上進行靈活操作快速排除輸入程序中的書寫錯誤、語法錯誤以至語意錯誤,從而加快瞭用戶編寫、修改和調試程序的速度。 Mat1ab語言不僅是一種語言,廣義上講是一種該語言開發系統,即語言調試系統。 (3)源程序開放,庫函數豐富,擴展能力強 高版本的Matlab語言有豐富的庫函數,在進行復雜的數學運算時可以直接調用,而且Matlab的庫函數同用戶文件在形成上一樣,所以用戶文件也可作為Matlab的庫函數來調用。因而,用戶可以根據自己的需要方便地建立和擴充新的庫函數,以便提高Matlab使用效率和擴充它的功能。(4)程序語言簡潔,準確,涵義豐富 Mat1ab語言中最基本最重要的成分是函數,其一般形式為:一個函數由函數名,輸入變量和輸出變量組成,同一函數名F,不同數目的輸入變量(包括無輸入變量)及不同數目的輸出變量,代表著不同的含義。這不僅使Matlab的庫函數功能更豐富,使得Matlab編寫的M文件簡單、短小而高效。 (5)矩陣和數組運算高效方便 Matlab語言中規定瞭矩陣的算術運算符、關系運算符、邏輯運算符、條件運算符及賦值運算符,而且這些運算符大部分可以毫無改變地照搬到數組間的運算,這使得程序設計的自由度大。另外,它不需定義數組的維數,並給出矩陣函數、特殊矩陣專門的庫函數,使之在求解諸如信號處理、建模、系統識別、控制、優化等領域的問題時,顯得大為簡捷、高效、方便,這是其它高級語言所不能比擬的。在此基礎上,高版本的Matlab已逐步擴展到科學及工程計算的其它領域。(6)方便的而強大的繪圖功能 Matlab的繪圖是十分方便的,它有一系列繪圖函數(命令),例如線性坐標、對數坐標,半對數坐標及極坐標,均隻需調用不同的繪圖函數(命令),在圖上標出圖題、XY軸標註,格(柵)繪制也隻需調用相應的命令,簡單易行。另外,在調用繪圖函數時調整自變量可繪出不變顏色的點、線、復線或多重線。這種為科學研究著想的設計是通用的編程語言所不及的。 總之,Matlab語言的設計思想可以說代表瞭當前計算機高級語言的發展方向。

二、MATLAB函常用數匯總

1、函數介紹

addpath 增加一條搜索路徑

rmpath 刪除一條搜索路徑

demo 運行Matlab演示程序

type 列出.M文件

doc 裝入超文本文檔

version 顯示Matlab的版本號

help 啟動聯機幫助

what 列出當前目錄下的有關文件

lasterr 顯示最後一條信息

whatsnew 顯示Matlab的新特性

lookfor 搜索關鍵詞的幫助

which 造出函數與文件所在的目錄

path 設置或查詢Matlab路徑

管理變量與工作空間用命令

clear 刪除內存中的變量與函數

pack 整理工作空間內存

disp 顯示矩陣與文本

save 將工作空間中的變量存盤

length 查詢向量的維數

size 查詢矩陣的維數

load 從文件中裝入數據

who,whos 列出工作空間中的變量名

文件與操作系統處理命令

cd 改變當前工作目錄

edit 編輯.M文件

delete 刪除文件

matlabroot 獲得Matlab的安裝根目錄

diary 將Matlab運行命令存盤

tempdir 獲得系統的緩存目錄

dir 列出當前目錄的內容

tempname 獲得一個緩存(temp)文件

! 執行操作系統命令

窗口控制命令

echo 顯示文件中的Matl中的命令

more 控制命令窗口的輸出頁面

format 設置輸出格式

啟動與退出命令

matlabrc 啟動主程序

quit 退出Matlab環境

startup Matlab自啟動程序

運算符號與特殊字符

+ 加

… 續行標志

– 減

, 分行符(該行結果不顯示)

* 矩陣乘

; 分行符

.^ 向量乘方 矩陣轉置

kron 矩陣kron積

. 向量轉置

矩陣左除

= 賦值運算

/ 矩陣右除

== 關系運算之相等

. 向量左除

~= 關系運算之不等

./ 向量右除

< 關系運算之小於

: 向量生成或子陣提取

<= 關系運算之小於等於

() 下標運算或參數定義

> 關系運算之大於

[] 矩陣生成

>= 關系運算之大於等於

{} & 邏輯運算之與

xor 邏輯運算之異成

邏輯函數

all 測試向量中所用元素是否為真

is*(一類函數) 檢測向量狀態.其中*表示一個確定的函數(isinf)

any 測試向量中是否有真元素

exist 檢驗變量或文件是否定義

logical 將數字量轉化為邏輯量

find 查找非零元素的下標

語言結構與調試

編程語言

builtin 執行Matlab內建的函數

global 定義全局變量

eval 執Matlab語句構成的字符串

nargchk 函數輸入輸出參數個數檢驗

feval 執行字符串指定的文件

script Matlab語句及文件信息

function Matlab函數定義關鍵詞

控制流程

break 中斷循環執行的語句

if 條件轉移語句

case 與switch結合實現多路轉移

otherwise 多路轉移中的缺省執行部分

else 與if一起使用的轉移語句

return 返回調用函數

elseif 與if一起使用的轉移語句

switch 與case結合實現多路轉移

end 結束控制語句塊

warning 顯示警告信息

error 顯示錯誤信息

while 循環語句for 循環語句

交互輸入

input 請求輸入

menu 菜單生成

keyboard 啟動鍵盤管理

pause 暫停執行

面向對象編程

class 生成對象

isa 判斷對象是否屬於某一類

double 轉換成雙精度型

superiorto 建立類的層次關系

inferiorto 建立類的層次關系

unit8 轉換成8字節的無符號整數

inline 建立一個內嵌對象

調試函數

dbclear 清除調試斷點

dbstatus 列出所有斷點情況

dbcont 調試繼續執行

sbtype 列出帶命令行標號的.M文件

dbquit 退出調試模式

dbup 改變局部工作空間內容

dbstack 列出函數調用關系

基本矩陣

eye 產生單位陣

rand 產生隨機分佈矩陣

linspace 構造線性分佈的向量

randn 產生正態分佈矩陣

zeros 產生零矩陣

ones 產生元素全部為1的矩陣 : 產生向量

特殊向量與常量

ans 缺省的計算結果變量

non 非數值常量常由0/0或Inf/Inf獲得

computer 運行Matlab的機器類型

nargin 函數中參數輸入個數

eps 精度容許誤差(無窮小)

nargout 函數中輸出變量個數

flops 浮點運算計數

realmax 最大浮點數值

inf 無窮大

realmin 最小浮點數值

inputname 輸入參數名

varargin 函數中輸入的可選參數

cat 向量連接

reshape 改變矩陣行列個數

diag 建立對角矩陣或獲取對角向量

rot90 將矩陣旋轉90度

fliplr 按左右方向翻轉矩陣元素

tril 取矩陣的下三角部分

triu 取矩陣的上三角部分

repmat 復制並排列矩陣函數

復數函數

abs 絕對值函數

imag 求虛部函數

angle 角相位函數

real 求實部函數

conj 共軛復數函數

數值處理

fix 沿零方向取整

round 舍入取整

floor 沿-∞方向取整

rem 求除法的餘數

ceil 沿+∞方向取整

sign 符號函數

其他特殊數學函數

airy airy函數

erfinv 逆誤差函數

expint 指數積分函數

gammainc 非完全gamma函數

gammaln gamma對數函數

beta beta函數

gcd 最大公約數

lcm 最小公倍數

betaln beta對數函數

ellipke 完全橢圓積分

pow2 基2標量浮點數

erf 誤差函數

rat 有理逼近

rats 有理輸出

坐標轉換

cart2pol 笛卡兒坐標到極坐標轉換

pol2cart 極坐標到笛卡兒坐標轉換

cart2sph 笛卡兒坐標到球面坐標換

sph2cart 球面坐標到笛卡兒坐標轉換

矩陣函數

cond 求矩陣的條件數

rcond LINPACK倒數條件估計

det 求矩陣的行列式

rref 矩陣的行階梯型實現

norm 求矩陣的范數

rrefmovie 消元法解方程演示

null 右零空間

subspace 子空間

orth 正交空間

trace 矩陣的跡

rank 求矩陣的秩

線性方程

chol Cholesky分解

pinv 求偽逆矩陣

inv 矩陣求逆

qr 矩陣的QR分解

lscov 最小二乘方差

lu 矩陣的LU三角分解

qrinsert QR分解中插入一行

特征值與奇異值

banlance 改進特征值精度的均衡換

qz QZ算法求矩陣特征值

cdf2rdf 復塊對角陣到實塊對角換

rdf2cdf 實塊對角陣到復塊對角陣換

eig 求矩陣的特征值和特征向量

schur Schur分解

poly 求矩陣的特征多項式

矩陣函數

expm 矩陣指數函數

sqrtm 矩陣平方根

數據分析與Fourier變換函數

cumprod 向量累積

prod 對向量中各元素求積

cumsum 向量累加

max 求向量中最大元素

min 求向量中最小元素

std 求向量中各元素標準差

mean 求向量中各元素均值

sum 對向量中各元素求和

median 求向量中中間元素

trapz 梯形法求數值積分

微分計算

del2 離散

Laplace變換

gradient 梯度計算

diff 差分於近視微分

濾波與卷積

Conv 卷給與多項式乘法

filter 一維數字濾波

conv2 二維卷積

filter2 二維數字濾波

Deconv 因式分解與多項式乘法

方差處理

corrcoef 相關系數計算

Fourier變換

abs 絕對值函數

angle 相角函數

ifft 離散Fourier逆變換

cplxpair 依共軛復數對重新排序

ifft2 二維離散Fourier逆變換

fft 離散Fourier變換

unwrap 相角矯正

fft2 二維離散Fourier變換

三、 MATLAB繪圖命令

plot是繪制一維曲線的基本函數,在使用此函數之前,需先定義曲線上每一點的x 及y座標。

下例可畫出一條正弦曲線如下圖所示。

close all;

x=linspace(0, 2*pi, 100); % 100個點的x座標

y=sin(x); % 對應的y座標

plot(x,y);

若要畫出多條曲線,隻需將座標對依次放入plot函數即可: plot(x, sin(x), x, cos(x)); 如下圖所示。

若要改變顏色,在座標對後面加上相關字串即可:plot(x, sin(x), 'c', x, cos(x), 'g'); 如下圖所示。

若要同時改變顏色及圖線型態(Line style),也是在座標對後面加上相關字即可: plot(x, sin(x), 'co', x, cos(x), 'g*'); 如圖所示。

小整理:plot繪圖函數的叁數 字元 顏色字元 圖線型態y 黃色. 點k 黑色o 圓w 白色x xb 藍色+ +g 綠色* *r 紅色- 實線c 亮青色: 點線m 錳紫色-. 點虛線– 虛線。

圖形完成後,可用axis([xmin,xmax,ymin,ymax])函數來調整圖軸的范圍:axis([0, 6, -1.2, 1.2]); 如圖所示。

此外,MATLAB也可對圖形加上各種註解與處理:如下圖所示。

xlabel('Input Value'); % x軸註解

ylabel('Function Value'); % y軸註解

title('Two Trigonometric Functions'); % 圖形標題

legend('y = sin(x)','y = cos(x)'); % 圖形註解

grid on; % 顯示格線

可用subplot來同時畫出數個小圖形於同一個視窗之中:如下圖。

subplot(2,2,1); plot(x, sin(x));

subplot(2,2,2); plot(x, cos(x));

subplot(2,2,3); plot(x, sinh(x));

subplot(2,2,4); plot(x, cosh(x));

MATLAB還有其他各種二維繪圖函數,以適配不同的應用,詳見下表。

其他各種二維繪圖函數:

bar 長條圖; errorbar 圖形加上誤差范圍; fplot 較精確的函數圖形

polar 極座標圖; hist 累計圖; rose 極座標累計圖

stairs 階梯圖; stem 針狀圖; fill 實心圖

feather 羽毛圖; compass 羅盤圖; quiver 向量場圖

四、 RC串聯電路正弦穩態特性的理論分析

1、 電路中各電流、電壓的約束關系遵循基爾霍夫定律

基爾霍夫定律闡明瞭電路中各電流、電壓的約束關系,對任何電路都適用。因而。基爾霍夫節點電流定律(KCL)和基爾霍夫回路電壓定律(KVL)在正弦交流電路中均成立。其相量形式分別為 :

KCL相量形式 :

=0 表示流出任意節點的各支路電流相量的代數和恒等於零。

KVL相量形式:

=0表示沿任意閉合回路繞行一周,各支路電壓相量的代數和恒等與零。

2、 一階RC串聯電路的理論分析

動態電路中無外施激勵電源,僅由動態元件初始儲能所產生的響應,成為動態電路的零輸入響應。

RC串聯電路如圖所示: S=(t=0)

在如圖所示的電路中,開關S閉合前,電容C已充電,電壓

開關閉合後,電容存儲的能量將通過電阻以熱能的形式釋放出來。現把開關動作時刻取為計時起點(t=0)。

開關閉合後,由KVL得:

代入方程,有

上式為一階齊次微分方程,初始條件uC (0-) = uC(0+) =

,令此方程的通解為uC=Aept ,代入上式後有

相應的特征方程為: RCp+1=0,特征根為:

根據初始條件,以此代入

,則可求得積分常數

這樣求得滿足初始值的微分方程的解為

由歐姆定律,易得電路中的電流、電壓分別為

所以

代入初始數據

計算得:

由計算結果可以看出,

都是關於t的指數函數。它們按照指數規律衰減。其衰減的快慢取決於指數中1/RC的大小。

3 、程序設計

(1)程序設計框圖

(2) 程序代碼

function RC() %定義函數 RC

Uo=2;R=2;C=0.5; %設定元件參數

t=0:0.001:4; %設置時間步進長度為0.001s,仿真時間為4s

w=1/(R*C); %設置w參數

Uc=Uo*exp(-w*t);

i=(Uo/R)*exp(-w*t);

Pc=-(Uo*Uo/R)*exp(-2*w*t);%分別定義Uc,i,Pc

subplot (1,3,1),plot(t,Uc);%畫出Figurel二維圖形窗,1行3列的第1個子圖的波形

subplot (1,3,2),plot(t,i); %畫出Figurel二維圖形窗,1行3列的第 2個子圖的波形

subplot (1,3,3),plot(t,Pc); %畫出Figurel二維圖形窗,1行3列的第3個子圖的波形

4、程序運行結果及圖表分析

由圖所示,

都是關於t的指數函數。它們均隨著t單調遞減,而且要經過無限長的時間才能衰減為零。

(1)

都是關於t的指數函數。

(2)

按照指數規律衰減。其衰減的快慢程度取決於指數中1/RC的大小。

(3)RC的大小反映瞭一階電路過度過程的進展速度,它是反映過渡過程特性的一個重要的量。

五、MATLAB繪圖經典實例

1、三維曲線

>> t=0:pi/50:10*pi;

>> plot3(sin(2*t),cos(2*t),t)

>> axis square

>> grid on

2、一窗口多圖形

>> t=-2*pi:0.01:2*pi;

>> subplot(3,2,1)

>> plot(t,sin(t))

>> subplot(3,2,2)

>> plot(t,cos(t))

>> subplot(3,2,3)

>> plot(t,tan(t))

>> axis([-pi pi -100 100])

>> subplot(3,2,4)

>> plot(t,cot(t))

>> axis([-pi pi -100 100])

>> subplot(3,2,5)

>> plot(t,atan(t))

>> subplot(3,2,6)

>> plot(t,acot(t))

3、 圖形樣式、標註、題字(也可以利用菜單直接Insert)

>> x=0:pi/20:2*pi;

>> plot(x,sin(x),'b-.')

>> hold on

>> plot(x,cos(x),'r–')

>> hold on

>> plot(x,sin(x)-1,'g:')

>> hold on

>> plot(x,cos(x)-1)

>> xlabel('x');

>> xlabel('x軸');

>> ylabel('y軸');

>> title('圖形樣式、標註等');

>> text(pi,sin(pi),'x=pi');

>> legend('sin(x)','cos(x)','sin(x)-1','cos(x)-1');

>> [x1,y1]=ginput(1) %利用鼠標定位查找線上某點的值

x1 =

2.0893

y1 =

-0.5000

>> gtext('x=2.5') %鼠標定位放置所需的值在線上

4、繪制心形圖r=2(1-cosθ)的極坐標圖形

>> theta=[0:0.01:2*pi];

>> polar(theta,2*(1-cos(theta)),'-k')

>> polar(theta,2*(1-cos(theta)),'-or')

5、繪制矩陣的條形圖,並求出句柄屬性值向量

>> A=[1 2 3;4 5 6;7 8 9];

>> h=bar(A)

h =171.0031 174.0026 176.0026

6、繪制矩陣的面積圖

>> y=[3 2 -2 2 1;-1 3 3 7 2;-7 5 5 9 3];

>> area(y)

7、繪制矩陣的二維餅圖

>> x=[1 2 3;4 5 6;7 8 9];

>> explode=[0 1 0 1 0 1 0 1 0];

>> pie(x,explode)

8、自行確定數據,繪制其柱形圖

>> x=[-2:0.01:4];

>>y=randn(1131,1);

>>hist(y,x)

9、繪制火柴桿圖

>> x=[1 1.5 2;3 3.5 4;5 5.5 6];

>> y=[4 3 2;4 8 9;2 7 3];

>> stem(x,y,'fill')

%fill意思是“實心點”

10、繪制玫瑰花圖

>> theta=rand(1,200)*2*pi;

>> rose(theta,25)

11、在-4<=x<=4,-4<=y<=4區域上繪制z=x^2+y^2的三維網格圖

>> [x,y]=meshgrid(-4:0.125:4);

>> z=x.^2+y.^2;

>> meshc(x,y,z)

12、繪制高斯分佈函數的網格圖

>> [x,y]=meshgrid(-3:0.125:3);

>> z=peaks(x,y);

>> meshz(x,y,z)

13、用surf繪制高斯分佈函數的曲面圖

>> [x,y]=meshgrid(-3:0.125:3);

>>z=peaks(x,y);

>>surf(x,y,z)

14、繪制螺旋曲線圖

>> t=[0:pi/200:10*pi];

>> x=2*cos(t);

>> y=3*sin(t);

>> z=t.^2;

>> plot3(x,y,z)

15、繪制三維餅圖

>> A=[1 2 3;4 5 6;7 8 9];

>> ex=[1 0 0;4 0 0;0 8 0];

>> pie3(A,ex)

16、在各種style參數的條件下繪制矩陣的三維條形圖

>> z=[1 2 3;4 5 6;7 8 9];

>>bar3(z,'detached')

>>title('bar3函數以detached參數繪制A=[1 2 3;4 5 6;7 8 9]的條形圖')

>> bar3(z,'grouped')

>> title('bar3函數以grouped參數繪制A=[1 2 3;4 5 6;7 8 9]的條形圖')

>> bar3(z,'stacked')

>> title('bar3函數以stacked參數繪制A=[1 2 3;4 5 6;7 8 9]的條形圖')

17、繪制柱形圖

>> t=[0:pi/50:2*pi];

>> [x,y,z]=cylinder(t.*sin(t));

>> surf(x,y,z)

>> cylinder(t.^2)

>> title('cylinder(t^2)繪制的柱形圖')

18、繪制三維散點圖

>> x=rand(500,1);

>> y=randn(500,1);

>> z=randn(500,1);

>> scatter3(x,y,z,'p','r')

19、繪制三維火柴桿圖

>> x=[1:0.5:20];

>> y=sqrt(x);

>> z=sqrt(x.^2+y.^2);

>> stem3(x,y,z,'filled')

20、繪制等值線圖

>> [x,y]=meshgrid(-3:0.1:3);

>> z=2-x.^2-y.^2;

>> contour3(z,20)

21、繪制一個球面

>> [x,y,z]=sphere(40);

>> surf(x,y,z)

22、繪制一個三維彗星圖

>> t=[-3*pi:pi/100:3*pi];

>> x=3.*cos(t);

>> y=2.*sin(t);

>> z=t.^2;

>> comet3(x,y,z)

23、在【-pi,pi】上制作一個不斷繪制正弦曲線的動畫

>> x=[-pi:0.02:pi];

>> y=sin(x);

>> h=plot(x,y,'r-')

h =

171.0011

>> axis([-4 4 -1 1])

>> axis square

>> grid off

>> set(h,'erasemode','xor','markersize',10)

>> while 1

drawnow

x=x+0.01;

y=sin(x)-0.01;

set(h,'xdata',x,'ydata',y)

if(x>pi)|(y<-1)

x=[-pi:0.02:pi];

y=sin(x);

end

end

24、創建一個三維曲面z=x^2+y^2的動畫

>> x=[-2:0.2:2];

>> [x1,y1]=meshgrid(x);

>> z=x1.^2+y1.^2+eps;

>> surf(z);

>> ta=axis;

>> ft=moviein(40);

>> for i=1:40

surf(sin(2*pi*i/20)*z,z)

axis(ta)

ft(:,i)=getframe;

end

>> movie(ft,20)

六、MATLAB其他應用舉例

1、利用公式直接進行賦值計算

本金P以每年n次,每次i%的增值率(n與i的乘積為每年增值額的百分比)增加,當增加到r×P時所花費的時間T為:(利用復利計息公式可得到下式)

MATLAB 的表達形式及結果如下:

>> r=2;i=0.5;n=12; %變量賦值

>> T=log(r)/(n*log(1+0.01*i))

計算結果顯示為:

T = 11.5813

即所花費的時間為T=11.5813 年。

分析:上面的問題是一個利用公式直接進行賦值計算問題,實際中若變量在某個范圍變化取很多值時,使用MATLAB,將倍感方便,輕松得到結果,其繪圖功能還能將結果輕松的顯示出來,變量之間的變化規律將一目瞭然。

若r在[1,9]變化,i在[0.5,3.5]變化;我們將MATLAB的表達式作如下改動,結果如圖所示。

r=1:0.5:9;

i=0.5:0.5:3.5;

n=12;

p=1./(n*log(1+0.01*i));

T=log(r')*p;

plot(r,T)

xlabel('r') %給x軸加標題

ylabel('T') %給y軸加標題

q=ones(1,length(i));

text(7*q-0.2,[T(14,1:5)+0.5,T(14,6)-0.1,T(14,7)-0.9],num2str(i'))

從圖中既可以看到T隨r的變化規律,而且還能看到i的不同取值對T—r曲線的影響(圖中的六條曲線分別代表i的不同取值)。

2、方程組的求解

求解下面的方程組:

分析:對於線性方程組求解,常用線性代數的方法,把方程組轉化為矩陣進行計算。

MATLAB 的表達形式及結果如下:

>> a=[8 1 6;3 5 7;4 9 2]; %建立系數矩陣

>> b=[7.5;4;12]; %建立常數項矩陣

>> x=ab %求方程組的解

計算結果顯示為:

x =

1.2931

0.8972

-0.6236

3、數據擬合與二維繪圖

在數學建模競賽中,我們常會遇到這種數據表格問題,如果我們僅憑眼睛觀察,很難看到其中的規律,也就更難寫出有效的數學表達式從而建立數學模型。因此可以利用MATLAB的擬合函數, 即polyfit() 函數,並結合MATLAB的繪圖功能(利用plot()函數),得到直觀的表示。

例:在化學反應中,為研究某化合物的濃度隨時間的變化規律,測得一組數據如下表:

分析:

MATLAB 的表達形式如下:

t=[1:16]; %數據輸入

y=[4 6.4 8 8.4 9.28 9.5 9.7 9.86 10 10.2 10.32 10.42 10.5 10.55 10.58 10.6];

plot(t,y,'o') %畫散點圖

p=polyfit(t,y,2) %二次多項式擬合

hold on

xi=linspace(0,16,160); %在[0,16]等間距取160 個點

yi=polyval(p,xi); %由擬合得到的多項式及xi,確定yi

plot(xi,yi) %畫擬合曲線圖

執行程序得到下圖;

顯示的結果為

p=-0.0445 1.0711 4.3252

p的值表示二階擬合得到的多項式為:y= -0.0445t2+1.0711t+ 4.3252

下面是用lsqcurvefit()函數,即最小二乘擬合方法的Matlab表達:

t=[1:16];

y=[4 6.4 8 8.4 9.28 9.5 9.7 9.86 10 10.2 10.32 10.42 10.5 10.55 10.58 10.6];

x0=[0.1,0.1,0.1];

zuixiao=inline('x(1)*t.^2+x(2)*t+x(3)','x','t');

x=lsqcurvefit(zuixiao,x0,t,y) %利用最小二乘擬合

其顯示的結果為:

x = -0.0445 1.0711 4.3252

可以看出其得到的結果與polyfit函數的擬合結果是相同的。這說明在多項式擬合問題上這兩個函數的效果是相同的。

4、lsqcurvefit()函數的應用

在物理學中,為研究某種材料應力與應變的關系,測得一組數據如下表:

如果假定應力與應變有如下關系(σ為應力值,ε為應變值):ε=a+blnσ

試計算a b 的值。

MATLAB 的表達形式如下:

x=[925,1125,1625,2125,2625,3125,3625];

y=[0.11,0.16,0.35,0.48,0.61,0.71,0.85];

plot(x,y,'o')

[p,resid1]=polyfit(x,y,2)

hold on

xi=linspace(700,3700,3000);

yi=polyval(p,xi);

plot(xi,yi)

x0=[0.1,0.1];

fff=inline('a(1)+a(2)*log(x)','a','x');

[a,resid2]=lsqcurvefit(fff,x0,x,y)

plot(xi,fff(a,xi),'r')

執行程序得到下圖,圖中藍色曲線為利用polyfit()函數得到的曲線,紅色曲線為利用lsqcurvefit()函數得到的曲線;

其顯示的結果為:

p =-0.0000 0.0004 -0.2266

resid1 =

R: [3×3 double]

df: 4

normr: 0.0331

a =-3.5810 0.5344

resid2 =0.0064

其中a的值代表利用lsqcurvefit()函數得到的關系為:ε=-3.5810+0.5344+σ

resid1、resid2 分別代表運用polyfit()函數、lsqcurvefit()函數得到的殘差。可以看出利用lsqcurvefit()函數殘差更小,即得到瞭更好的擬合效果。

在數學建模的實際問題中,如果問題的機理不明,我們隻能采用polyfit()函數,即多項式擬合的方法,以獲得近似的數據描述函數;但如果通過分析,可以得到一些機理,那麼采用最小二乘的方法將得到更好的效果,而且得到的擬合函數也更有意義。

5、隱函數的圖形繪制

plot()隻能繪制顯函數圖形,對於形如

的復雜隱函數,很難轉化為顯函數並利用plot()函數繪制圖形,這時就可以用ezplot()函數直接繪制其曲線。

MATLAB的表達形式如下:

>> ezplot('1/y-log(y)+log(-1+y)+x-sin(x)')

執行程序得到下圖:

如果是形如下面的參數方程

,同樣可以利用ezplot()函數繪制其曲線。MATLAB的表達形式如下:

>> ezplot('sin(3*t)*cos(t)','sin(3*t)*sin(t)',[0,pi])

執行程序得到另外圖形如下:

七、小結

當今世界三大數學軟件分別是MATLAB和Mathematica、Maple。

1、MATLAB

MATLAB的基本數據單位是矩陣,它的指令表達式與數學、工程中常用的形式十分相似,故用MATLAB來解算問題要比用C、FORTRAN等語言完成相同的事情簡捷得多,並且MATLAB也吸收瞭像Maple等軟件的優點,使MATLAB成為一個強大的數學軟件。

2、Mathematica

Mathematica是一款科學計算軟件,很好地結合瞭數值和符號計算引擎、圖形系統、編程語言、文本系統、和與其他應用程序的高級連接。很多功能在相應領域內處於世界領先地位,它也是使用最廣泛的數學軟件之一。

3、Maple

Maple系統內置高級技術解決建模和仿真中的數學問題,包括世界上最強大的符號計算、無限精度數值計算、創新的互聯網連接、強大的4GL語言等,內置超過5000個計算命令,數學和分析功能覆蓋幾乎所有的數學分支,如微積分、微分方程、特殊函數、線性代數、圖像聲音處理、統計、動力系統等。

4、MATLAB真強大

MATLAB是美國MathWorks公司出品的商業數學軟件,用於數據分析、無線通信、深度學習、圖像處理與計算機視覺、信號處理、量化金融與風險管理、機器人,控制系統等領域

它有著強大的數字分析,數值和符號計算功能,在數學類科技應用軟件中首屈一指。

MATLAB將數值分析、矩陣計算、科學數據可視化以及非線性動態系統的建模和仿真等諸多強大功能集成在一個易於使用的視窗環境中,為科學研究、工程設計以及必須進行有效數值計算的眾多科學領域提供瞭一種全面的解決方案,並在很大程度上擺脫瞭傳統非交互式程序設計語言的編輯模式,代表瞭當今國際科學計算軟件的先進水平。

綜上,MATLAB軟件是一款強大的數學運算及數學建模軟件,工欲善其事必先利其器,其強大的運算功能已在全球各個行業應用中占有一席之地,其經典應用實例數不勝數,在此不一一枚舉瞭

隻需要平時認真上課,學好高數、線代、概率論,以及計算機專業的數據結構,學好以上四門課,你就能基本吃透數學建模,對MATLAB軟解的瞭解和掌握大有裨益

八、MATLAB入門

全世界數以百萬計的工程師和科學傢都在使用 MATLAB® 分析和設計改變著我們的世界的系統和產品。基於矩陣的 MATLAB 語言是世界上表示計算數學最自然的方式。可以使用內置圖形輕松可視化數據和深入瞭解數據。

MATLAB的基礎入門比較簡單,如果有編程語言基礎的話,學起來可能會更輕松

對於零基礎的小白,首先必須瞭解MATLAB的基本語法及基礎知識。

1.界面認識

2.學會變量命名

Matlab中的註釋

%% 獨占一行的註釋(有上下橫線分割)

% 普通註釋

1)清空環境變量及命令

clear all 清除Workspace中的所有變量(右側工作區)

clc 清除Command Window中的所有命令(命令行窗口)

2)變量命名規則

①變量名區分大小寫

②變量名長度不超過63位(hhh,不會有人把變量名弄這麼長吧~)

③變量名簡潔明瞭,盡量做到見名知意

3.數據類型

1)數字

2)字符與字符串

s = ‘a’ (單引號表示字符串)

==abs(s)==ASCII碼

char(97) 輸出 a (ASCII碼轉字符串)

num2str(65) 輸出數字65

str=‘I love MATLAB & Machine Learning’

length(str) 字符串長度

doc num2str

3)矩陣

4.元胞數組和結構體

元胞數組:是MATLAB中特有的一種數據類型,是數組的一種,其內部元素可以是屬於不同的佈局類型,概念理解上,可以認為它和C語言裡面的結構體、C++裡面的對象很類似。元胞數組是MATLAB中的特色數據類型,它不同於其它數據類型(如字符型,字符數組或者字符串,以及一般的算數數據和數組)。它特有的存取數據方法決定瞭它的特點,它有給人一種查詢信息的感覺,可以逐漸追蹤一直到所有的變量全部翻譯成基本數據信息。它的class函數輸出就是cell(細胞)

%元胞數組

A = cell(1,6)

A{2} = eye(3) %2021版本前的matlab下標從1開始

A{5} = magic(5)

B = A{5}

magic:字面意思是魔方,魔術的意思。在MATLAB中用來生成n階幻方。比如三階幻方就是1-9九個數字,組成一個3*3的矩陣,使得該矩陣無論橫、豎還是斜三個方向上的三個數的和總是相同的。

5.矩陣操作

1)矩陣的定義與構造

A = [1,2,3,4,5,6,5,4,6]

B = 1:2:9 %第二個參數為步長,不可缺省

B = 1:3:9

C = repmat(B,3,2) %重復執行3行2列

D = ones(2,4) %生成一個2行4列的全1矩陣

2)矩陣的四則運算

A = [1 2 3 4; 5 6 7 8]

B = [1 1 2 2; 2 2 1 1]

C = A + B

D = A – B

E = A * B'

F = A .* B % .*表示對應項相乘

G = A / B %相當於A*B的逆 G*B = A G*B*pinv(B) = A*pinv(B) G = A*pinv(B),相當於A乘B

H = A ./ B % ./表示對應項相除

3)矩陣的下標

A = magic(5)

B = A(2,3)

C = A(3,:) % :為取全部,那麼這條語句表示取第三行

D = A(:,4) %取第四列

[m,n] = find(A > 20) %找到大於20的序號值/矩陣

%取的是索引值

6.程序結構

可自補。。。

7.基本繪圖操作

1)二維平面繪圖

x = 0:0.01:20;

y1 = 200*exp(-0.05*x).*sin(x);

y2 = 0.8*exp(-0.5*x).*sin(10*x);

figure

[AX,H1,H2] = plotyy(x,y1,x,y2,'plot'); %共用一個x的坐標系,在y上有不同的取值

%設置相應的標簽

set(get(AX(1),'Ylabel'),'String','Slow Decay')

set(get(AX(2),'Ylabel'),'String','Fast Decay')

xlabel('Time(musec)')

title('Multiple Decay Rates')

set(H1,'LineStyle','–')

set(H2,'LineStyle',':')

2)三維立體繪圖

%2.三維立體繪圖

t = 0: pi/50: 10*pi;

plot3(sin(t),cos(t),t)

xlabel('sin(t)')

ylabel('cos(t)')

zlabel('t')

%hold on

%hold off %不保留當前操作

grid on %把圖片繪制出來,在圖片中加一些網格線

axis square %使整個圖(連同坐標系)呈方體

8.圖形的保存與導出

如果直接用截圖的方式截取matlab生成的圖像,會影響圖像的清晰度。可以用如下方法保存與導出圖形。

1)如圖

2)編輯→復制選項

可調節相應元素

3)編輯→圖窗屬性

4)文件→導出設置

通過調節寬度、高度等像素值屬性,可以讓圖片即使很小,文字依然清晰。

九、總結

MATLAB是用於數值計算和圖形處理的的科學計算系統環境。MATLAB是一個高級的矩陣/陣列語言,它包含控制語句,函數,數據結構,輸入和輸出,面向對象編程等特點。MATLABd 程序編寫時和C語言的程序編寫差不多,同樣需要先畫出流程圖,然後編程序源代碼,最後在MATLAB中運行,得到我們所需要的隨時間變化的關系圖像。MATLAB語言基於C++語言,因而可移植性好,可拓展性極強。

還是上面這句話,工欲善其事必先利其器,當今時代是一個效率時代,個人生產效率決定人的社會價值,隻有用上好的工具才能達到事半功倍的效果,在單位時間內讓自己的工作效率翻倍你或許可以試著使用MATLAB這款強大的軟件