MATLAB多项式应用

第八章 多項式之應用

對於多項式MATLAB也提供許多指令可供運算,相關的指令如下表:

函數名稱 說明
conv(p,q) 兩多項式相乘
[q,r]=deconv (num,den) 兩多項式相除,q為商,r為餘數,num分子,den為分母
roots 求多項式之根
poly(r) 將根轉為多項式.
polyval(p,x) 計算多項式之值,p為多項式之係數矩陣,x為變數值,可為矩陣型式
polyvalm(p,X) 計算多項式之值,p為多項式之係數矩陣,X為變數值,為方矩陣型式
residue 部份展開式之餘數.
polyfit(X,Y,n) 多項式資料回歸,(X,Y)為對應資料,n多項式最高次方
polyder (p) 多項式微分
polyint(p,K) 多項式之積分,K為常數


多項式中,主要以其係數組成一向量作為運算之基礎。多項式之通式可表示如下:


F(x)=a1xn+a2xn-1+...+an-1x2+anx+an+1


其中x 為變數,n為其最高之階,為變數x之次方。而a 1, a 2 ,…,a n , a n+1等則分別係數,可以利用向量矩陣表示。以上項之通式為例,其向量p為:


p=[a1, a2 ,…,an , an+1]


代表F(x)這個多項式。多項式間之運算則以其p向量為代表。例如,兩多項式之相加,設其向量p=[20 -7 5 10],另一為q=[1 8 1 -6],則相加後應為m=[21 1 6 4],亦即其多項式和為21X³+X²+6X+4。此處若兩向量之大小不同,則較少的前面元素應以零補齊。兩多項式相減時亦同。多項式若乘以一個常數,則直接以常數乘上每項係數或向量中之每個元素即可。但若為兩個非常數之多項數相乘或相除,則必須藉助MATLAB之指令conv或 deconv來運算才行。這兩個指令均有兩項輸入,分別為兩多項式之向量。例如兩多項式之向量分別為p,q:


>>p=[1 5 3 4 1] %代表多項式X+5X3+3X 2+4X+1
p = 1 5 3 4 1

>>q=[8 3 -5 6] %代表多項式8X3+3X2-5X+6
q = 8 3 -5 6

兩者相乘後,設為M,則M應為:

多項式乘法conv



>>M=conv(p,q)
M =
8 43 34 22 35 1 19 6


此多項式為

8X7+43X6+34X5+22X4+35X3+X2+19X+6。


多項式除法deconv


今若將M除以q,利用deconv函數指令,其結果應為:


>>[s,r]=deconv(M,q)
s =
1 5 3 4 1
r =
0 0 0 0 0 0 0 0

此s向量與p向量相同,r則為除後之餘數,目前為零,因為完全除盡。例如:

>>[s,r]=deconv(p,q)
s =
0.1250 0.5781
r =
0 0 1.8906 6.1406 -2.4688

此時之商s為0.1250X + 0.5781;其餘項為

1.8906X3+ 6.1406X2 -2.4688


上述多項式相乘除之指令conv與deconv並不需要相同的向量長度。即使除法,其前項為分子,後項為分母,分子之長度通常比分母長,但並不必要如加法或減法,需在前面加零元素,以湊成相同的長度。

多項式求值polyval


其次為多項式值之計算可用polyval(p,x)指令計算多項式之值,其中p為多項式之係數向量,x為變數值,可為向量矩陣型式:


>>x=0:5,p=[1 -3 3 6]
x =
0 1 2 3 4 5
p =
1 -3 3 6

>>f=polyval(p,x)
f =
6 7 8 15 34 71


上式中p代表多項式f(x)之向量,其所得值為f(0)、f(1),…f(5)分別為f向量之元素值。運算時,亦可合併為一個指令執行,只要位置放對就行:


>>f=polyval([1 -3 3 6],[0:5])
f =
6 7 8 15 34 71

 

8.1多項式之根

令一多項式等於零,其x值即為其根。具有n階的多項式,應存在有n個根,但這些根可能為實數,也可能為複數或重根。若根為複數,只要其向量元素為實數,則其複數根常成對存在,或稱為共軛根,其型式為a±bi。

roots


求根的指令為roots(p),p為多項式之向量矩陣。如:


>>roots([2 -2 -1 0 1])
ans =
1.0000 + 0.0000i
1.0000 - 0.0000i
-0.5000 + 0.5000i
-0.5000 - 0.5000i

結果得到兩個相同的實根1及-5±0.5i。在多項式中,最簡單的二次式ax²+bx+c=0之根可利用公式得解,其型式如下:

x={(-b ±(b²-4ac) (1/2) }/2a

若二次之型式為ax²+2bx+c=0,則其根之型式可改變為:

x={(-b ±(b²-ac) (1/2) }/a

設a=5,b=10, 則上式根可以計算如下:


>>a=2;b=10;c=12;
>>x1=(-b+sqrt(b.*b-4*a.*c))/(2*a)
x1 = -2

>>x2=(-b-sqrt(b.*b-4*a.*c))/(2*a)
x2 = -3

若用roots指令求解,則


>>roots([2 10 12])
ans =
-3.0000
-2.0000

所得之答案相同。

poly


有根時,也可以利poly(r)指令將其轉回多項式之型式。以前面所得之兩個實根1及虛根 -5±0.5i為例,其對應多項式應為:


>>poly([1, 1, 0.5+0.5i, -0.5-0.5i])
ans =
1.0000 -1.0000 -0.5000 0 0.5000

其結果若分別乘以2後,應與前例之設定相同。由此可知,用根反求多項式係數時,其結果可能為整數倍數,其比例應一致的。而且,在poly(r)之輸入項r可為行向量或列向量,其結果應相同。

 

8.2 非線性函數求根法(1)

除多項式之尋根外,有些函數屬於非線性型式,其尋根法自有不同。在matlab中,有fzero、fminbnd及 function_handle可以運用。茲介紹如下:

FZERO 尋找函數根之指令


fzero之語法如下:

 x = fzero(fun,x0)
 x = fzero(fun,x0,options)
 [x,fval,exitflag,output] = fzero(fun,x0,options)


通常要對任一個函數求其等於零之根,有如大海撈針,尤其函數若在零點時存在有許多根時,其所找出之根有時並不符合所望。為此,必須先給附近值或概略區間,使程式能順利找到所要的根。fzero指令之功能就是利用x0為第一個猜測值進行求根。若x0為常數,程式會先找到一個具有正負值區間但包含x0值之根。若設定根之範圍,則可改為矩陣之型式,不過所設定之範圍若其對應函數值無法產生正負符號,程式可能會給一個錯誤的信息。

在輸出參數中,除得到根x之外,其對應之函數值照理為零,但若有差異,亦可利用第二個輸出參數fval。若在設定之範圍內得到NaN或Inf時,表示無解,但也可能以複數為最後的答案。FUN之參數則代表函數名稱,包括自訂函數在內。其名稱之前則需加@之符號。例如:

>> X = fzero(@sin,3)
X =
3.1416

>>> x = fzero(@cos,[1 2])
x =
1.5708

函數也可以使用匿名函數,例如,若有一個匿名函數為 @(x) sin(3*x/5):

>> X = fzero(@(x) sin(3*x/5),5)
X =
5.2360

函數也可使用自訂函數,例如下面之自訂函數demofun:

function f=demofun(x)
f = x.^3-100;

>> x=fzero(@demofun,1)
x =
4.6416


若自訂函數有兩個以上輸入參數,則可採用匿名函數之型式,但只能針對其中一個當變數,其餘需事先設定為常數,例如:


>> x=fzero(@(x) demofun(x),1)
x =
4.6416


使用匿名函數時,其函數名稱也可使用函數握把,但不必加上@,例如:

>>f = @(x)x.^3-5*x-6;

>> z=fzero(f,3)
z =
2.6891


參數options則以optimset函數產生,主要是設定尋根的過程參數,其中包括Display, TolX, FunValCheck及OutputFcn等項目。此外,exitflag輸出參數則是執行結果之代碼,其中:





1 FZERO找到適當值
-1 運算依output函數之設定停止。
-3 在設定之區間,其結果為NaN或Inf。
-4 找到結果為複數型式。
-5 FZERO可能接近單質點(singular point)

 

8.3多項式分母之展開式

 

多項式餘式residue


多項式分母若無重根的情況,應可進行因式分解,並求得其係數,此可以利用residue指令求解,其語法如下:

[r,p,k] = residue(b,a)
[b,a] = residue(r,p,k)


其中,b與a分別為兩個多項式。其中a為一分式之分母,b該分式之分子,兩者均為向量型式;而[r,p,k]等則為行向量,分別代表展開後之分子、分母及餘數之係數,若能除盡則k項應為零。r與p分別為餘數與極數,其個數應相等,但應比a之個數少一。

當極點(根)均相異的狀況下,值若p中有相同值時,其解的型式必須稍作變化,例如:

b =[ 3 -6 4]; a =[ 1 -5 8 -4];
>> [r,p,k]=residue(b,a)
r = 2
4
1
p = 2
2
1
k = []

其結果應解釋為如下之型式:

b(x)/a(x)=(3x²-6x+4)/(x³-5x²+8x-4)=2/(x-2)+4/(x-2)²+1/(x-1)

RESIDUE這個指令也可以採用逆向方式反求A與B之多項數,只要將其參數反向即可,如:

[B,A] = RESIDUE(R,P,K)

其中RPK之定義如前述,但此時成為輸入項,輸出為A與B,但應注意其對應位置。下面為上述之反向例:

>> [b,a]=residue([2 4 1],[2 2 1],[])
b = 3 -6 4
a = 1 -5 8 -4

其所得結果與前述相同。

 

8.4 非線性函數求根法-fminbnd

 

FMINBND 非線性函數最小值


fminrnd之功能是在特定區間尋找單一變數之函數之最小值。其指令型式如下:

x = fminbnd(fun,x1,x2)
x = fminbnd(fun,x1,x2,options)
[x,fval,exitflag,output] = fminbnd(...)



上述指令fminbnd之功能在於針對函數fun,在設定的範圍x1<x<x2中找尋其最小值。其值置於左邊之x中,而函數之對應值則置於fval內。其中fun為函數之握把,或函數之名稱。若為函數名稱則須在名稱前加@符號。


>> X = fminbnd(@sin,3,4)

X =

3.9999


也可以使用匿名函數:

>> f = @(x)x.^3-2*x-5;
>> [x,f] = fminbnd(f, 0, 2)
x =
0.8165
f =
-6.0887

>> x = fminbnd(@(x) sin(x)+3,2,5)

x =

4.7124



在指令中之第四參數項options之參數則可利用optimset函數依下列參數進行設定:








Display 顯示之層次:'off'不顯示;'iter'顯示每次回圈之結果; 'final' 只顯示最後結果;'notify' (預設) 若函數不收斂時顯示。
FunValCheck 檢查目的函數是否正確,'on' 目標函數之結果為複數或 NaN時顯出警告;'off' 不顯示警告。
MaxFunEvals 函數容許之最大值。
MaxIter 容許最大迴圈數。
OutputFcn 指出使用者設定之呼叫定義函數。
TolX x值之容許度。


上述參數之設定可利用optimset函數,例如:

>> [X,FVAL,EXITFLAG] = fminbnd(@cos,3,4,optimset('TolX',1e-12,'Display','off'))

X =
3.1416
FVAL =
-1
EXITFLAG =
1


輸出之第三參數為運算之狀態,與fzero中之第三參數相同:






1 fminbnd指令依據TolX收斂至x。
0 最大迴圈數。
-1 由 output函數決定終止。
-2 邊界不符合 (x1 > x2)。


輸出之第四項為OUTPUT,其內容如下:






output.algorithm 使用之運算法
output.funcCount 函數計算之次數
output.iterations 迴圈之次數
output.message 離開信息

 

8.5多項式曲線適配法

多項式曲線適配法可以利用polyfit完成。利用現有之資料組合[x,y]以求最佳之多項式曲線,其語法如下:


p = polyfit(x,y,n)
[p,S] = polyfit(x,y,n)
[p,S,mu] = polyfit(x,y,n)


其中[x, y]為資料組,n為多項式之最高階數,p則是所得多項式之係數向量。S則為結構矩陣,其下有R、df、normr等欄位,代表QR之分解結構、自由度及副變量。

範例:


這個例子是利用現有資料適配erf(x)函數,並利用x之多項式表示。這個例子雖然不很適當,因為erf(x)函數有其特定範圍,一般多項式則沒有範圍。故利用資料適配的結果可能不會很理想。

開始時先產生x之向量點,該其均勻分佈於一個區間,然後使用erf(x)函數進行估計:

x = (0: 0.1: 2.5)';
y = erf(x);

設多項式最高階n=6,則

p = polyfit(x,y,6)

得到之結果,多項式係數為:

p =

0.0084 -0.0983 0.4217 -0.7435 0.1471 1.1064 0.0004


為瞭解所得之多項式與實際值有多接近,可以使用polyval這個求值的函數,同時將其作成表格作比較,最後一項則為誤差:


f = polyval(p,x);

table = [x y f y-f]

table =

0 0 0.0004 -0.0004
0.1000 0.1125 0.1119 0.0006
0.2000 0.2227 0.2223 0.0004
0.3000 0.3286 0.3287 -0.0001
0.4000 0.4284 0.4288 -0.0004
...
2.1000 0.9970 0.9969 0.0001
2.2000 0.9981 0.9982 -0.0001
2.3000 0.9989 0.9991 -0.0003
2.4000 0.9993 0.9995 -0.0002
2.5000 0.9996 0.9994 0.0002

在這個區間內,看起來其適配情形還不錯,可以到小數三、四位。但不要高興太早,因為超出此範圍後,多項式會如脫韁之馬,很快就露出馬腳。利用下面程式內容,可以立即用圖形進行比較其誤差之大小,結果則請讀者自行執行。


x = (0: 0.1: 5)';
y = erf(x);
f = polyval(p,x);
plot(x,y,'o',x,f,'-')
axis([0 5 0 2])

 

8.6 非線性函數求根法-fminsearch

 

FMINSEARCH指令


此為尋求函數之最小值位置之另一個指令,或稱為尼德-米(Nelder-Mead)法。它可應用於多維非線性函數,不必使用範圍界定。指令之格式如下:

x = fminsearch(fun,x0)
x = fminsearch(fun,x0,options)
[x,fval,exitflag,output] = fminsearch(fun,x0,options)


fminsearch指令起始值為x0,尋找其附近fun函數之最小值,結果置於x。x可為常數,向量或矩陣。同理,options參數可由optimset函數設定。其項目包括 Display, TolX, TolFun, MaxFunEvals, MaxIter, FunValCheck及OutputFcn,讀者可以參閱手冊。

>> X = fminsearch(@cos,3)

X =
3.1416

---------------------------
>> f=@(x) cos(x)+sin(x);

>> X = fminsearch(f,[5])

X =

3.9270

>> X = fminsearch(@(x) cos(x)+sin(x),[5])

X =

3.9270


 

8.7多項式矩陣值

前述之polyval可計算一個多項式值,若輸入值為矩陣型式,則可使用polyvalm求值,其語法如下:


Y= polyvalm(p, X)


其中,p為多項式之係數向量,X為其變數值,以矩陣型式表示,但必須為方矩陣。
例如:

>> p=[1 5 12 40 15]
p =
1 5 12 40 15
>> X=magic(4)
X =
16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1
>> m=polyval(p,X)
m =
89743 199 459 42109
1765 23203 16615 7759
11553 4999 3063 31599
943 55063 70815 73

>> m=polyvalm(p,X)
m =
395489 381218 383866 387530
382538 390345 389154 386066
386506 387834 388145 385618
383570 388706 386938 388889

你可能感兴趣的:(function,table,matlab,fun,output,plot)