200 likes | 366 Views
數學軟體簡介 PART II Matlab 介紹. 今天進度:. 多項式的處理與分析. 多項式的表示. 一個 n 次多項式可以表示成 p(x)= a n x n + a n-1 x n-1 +…+ a 1 x+ a 0 因此,在 Matlab 中可以用一個長度為 n+1 的向量來表示 p(x) 如下: p=[ a n ,a n-1 ,…,a 1 ,a 0 ] 舉例: p=[ 1,2,3,1 ] 是用來表示一個三次多項式 p(x)=x 3 + 2 x 2 + 3 x+ 1. 多項式的加減.
E N D
今天進度: • 多項式的處理與分析
多項式的表示 • 一個n次多項式可以表示成 p(x)=anxn+an-1xn-1+…+a1x+a0 • 因此,在Matlab中可以用一個長度為n+1的向量來表示p(x)如下: p=[an,an-1,…,a1,a0] • 舉例:p=[1,2,3,1] 是用來表示一個三次多項式 p(x)=x3+2x2+3x+1
多項式的加減 • 多項式的加減,可以直接由向量的加減而得出。若兩多項式分別是p1(x)=x3+x+1以及p2(x)=2x2-x+1,則其和與差可計算如下: >>p1=[1 0 1 1]; >>p2=[0 2 -1 1]; >>p1+p2 ans = 1 2 0 2 >>p1-p2 ans = 1 -2 2 0
多項式的乘除 • 注意: 上頁的矩陣相加減長度必須一致,否則會出現錯誤訊息。 • 多項式的乘除可以使用conv及deconv指令, 例如:欲求多項式p1(x)與p2(x)的乘積 >>p3=conv(p1, p2) p3 = 0 1 -1 3 0 1 2
多項式的乘除 • 若欲求多項式p1(x)除以p2(x)的商式與餘式 >>p1=[1 0 1 1]; >>p2=[1 -1 2] >>[q r] = conv(p1, p2) q = 1 1 r = 0 0 0 -1 代表p1(x)除以p2(x)後得到的商式為q(x)=x+1, 餘式為r(x) = -1
多項式的求值 • 要計算多項式的值,可以用polyval指令,例如: >> p=[1 2 1]; >>x=3; >>y=polyval(p,x) y = 16.0000 >>x=0:1:3; %x= 0 1 2 3 >>y=polyval(p,x) y = 1 4 9 16
多項式的求值 • 若要計算p(A),A為一方陣,可以用polyvalm指令如下例: >>p=[1 2 1]; >>A=[1 2; 3 4]; >>B=polyvalm(p, A) >>B = 10 14 21 31 • 此結果和B=A^2+2*A+1一樣
多項式的求值 注意: • 若將上式(polyvalm(p, A))改為 polyval(p, A)則結果會變為B=A .^2+2*A+1 • A^2 與A .^2完全不同 A^2 為矩陣 A*A A .^2為對矩陣A中每個元素平方
多項式的求根 • 多項式的根,可用Matlab的roots指令來求,例如:多項式p(x)=x4+2x3+x2+2x+1的根,可以計算如下: >>p = [1 2 1 2 1]; >>r = roots(p) r = -1.8832 0.2071 + 0.9783i 0.2071 - 0.9783i -0.5310
多項式的微分 • Matlab的polyder指令可用於多項式的微分,例如: >>p = [1 3 3 1]; >>q = polyder(p) q = 3 6 3 此即表示 p(x)=x3+3x2+3x+1 微分後的結果為q(x)=3x2+6x+3
矩陣的特徵多項式 • 給定一個方陣,其特徵多項式為det(A-xI),我們可以用Matlab指令poly來計算特徵多項式,例如: >>A = [1 3 4; 2 4 1; 1 6 2]; >>p = poly(A) P = 1.0000 -7.0000 -2.0000 -25.0000 所以 p(x) = x3-7x2-2x-25 為矩陣A的特徵多項式
矩陣的特徵多項式 • 特徵多項式的根即為矩陣A的特徵值,可以計算如下: >>roots(poly(A)) ans = 7.6837 -0.3419 + 1.7711i -0.3419 - 1.7711i • 也可以用上次教的[Q,d]=eig(A)來找到A的特徵值
非線性方程式的實根 • 如果求根的方程式不為多項式的形態 就不能用 roots 函數。 • 而這類的方程式多半是非線性方程式, 其函數形態變化很大。對於解這類方程式的根,可以用 fzero函數,它其實是用來找一函數 f(x) 的 x值代入時,會使該函數值為零 (f(x)=0);而這也就是根的特性,因此我們可以用 fzero求根。
非線性方程式的實根 要求任一方程式的根有三步驟: • 先定義方程式。要注意必須將方程式安排成 f(x)=0 的形態,例如一方程式為sin(x)=3, 則該方程式應表示為 f(x)=sin(x)-3。可以 M-file函式 定義方程式。 • 代入適當範圍的 x, y(x) 值,將該函數的分佈圖畫出,藉以了解該方程式的「長相」。 • 由圖中決定y(x)在何處附近(x0)與 x 軸相交,以fzero的語法 fzero('function', x0) 即可求出在 x0附近的根,其中 function 是先前已定義的函數名稱。如果從函數分佈圖看出根不只一個,則須再代入另一個在根附近的 x0,再求出下一個根。
非線性方程式的實根 • 以下分別介紹幾數個方程式,來說明如何求解它們的根。例一:方程式為 sin(x)=0 • 我們知道上式的根有π、2π、3π、4π…,求根方式如下: >> r=fzero('sin',3) r = 3.1416 >> r=fzero('sin',6) r = 6.2832
非線性方程式的實根 • 例二:方程式為先前提到的 Matlab 內建函數 humps,我們不須要知道這個方程式的形態為何,不過我們可以將它畫出來,再找出根的位置。求根方式如下: >> x=linspace(-2,3); >> y=humps(x); >> plot(x,y), grid >> r=fzero('humps',1.2) r = 1.2995
如何寫一個函數 M-file定義的函數有其語法的一些規定: • 第一行指令以function這個字做為起頭,接著是輸出的變數,等號,函數名稱,輸入的變數是接著函數名 稱放在括號之內。 • function out1=userfun(in1),這行的out1是輸出的變數,userfun是函數名稱,in1是輸入的 變數。 • function [out1, out2]= serfun(in1, in2) 如果輸出變數 [out1,out2] 和輸入變數 (in1, in2)不只一個時,則在 輸出變數部份須加上 [ ]。
如何寫一個函數 • 請先找到Matlab的目前的目錄所在(可能在\MatlabR14\work,要在同一個目錄下才可以呼叫函數),用Notepad或記事本開啟一個新增文件,在儲存時把它另存成”test.m”,此時,你的函數即名為test。 • 在test.m的檔案中,寫下自己所訂定的函數,例如: function c=test(r) c=pi*r.^2; % πr2
例三:方程式為 x2sin(x)+cos(x) =0 求根方式如下: function y=f_2(x) % 定義 f_2.m 函數 y=x.^2.*sin(x)+cos(x); >> x=linspace(-3,3); >> y=f_2(x); >> plot(x,y), grid >> r=fzero('f_2',-1); r = -0.8952 >> r=fzero('f_2',3); % 決定在3附近的根 r = 3.0333