MATLAB多项式应用
作者:互联网
分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!http://www.captainbed.net
第八章 多項式之應用
對於多項式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為常數 |
多項式中,主要以其係數組成一向量作為運算之基礎。多項式之通式可表示如下:
1
F(x)=a
xn
+a2
xn-1
+...+an-1
x2
+an
x+an+1
其中x 為變數,n為其最高之階,為變數x之次方。而a1, a2 ,…,an , an+1等則分別係數,可以利用向量矩陣表示。以上項之通式為例,其向量p為:
1
p=[a
, 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:
4
>>p=[1 5 3 4 1] %代表多項式X
+5X3
+3X2
+4X+13
p = 1 5 3 4 1
>>q=[8 3 -5 6] %代表多項式8X
+3X2
-5X+6兩者相乘後,設為M,則M應為:
q = 8 3 -5 6
多項式乘法conv
>>M=conv(p,q)
M =
8 43 34 22 35 1 19 6
此多項式為
7
8X
+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;其餘項為
3
1.8906X
+ 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, 則上式根可以計算如下:
若用roots指令求解,則
>>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([2 10 12])
ans =
-3.0000
-2.0000
所得之答案相同。
poly
有根時,也可以利poly(r)指令將其轉回多項式之型式。以前面所得之兩個實根1及虛根 -5±0.5i為例,其對應多項式應為:
其結果若分別乘以2後,應與前例之設定相同。由此可知,用根反求多項式係數時,其結果可能為整數倍數,其比例應一致的。而且,在poly(r)之輸入項r可為行向量或列向量,其結果應相同。
>>poly([1, 1, 0.5+0.5i, -0.5-0.5i])
ans =
1.0000 -1.0000 -0.5000 0 0.5000
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
再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!http://www.captainbed.net
标签:10,項式,多项式,函數,結果,指令,MATLAB,应用,向量 来源: https://www.cnblogs.com/sownchz/p/10500336.html