构建n阶多项式通常是一项容易的任务 并找到numpy的根:
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
编辑:将“多边形”(错误)更改为“多项式”(正确)
答案 0 :(得分: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
答案 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