numpy.poly1d,根查找优化,沿x轴平移多项式
通常,使用numpy来构建一个n次多项式并找到它的根是比较简单的事情:
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
编辑:把“polygon”(错误)改成了“polynomial”(正确)
2 个回答
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
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