5

构建 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

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

4

2 回答 2

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
于 2011-07-22T15:54:11.827 回答
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
于 2011-07-25T00:45:03.907 回答