MATLAB多项式应用

该博客介绍了MATLAB中处理多项式的各种方法,包括多项式乘法conv、除法deconv、求值polyval以及如何寻找多项式根、非线性函数的求根和最小值方法,如fzero、fminbnd、fminsearch,并提到了多项式曲线下适配和矩阵值计算。

第八章 多項式之應用

對於多項式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輸出參數則是執行結果之代碼,其中:





1FZERO找到適當值
-1運算依output函數之設定停止。
-3在設定之區間,其結果為NaN或Inf。
-4找到結果為複數型式。
-5FZERO可能接近單質點(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指出使用者設定之呼叫定義函數。
TolXx值之容許度。


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

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

X =
3.1416
FVAL =
-1
EXITFLAG =
1


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






1fminbnd指令依據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
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值