Sistemas de ecuaciones no lineales en python

publicado por: Anonymous

Tengo la siguiente inquietud con sistema de ecuaciones no lineales en python:

from scipy.optimize import fsolve as fs
def nonlinear(z):
    '''Solve a sistems  2x2 not linear
    '''
    x, y = z[0], z[1]
    f1 = (x**2)+(y**2)-2*(4.41*x+2.68*y)+25.59
    f2 = (x**2)+(y**2)-2*(3.23*x+2.1*y)+14.49
    return [f1, f2]

¿Cómo puedo encontrar las múltiples soluciones del sistema anterior con el código que realicé?

Por que si ejecuto la función anterior con unos valores iniciales me arrojaría sólo una solución:

x, y = fs(nonlinear, [1,1])
print(x,y)
3.38998152293 2.67210655679

Todas las soluciones que tiene el sistema son las siguientes:

introducir la descripción de la imagen aquí

solución

fsolve utiliza un enfoque numérico de optimización para encontrar una solución a la ecuación dada. En teoría no es posible (o no hay un método general) con SciPy hacer esto, en la práctica es posible hacerlo numéricamente si conocemos el número de soluciones y jugando con los valores iniciales, que en variables físicas tenemos muchas veces acotados. No obstante, dada la variabilidad de los sistemas, esto no siempre va a ser fácil o incluso posible.

En este caso creo que es más simple usar un enfoque analítico con SymPy en vez de uno numérico con SciPy:

from sympy import var, solve


x, y = var('x y')

f1 = (x**2)+(y**2)-2*(4.41*x+2.68*y)+25.59
f2 = (x**2)+(y**2)-2*(3.23*x+2.1*y)+14.49

sols = solve((f1, f2), (x, y))

Soluciones:

>>> sols
>>> [(3.38998152293488, 2.67210655678766),
     (3.78069409020719, 1.87720857509572)]
Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *