27. 多項式: 由係數求根(Kerner法)

Newton法僅適用一次算一個根且需要好的起始點。 Kerner法較一般化,得到所有的根,起始點由一數列 a f a 餘數每一原子除以其在對應根處的導函數。它僅適用於最高次項係數為 1 的多項式,故我們先除以末項來標準化係數。此法只有至少一初值為複數才會收斂到複數根。我們採用指數 函數的泰勒展式,因為相對應的多項式有複數根:
   ]d=: ^ t. i.6
1 1 0.5 0.166667 0.0416667 0.00833333

   ]c=: (norm=: % {:) d
120 120 60 20 5 1

   +. a=: (init=: r.@}.@i.@#) c |a
 0.540302  0.841471 1 1 1 1 1
_0.416147  0.909297
_0.989992  0.14112
_0.653644 _0.756802
 0.283662 _0.958924

   deriv=: [: */ 0&=@{.}@(-/~ ,: 1:)

   kerner=: 1 : 0
] - x.&p. % deriv@]
)

   r=: c kerner ^:_ a
   +.(/:|) r                  依據magnitude排序的各根的實與虛數部分
_2.18061 4.57601e_31
 _1.6495     1.69393
 _1.6495    _1.69393
0.239806     3.12834
0.239806    _3.12834

   >./|c p. r
1.04488e_13
這些結果可以拿來比較使用基本單字 p. 於非標準化係數 d 。故:
   p. 2 4 2
+-+-----+
|2|_1 _1|
+-+-----+

   ,.;}.p. d
 0.2398064j3.12834
0.2398064j_3.12834
   _1.6495j1.69393
  _1.6495j_1.69393
          _2.18061
Newton法也可以用在複數根:
   +. d NEWTON ^:0 1 2 3 _ a=: 1j1
        1        1
0.0166065  0.99639
_0.990523 0.992532
 _1.95338  1.10685
  _1.6495   1.6939

下個前個字彙索引主選單