numpy.poly1d, поисковая оптимизация, смещение полинома по оси x - PullRequest
5 голосов
/ 22 июля 2011

это обычно простая задача для построения полинома 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, но он очень нестабилен, так как сильно зависит от выбора начальных значений в моем конкретном случае.

Заранее спасибо С уважением рррак

EDIT: изменен "многоугольник" (неправильно) на "многочлен" (правильно)

Ответы [ 2 ]

4 голосов
/ 22 июля 2011

Прежде всего, конечно, вы имеете в виду многочлен, а не многоугольник?

С точки зрения предоставления ответа, используете ли вы одинаковое значение «x0» во всех терминах?Если это так, пусть y = x - x0, решите для y и получите x, используя x = y + x0.

Вы можете даже обернуть его в лямбда-функцию, если хотите.Скажем, вы хотите представить

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 голосов
/ 25 июля 2011

В случае, если 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
...