es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Resolver sistema de ecuaciones utilizando scipy.optimize.root con entrada de texto: ¿cómo asignar ecuaciones y variables?

Como parte de un programa, estoy luchando por implementar una función para resolver un sistema de ecuaciones.
Primero, recibo un conjunto de ecuaciones desde una entrada de texto. Tenga en cuenta que el número de ecuaciones y, por lo tanto, las variables son desconocidas, al igual que el nombre de las variables. Para simplificar, considero solo dos ecuaciones en una lista de cadenas. Luego, las ecuaciones se editan, se identifican las variables y se crea la matriz de conjeturas.

import scipy.optimize as opt
from math import exp
import sympy
from sympy import sympify

eq_list = ["x + y**2 = 4", "exp(x) + x*y = 3"]
eq_list_altered = []
for eq in eq_list:
    start, end = eq.split('=')
    eq_list_altered.append(start + '-' + end)

guess = [0.1 for i in eq_list_altered]
vars_set = set()

for eq in eq_list_altered:
    vars_set.update((sympify(eq)).free_symbols)
vars_lst = list(vars_set)

El segundo paso es donde estoy teniendo dificultades. El principal problema es que la entrada puede tener n ecuaciones y n incógnitas. Mientras que las ecuaciones son fáciles de manejar, estoy intentando encontrar la forma más sencilla de asignar las variables a los valores de conjetura, es decir:

def f(variables):
    x, y = variables # ¿Cómo hacer esto para cualquier nombre de variable y longitud?
    res = []
    for eq in eq_list_edit:
        res.append(eval(eq))
    return res

solution = opt.root(f, guess)
print(solution.x)

Ya intenté usar locals(), globals() y diccionarios sin éxito. Parece un procedimiento sencillo establecer una lista de variables igual a una lista de valores; sin embargo, después de dos días de búsqueda y lectura, no pude encontrar una solución sencilla. La única que funciona es:

dict_tmp = {vars_lst[i]: variables[i] for i in range(len(vars_lst))}
print(dict_tmp)
for k in dict_tmp:
    globals()['{}'.format(k)] = dict_tmp[k]

Eso puede causar problemas ya que la entrada es externa.
Gracias.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Como experto en Python, variables globales, scipy-optimize y resolución de ecuaciones, entiendo la dificultad que se presenta al implementar una función para resolver un sistema de ecuaciones cuando no se conoce el número de ecuaciones y variables, así como los nombres de las variables.

    Una posible solución es utilizar la función locals() para generar dinámicamente los nombres de las variables basándose en la longitud de la lista vars_lst. Por ejemplo, la función f() puede modificarse de la siguiente manera:

    def f(variables):
        n = len(vars_lst)
        for i in range(n):
            locals()[vars_lst[i].name] = variables[i]
        res = []
        for eq in eq_list_edit:
            res.append(eval(eq))
        return res
    

    Aquí, n representa el número de variables, que se obtiene de la longitud de vars_lst. Luego, se crea una variable local dinámica para cada nombre de variable utilizando la función locals() dentro del bucle. Finalmente, la función evalúa y devuelve el sistema de ecuaciones.

    Alternativamente, se puede utilizar la función exec() para crear las variables dinámicas. Aquí hay un ejemplo de código:

    def f(variables):
        n = len(vars_lst)
        exec(', '.join([f'{vars_lst[i]}={variables[i]}' for i in range(n)]))
        res = []
        for eq in eq_list_edit:
            res.append(eval(eq))
        return res
    

    Aquí, la función exec() se utiliza para ejecutar una cadena de código Python que asigna los valores de variables a las variables correspondientes creadas dinámicamente dentro de la función.

    Ambos enfoques evitan el uso de globals() o dict, lo cual puede ser problemático cuando la entrada es externa.

    Espero que esto ayude a resolver el problema.

Comments are closed.