標籤:

MATLAB筆記(3.2)循環

MATLAB筆記(3.2)循環

來自專欄 MATLAB的學習筆記12 人贊了文章

本文為學習Mooc課程「科學計算與Matlab語言」專題三的筆記。

#留作自己復慣用,也方便其他同學查找相關的內容。

#另外,想學習的同學可以免費報名參加Mooc官網所提供的相關課程。


一、用for語句實現循環結構:

for 循環變數=初始值:步長:終值

循環體語句

end

舉例、求π的值:

(1)利用無窮級數:

arctanx=1-frac{x^3}{3}+frac{x^5}{5}-frac{x^7}{7}+......

frac{pi}{4}=frac{1}{1}-frac{1}{3}+frac{1}{5}-frac{1}{7}+......

運用一下腳本文件:

y=0;g=-1;n=input(n=?); for i=1:n g=-g; y=y+g/(2*i-1); endpai=4*y

note:

利用g=-g實現正負交替;起始值設為零,增量為 frac{g}{2*i-1}

下面,運行這個程序:

>> pi1n=?10pai = 3.0418>> pi1n=?100pai = 3.1316

(2)利用向量求和代替for循環:

n=input(n=?);x=1:2:(2*n-1);y=(-1).^(2:n+1)./x;pai=sum(y)*4

由於分母是1,3,5,7,9...所以,對於分母直接表示為1:2:(2*n-1);

對於每一項的正負交替,利用(-1).^(2:n+1);

用(-1).^(2:n+1)./1:2:(2*n-1)來表示每一項(這裡用"."運算);

再用向量求和的方式sum(v)來求解。

(3)利用定積分 frac{π}{4}=int_{0}^{1}sqrt{1-x^2}dx 來求解π的值:

核心思想:利用for循環,求解多個近似的小梯形面積,並且把小的梯形面積構成一個向量的分量,再利用sum函數對向量進行求和:

note:將小梯形的面積設為S1,關鍵就要看懂S=[S,S1],S初始位[],每循環一次,把S定義為[S,S1],代表著此時的S已經擁有了這一次循環所添加了的小梯形面積分量,循環結束後,S的每一個分量就是每一次計算的小梯形面積。

note:這裡的x是一個向量,同理f也是一個向量,要注意的是f(k)+f(k+1)不是數學中的兩個函數值相加,而是向量的第k個和第k+1個分量相加

a=0;b=1;n=input(n=?);h=(b-a)/n;x=a:h:b;f=sqrt(1-x.*x);s=[];for k=1:n s1=(f(k)+f(k+1))*h/2; s=[s,s1];endpai=4*sum(s)

(4)蒙特卡洛法求π的近似值:

取一個單位圓(面積為π),再用一個邊長為1的正方形把它框起來,用概率論的知識,幾何概型,隨機投點,投進圓內的概率應該為π/4。

s=0;n=input(n=?);for i=1:n x=rand(1); y=rand(1); if x*x+y*y<=1 s=s+1; endendpai=s/n*4

s為投進圓內的點數,n為總共的投擲數,(rand(1),rand(1))可代表隨機點的坐標,驗證坐標是否在圓內,可以用if語句(單分支)。

二、用while語句實現循環結構:

while即條件循環語句,不像for語句給出明確的取值,while只給出條件,滿足則通過循環,不滿足則繼續循環(針對循環次數不確定的情況)。

舉例、輸入到零截止:

msum=0;n=0;x=input(Enter a number (end in 0):);while x~=0 msum=msum+x; n=n+1; x=input(Enter a number (end in 0):);endif n>0 msum mean=msum/nend

msum初始值為零;

n的初始值為0;

輸入一個數字,終止於零;

當x不等於(~=)0時,執行循環;

給msum加上x這個數,給n賦值成n+1;

如果輸入到0,則跳過循環,在第一次不輸入零的情況下,輸出總數和平均數;

嘗試運行:

Enter a number (end in 0):1Enter a number (end in 0):2Enter a number (end in 0):3Enter a number (end in 0):4Enter a number (end in 0):5Enter a number (end in 0):0msum = 15mean = 3

三、break語句與continue語句:

舉例、找出100到200之間的第一個能被21整除的數:

for n=100:200 if rem(n,21)~=0 continue end n breakend

continue表示從此處終止,並且進行下一次循環(對n進行下一次賦值);

break表示跳出循環,不再執行剩餘的n的取值;

四、循環嵌套結構:

一個循環內部右包含著另一個循環的結構。

五、函數文件的定義與調用:

function 輸出形式參數(不佔用存儲空間)表=函數名(輸入形式參數表)

注釋說明部分

函數體語句

note:輸出形式參數為多個時,可以用[,,];

函數文件名一般為函數名.m,也可以不同,但是一般要求統一;

return表示結束函數的執行;

舉例、求圓的周長和半徑

function [s,p]=fcircle(r)s=pi*r*r;p=2*pi*r;

這裡可以在建立函數的命令窗口裡面編輯,也可以在新建腳本的窗口裡編輯,注意要以function開頭,在函數體語句的結章節附註意加「;」,這樣表示不輸出形式參數;

關於函數的調用,輸入的參數和輸出的參數為實際參數(與形參的順序一致);

>> [u,v]=fcircle(10)u = 314.1593v = 62.8319

匿名函數:

基本格式:

函數句柄變數=@(匿名函數輸入參數)匿名函數表達式;

也可以用:函數句柄變數=@函數名;

>> f=@(x,y)x^2+y^2f = @(x,y)x^2+y^2>> f(3,4)ans = 25>> k=@sink = @sin>> k(pi/2)ans = 1

六、函數的遞歸調用:

(1)直接遞歸f1(f1)

(2)間接遞歸f1(f2(f1))

舉例、求n!:

edit fact

然後生成函數窗口:

function f=fact (n)if n<=1 f=1;else f=fact (n-1)*n; %遞歸調用求(n-1)!end

在在腳本文件中建立:

n=input(Please input n=);s=fact (n);disp(s)

再打開腳本文件。

舉例、菲波那切數列:

f1=1;f2=1; fn=fn-1+fn-2 (n>2)

編寫遞歸調用函數求Fibonacci數列的第n項,然後調用該函數驗證Fibonacci數列的如下性質: f1^2+f2^2+f3^2+……+fn^2=fn×fn+1

函數文件:

function f=ffib(n)if n>2 f=ffib(n-1)+ffib(n-2);else f=1;end

腳本文件:

F=[];for k=1:20 F=[F,ffib(k)*ffib(k)];endsum(F)ffib(20)*ffib(21)

七、函數參數與變數的作用域:

略。

推薦閱讀:

如何用matlab編寫人拔禾苗,禾苗變高的這一系列動作?
關於在matlab層級編程中參數包的傳遞問題
[MATLAB R2017a 搶鮮報道] : 自動駕駛工具箱(2)
MATLAB 高級數據結構連載 2:金融時間序列Financial Time Series (Part B)
Python對比Matlab,有什麼決定性的優勢?

TAG:MATLAB |