2.2 多項(xiàng)式函數(shù)
看其他篇章到 目錄 選擇。
在 Commons Math 中的 analysis.polynomials 包中有所有的與多項(xiàng)式函數(shù)相關(guān)的類和接口定義。這一篇主要從這個(gè)包分析,來研究一下多項(xiàng)式函數(shù)的應(yīng)用。
?Polynomials 包中沒有 interface 的定義,下屬含有 5 個(gè)類: PolynomialFunction 、 PolynomialFunctionLagrangeForm 、 PolynomialFunctionNewtonForm 、 PolynomialSplineFunction 和 PolynomialsUtils 。其中主要的只有 PolynomialFunction 和 PolynomialSplineFunction ,正如 api doc 中的介紹, PolynomialFunction 類是 Immutable representation of a real polynomial function with real coefficients ——實(shí)數(shù)多項(xiàng)式的表示; PolynomialSplineFunction 類是 Represents a polynomial spline function. ——樣條曲線多項(xiàng)式的表示。另外兩個(gè)表示拉格朗日和牛頓形式的多項(xiàng)式函數(shù)。而 PolynomialsUtils 類中提供了幾個(gè)構(gòu)造個(gè)別(比如切比雪夫多項(xiàng)式)多項(xiàng)式的靜態(tài)方法。
我覺得最常用的應(yīng)該就是實(shí)數(shù)系數(shù)的多項(xiàng)式了,因此以 PolynomialFunction 類為例來進(jìn)行分析。實(shí)數(shù)系數(shù)的多項(xiàng)式函數(shù)形如: f(x) = ax^2 + bx + c 。 PolynomialFunction 類實(shí)現(xiàn)了 DifferentiableUnivariateRealFunction 接口,因此必須實(shí)現(xiàn) value() 和 derivative() 方法,并且實(shí)現(xiàn)該接口也表明這是一元可微分的實(shí)數(shù)函數(shù)形式。 PolynomialFunction 類定義了一組 final double coefficients[] 作為多項(xiàng)式系數(shù),其中 coefficients[0] 表示常數(shù)項(xiàng)的系數(shù), coefficients[n] 表示指數(shù)為 n 的 x^n 次項(xiàng)的系數(shù)。因此,這個(gè)類所表達(dá)的多項(xiàng)式函數(shù)是這樣的: f(x)=coeff[0] + coeff[1]x + coeff[2]x^2 + … + coeff[n]x^n 。它的構(gòu)造方法是 PolynomialFunction(double []) 就是接受這樣的 coefficients 數(shù)組作為系數(shù)輸入?yún)?shù)來構(gòu)造多項(xiàng)式的。這個(gè)是很好表達(dá)也很方便理解的。那么它的 value(double x) 方法是通過調(diào)用 double evaluate( double [] coefficients, double argument) 實(shí)現(xiàn)的,本質(zhì)用 Horner's Method 求解多項(xiàng)式的值,沒有什么技術(shù)難點(diǎn),非常好理解的一個(gè)給定參數(shù)和函數(shù)求值過程。剩余定義的一些加減乘等操作,都是通過一個(gè)類似public PolynomialFunction add( final PolynomialFunction p) 這樣的結(jié)構(gòu)實(shí)現(xiàn)的。求導(dǎo)數(shù)的方法 derivative() 是通過這樣的一個(gè)微分操作實(shí)現(xiàn)的。見源碼:
?
??2
?3
?4
?5
?6
?7
?8
?9
10
11
12
13
14
15
測(cè)試代碼示例如下:
?2
?3
?4
?5
?6
?7
?8
?9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
輸出如下:
f1(x) is : 3.0 + 6.0 x - 2.0 x^2 + x^3
f2(x) is : 1.0 + 2.0 x - x^2 - 2.0 x^3
f1(x)'s degree is 3
f1(2) = 15.0
f1(x)+f2(x) = 4.0 + 8.0 x - 3.0 x^2 - x^3
f1(x)-f2(x) = 2.0 + 4.0 x - x^2 + 3.0 x^3
f1(x)*f2(x) = 3.0 + 12.0 x + 7.0 x^2 - 15.0 x^3 - 8.0 x^4 + 3.0 x^5 - 2.0 x^6
f1'(x) = 6.0 - 4.0 x + 3.0 x^2
f2''(x) = -2.0 - 12.0 x
-----------------------------------------------
poly spline func is org.apache.commons.math.analysis.polynomials.PolynomialSplineFunction@69b332
f(0.5) = 2.75
spline segments number is 3
spline:f0(x) = x + x^2
spline:f1(x) = 2.0 + x + x^2
spline:f2(x) = 4.0 + x + x^2
spline func derivative is org.apache.commons.math.analysis.polynomials.PolynomialSplineFunction@173a10f
PolynomialFunction 類也是重寫了 toString 方法和 hashCode 和 equals 方法的。
PolynomialSplineFunction 類是多項(xiàng)式樣條函數(shù), 樣條 是一種特殊的函數(shù),由多項(xiàng)式分段定義。表示了一個(gè)由多個(gè)多項(xiàng)式組成的樣條曲線。它的實(shí)現(xiàn)主要是內(nèi)部定義了一個(gè)多項(xiàng)式函數(shù)組 PolynomialFunction polynomials[] 和一個(gè)樣條分界節(jié)點(diǎn)數(shù)組 double knots[] 。這兩個(gè)內(nèi)部成員分別表示什么呢?分界節(jié)點(diǎn)表示整條曲線對(duì)應(yīng)在 x 等于 knots[i] 的時(shí)候開始使用其他多項(xiàng)式樣條,其構(gòu)造方法 public PolynomialSplineFunction( double knots[], PolynomialFunction polynomials[]) 完成這樣的功能。
舉例來說,一個(gè)多項(xiàng)式樣條函數(shù)就是一個(gè)分段函數(shù):
????? X^2+x??? [-1,0)
F(x) = x^2+x+2?? [0,1)
????? X^2+x+4?[1,2)
當(dāng)然,構(gòu)造方法中的參數(shù),
knots[]
數(shù)組必須是遞增的。
可以看到,直接輸出
PolynomialSplineFunction
是多么丑陋啊
~~
,因?yàn)樗鼪]有重寫
toString
方法。同樣,它的導(dǎo)數(shù)也是一樣的丑陋。其中如果給定的值不在定義域內(nèi),
value
方法還拋出異常
ArgumentOutsideDomainException
。
最后 PolynomialFunctionLagrangeForm 和 PolynomialFunctionNewtonForm 類完成的其實(shí)是多項(xiàng)式插值的功能,放到下一節(jié)研究的。
相關(guān)資料:
樣條函數(shù): http://zh.wikipedia.org/zh-cn/%E6%A0%B7%E6%9D%A1%E5%87%BD%E6%95%B0
Horner Methods : http://mathworld.wolfram.com/HornersMethod.html
Commons math 包: http://commons.apache.org/math/index.html
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元

