Python numpy.poly1d,寻根优化,x轴移动多项式

Python numpy.poly1d,寻根优化,x轴移动多项式,python,optimization,numpy,scipy,polygons,Python,Optimization,Numpy,Scipy,Polygons,构造一个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

构造一个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


编辑:将“多边形”(错误)更改为“多项式”(正确)

首先,你肯定是指多项式,而不是多边形

就提供答案而言,您是否在所有术语中使用相同的“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

如果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

这听起来是减少多项式的一个很好的解决方案,但为什么不简单:
sum([np.poly1d([1,-x0])**i*c for i,(c,x0)在枚举(zip(ks,offset))]))