第7章計算方法的MATLAB實現講稿

2021-09-01 15:44:41 字數 5161 閱讀 4025

計算方法主要研究數學問題的數值解,涉及的內容廣。利用matlab提供的部分函式解決,可以實現某些情況下的數值求解。本章作簡要介紹。

7.1 一元非線性方程求解

求解一元非線性方程的方法主要有二分法、割線法、牛頓法等。本節主要介紹兩個可以求解一元非線性方程的函式,即fzero函式和roots函式。

7.1.1 fzero函式

用fzero函式求一元非線性方程的零點。該函式的簡單呼叫格式為:

●x=fzero(fun,x0):如果x0為標量,則試圖尋找函式fun在x0附近的零點。fun引數是乙個m檔案函式或匿名函式的函式控制代碼。

函式fzero返回的值x靠近fun函式改變符號的位置。如果搜尋失敗,則返回nan。搜尋區間擴充套件到發現inf、nan或復數值時終止搜尋。

如果x0是乙個長度為2的向量,則fzero函式假設x0是乙個區間,其中fun(x0(1))與fun(x0(2))異號。如果符號相同,則會出錯。給出相應函式值異號的區間可以保證fzero函式返回乙個fun函式改變符號的位置附近的值。

●[x,fval]=fzero(…):返回解x和解x處目標函式fun的值。

●[x,fval,exitflag]=fzero(…):還返回乙個exitflag值,描述fzero函式的退出條件。返回值及其描述如下所示:

>0,表示函式找到了零值點x;

0,表示沒有發現零值點。

例7-1 求方程的解。

程式**:

clear;clc;

f=@(x)(x+20)*(x+1)*(x-5)*(x-30);%建立匿名函式

x1=fzero(f,-50)%解一元非線性方程

x2=fzero(f,1)

x3=fzero(f,6)

x4=fzero(f,50)

執行結果:

x1 =

-20x2 =

-1x3 =

5x4 =

307.1.2 roots函式

用roots函式計算多項式的根,該函式的呼叫格式為:

●r=roots(c):返回乙個列向量,其元素為多項式c的解。

例7-2 求多項式方程的解。

程式**:

clear;clc;

p=[1 -5 1 -5];%表示多項式

r=roots(p)%求多項式方程的解

p1=poly(r)%由多項式的根返回多項式的係數

執行結果:

r = 5.0000

-0.0000 + 1.0000i

-0.0000 - 1.0000i

p1 =

1.0000 -5.0000 1.0000 -5.0000

注:poly和roots互為逆函式,函式poly返回多項式的係數。

7.2 非線性方程組的數值解法

用matlab求解線性方程組的解,在6.3中已介紹了基於矩陣變換的直接解法,除此方法之外,還有很多方法,比如,jocabi迭代法、gauss-seidel迭代法和sor(超鬆馳)迭代法等,這裡不作詳細介紹。可參閱有關文獻。

實際工程中得到的數學模型往往具有非線性的特點,得到其解析解比較困難。一般採用迭代法求解非線性方程組。比較常見的迭代方法有不動點迭代法、newton迭代法和擬newton迭代法等幾種。

本節僅介紹不動點迭代法。

設含有個未知數和個方程的非線性方程組記為:

其中,為由個未知數構成的向量,為由個函式構成的向量。

將方程組改寫為便於迭代的等價形式:,由此得出不動點迭代法的迭代公式:。

如果得到的序列滿足,則就是的不動點。這樣就可以求出線性方程組的解(近似解)。

據此,編寫不動點迭代法的m檔案(檔名為example7_2):

function s=example7_2(x,eps)

%用不動點迭代法求非線性方程組的解

%x為迭代初值,eps為允許誤差值。

if nargin==1

eps=1e-6;

elseif nargin<1

error

return

endx1=example7_2a(x);% example7_2a是函式的檔名。

while norm(x1-x)>=eps

x=x1;

x1=example7_2a(x);%迴圈迭代

ends=x1;

return

例7-3 用不動點迭代法求方程組的解。

解:變形為

首先建立函式**(檔名為example7_2a.m):

function y=example7_2a(x)

y(1)=(x(1)*x(1)+x(2)*x(2)+9)/(-11);

y(2)=(x(1)*x(2)*x(2)+x(1)+8)/6;

再作圖形,程式**:

clear;clc;

ezplot('x1^2+11*x1+x2^2+9',[-12,6]);

hold on

ezplot('x1*x2^2+x1-6*x2+8',[-12,6]);

hold off

title('x1^2+11*x1+x2^2+9和x1*x2^2+x1-6*x2+8的圖形')%修改標題

執行結果見圖7-1:

圖7-1

最後呼叫函式example7_2求方程組解:

x=example7_2 ([0,0])

執行結果:

x= -1.0000 1.0000

這樣就可以求得方程組的乙個解,從圖7-1可以看出,方程組還有乙個解,為了求得它,還需要對原方程組作另外變形,這裡不再作進一步的討論。

7.3 插值

插值計算在資料擬合和資料平滑等方面應用普遍。matlab提供了用最近鄰插值、線性插值、三次樣條插值、三次插值和fft插值法進行一維、二維、三維和高維插值的函式。

7.3.1 一維插值

matlab中有兩種一維插值,即多項式插值和基於fft的插值。

⒈ 多項式插值

函式interp1進行一維插值。一維插值是進行資料分析和曲線擬合的重要手段。interp1函式使用多項式技術,用多項式函式擬合所提供的資料,並計算目標插值點上的插值函式值,其最常用的語法形式是:

yi=interp1(x,y,xi,method)

x和y為給定資料的向量,長度相同。xi為包含要插值的點的構成的向量,method是乙個可選的字串,指定一種插值方法,包括:

●最近鄰插值(method='nearest'):該方法將插值點的值設定為已知資料點中距離最近的點的值;

●線性插值(method='linear'):該方法用線性函式擬合每對資料點,並返回xi處的相關函式值;

●三次樣條插值(method='spline'):該方法用三次樣條函式擬合每對資料點,用spline函式在插值處進行三次樣條插值;

●三次插值(method='pchip'或'cubic'):該方法用pchip函式對向量x和y進行分段三次hermite插值。

這幾種方法在速度、記憶體和平滑性等方面有所差別,使用時可以根據需要進行選擇,包括:

◣最近鄰插值是最快的方法,但是,利用它得到的結果平滑性最差;

◣線性插值比最近鄰插值要占用更多的記憶體,執行時間略長。與最近鄰法不同,它生成的結果是連續的,但是在頂點處有坡度變化;

◣三次樣條插值的執行時間相對來說最長,記憶體消耗比三次插值略少。它生成的結果平滑性最好。但是,如果輸入資料不很均勻,可能會得到意想不到結果;

◣三次插值需要更多記憶體,而且執行時間比最近鄰插值和線性插值的長。但是,使用此法時,插值資料及其導數都是連續的。

例7-4 程式**:

x=1:10;

y=[1800 778 518 5000 980 588 2799 528 6700 598];

x1=1:0.1:10;

y1=interp1(x,y,x1,'nearest');%一維最近鄰插值

plot(x1,y1)

y2=interp1(x,y,x1,'linear');%一維線性插值

hold on

plot(x1,y2,'color','r')

hold off

執行結果見圖7-2。

圖7-2 一維最近鄰插值和線性插值

例7-5 程式**:

x=1:10;

y=[1800 778 518 5000 980 588 2799 528 6700 598];

plot(x,y);

x1=1:0.1:10;

hold on

y1=interp1(x,y,x1,'spline');%三次樣條插值

plot(x1,y1,'color','r')

hold off

執行結果見圖7-3。

圖7-3 三次樣條插值

⒉ 基於fft的插值

函式interpft用基於fft的方法進行一維插值。本方法計算包含週期函式值的向量的傅利葉變換。然後,它用更多的點計算逆傅利葉變換。該函式的呼叫形式為:

y=interpft(x,n)

其中,x是乙個包含週期函式值的向量,這些值在等間隔的點上採集。n是樣本大小。

7.3.2 二維插值

二維插值在影象處理和視覺化方面有著很重要的應用。matlab用函式interp2進行二維插值。該函式的一般形式為:

zi=interp2(x,y,z,xi,yi,method)

其中,z是乙個矩陣陣列,包含二維函式的值,x和y為大小相同的陣列,包含相對於z的給定值。xi和yi為包含插值點資料的矩陣,method表示插值方法,為可選引數。

matlab提供了三種不同的插值方法進行二維插值:

●最近鄰插值(method='nearest'):該方法用分區域常數曲面擬合資料,插值點的值是最近點的值;

●雙線性插值(method='linear'):該方法用雙線性曲面擬合資料點,插值點的值是四個最近的值的組合。本方法是分區域雙線性的,比雙三次插值法快,並且記憶體消耗更少;

●雙三次插值(method='cubic'):該方法用雙三次曲面擬合資料點,插值點的值是16個最近點的值的組合。本方法是分區域三次的,結果的平滑性比前面兩種的都好。

注:所有這些方法都要求x和y資料是單調的,即從點到點,要麼總是遞增的,要麼總是遞減的。應該用meshgrid函式準備這些矩陣。

例7-6 程式**:

%低解析度的peaks函式圖形

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

z=peaks(x,y);

surf(x,y,z)

執行結果見圖7-4。

圖7-4 低解析度的peaks函式圖形

第7章MATLAB計算的視覺化和GUI設計

matlab具有非常強大的二維和三維繪圖功能,尤其擅長於各種科 算結果的視覺化。7.1二維曲線的繪製 7.1.1基本繪圖命令plot 1.plot x 繪製x向量曲線 plot命令是matlab中最簡單而且使用最廣泛的乙個繪圖命令,用來繪製二維曲線。語法 plot x繪製以x為縱座標的二維曲線 pl...

計算方法第5章數值積分

第五章數值積分 5.0 引言 5.1 機械求積公式 5.2 newton cotes公式 5.3 變步長求積公式及其加速收斂技巧 5.4 gauss公式 5.5 小結 5.0 引言 1.定積分的計算可用著名的牛頓 萊布尼茲公式來計算 其中f x 是f x 的原函式之一,可用不定積分求得。然而在實際問...

《應用計算方法教程》matlab作業二

作業六6 1 試驗目的計算特徵值,實現演算法 試驗內容 隨機產生乙個10階整數矩陣,各數均在 5和5之間。1 用matlab函式 eig 求矩陣全部特徵值。2 用冪法求a的主特徵值及對應的特徵向量。3 用基本qr演算法求全部特徵值 可用matlab函式 qr 實現矩陣的qr分解 原理冪法 設矩陣a的...