2011-07-22 34 views
5

它通常是一項容易的任務與numpy的建立一個n階多項式 並找到根:numpy.poly1d,求根優化,上移多項式x軸

import numpy 
f = numpy.poly1d([1,2,3]) 
print numpy.roots(f) 
array([-1.+1.41421356j, -1.-1.41421356j]) 

然而,假設你想要類型的多項式:

f(x) = a*(x-x0)**0 + b(x-x0)**1 + ... + n(x-x0)**n 

有沒有一種簡單的方法來構建一個numpy.poly1d型功能 並找到根源是什麼?我試過scipy.fsolve,但它非常不穩定,因爲它在很大程度上取決於我在特定情況下的起始值 的選擇。

預先感謝 問候 rrrak

編輯:更改 「多邊形」(錯誤),以 「多項式」(正確)

回答

4

首先,想必你的意思是多項式,不是多邊形?

在提供答案方面,您是否在所有術語中使用相同的「x0」值?如果是這樣,令y = x - x0,求解y並使用x = y + x0得到x。

如果需要,甚至可以用lambda函數包裝它。再說了,你要代表

f(x) = 1 + 3(x-1) + (x-1)**2 

然後,

>>> g = numpy.poly1d([1,3,1]) 
>>> f = lambda x:g(x-1) 
>>> f(0.0) 
-1.0 

F的根部由下式給出:

f.roots = numpy.roots(g) + 1 
3

如果X0是由電源不同,如:

f(x) = 3*(x-0)**0 + 2*(x-2)**1 + 3*(x-1)**2 + 2*(x-2)**3 

您可以使用多項式操作計算最終擴大多項式:

import numpy as np 
import operator 

ks = [3,2,3,2] 
offsets = [0,2,1,2] 

p = reduce(operator.add, [np.poly1d([1, -x0])**i * c for i, (c, x0) in enumerate(zip(ks, offsets))]) 

print p 

結果是:

3  2 
2 x - 9 x + 20 x - 14 
+0

這聽起來很好的解決方案,以降低多項式,但爲什麼不能簡單:'總和([np.poly1d([1,-x0 ])** i * c爲i,(c,x0)枚舉(zip(ks,offset))])' – dashesy