2011-07-22 6 views
5

es comúnmente una tarea fácil para construir un orden enésimo polinomio y encontrar las raíces con numpy:numpy.poly1d, raíz de búsqueda de optimización, cambiando polinomio en el eje x

import numpy 
f = numpy.poly1d([1,2,3]) 
print numpy.roots(f) 
array([-1.+1.41421356j, -1.-1.41421356j]) 

Sin embargo, supongamos desea un polinomio de tipo:

f(x) = a*(x-x0)**0 + b(x-x0)**1 + ... + n(x-x0)**n 

¿hay una forma sencilla de construir una función de tipo numpy.poly1d y encontrar las raíces? He intentado con scipy.fsolve, pero es muy inestable, ya que depende en gran medida de la elección de los valores iniciales en mi caso particular.

Gracias de antemano Saludos cordiales rrrak

EDIT: Changed "polígono" (equivocadas) para "polinomio" (correcto)

Respuesta

4

En primer lugar, seguramente te refieres polinomio, no polígono?

En términos de proporcionar una respuesta, ¿está utilizando el mismo valor de "x0" en todos los términos? Si es así, se permite que y = x - x0, resuelva para y y obtenga x usando x = y + x0.

Incluso podría envolverlo en una función lambda si lo desea. Por ejemplo, se desea representar

f(x) = 1 + 3(x-1) + (x-1)**2 

Entonces,

>>> g = numpy.poly1d([1,3,1]) 
>>> f = lambda x:g(x-1) 
>>> f(0.0) 
-1.0 

Las raíces de f vienen dados por:

f.roots = numpy.roots(g) + 1 
3

En caso x0 son diferentes por el poder, tales como:

f(x) = 3*(x-0)**0 + 2*(x-2)**1 + 3*(x-1)**2 + 2*(x-2)**3 

Puede usar operación polinomial para calcular el polinomio finalmente ampliado:

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 

El resultado es:

3  2 
2 x - 9 x + 20 x - 14 
+0

esto suena una buena solución para reducir los polinomios pero ¿por qué no es simple: 'suma ([np.poly1d ([1, -x0 ]) ** i * c para i, (c, x0) en enumerate (zip (ks, offsets))]) ' – dashesy

Cuestiones relacionadas