为优化SciPy求解函数创建动态方程



我正在使用scipy优化函数来求解一些非线性方程。然而,我有11个方程的变量可以改变,所以我需要为opt.fsolve函数创建非线性方程。

我试着写一个公式,我用一个函数创建方程,并将它们存储在一个列表中。列表中有11个方程,形式为A *b = 2.6, A * k = 4.6, b * g = 3.6, j *b = 1.6等。我有11个方程。

def f(variables) :
(a,b,c,d,e,f,g,h,i,j,k) = variables
eq_1=eq_list[0]
eq_2=eq_list[1] 
eq_3=eq_list[2] 
eq_4=eq_list[3] 
eq_5=eq_list[4] 
eq_6=eq_list[5] 
eq_7=eq_list[6] 
eq_8=eq_list[7] 
eq_9=eq_list[8]
eq_10=eq_list[9] 
eq_11=eq_list[10]
return [eq_1,eq_2 ,eq_3,eq_4 ,eq_5,eq_6,eq_7,eq_8,eq_9,eq_10,eq_11]
solution = opt.fsolve(f, (0.1, 1,1,0.1,1,1,1,1,1,1,1,)) # fsolve(equations, X_0)

但是由于这些方程是字符串格式,函数抛出异常。
异常"函数调用的结果不是一个正确的浮点数组。">

我正在尝试使用以下示例

def f(variables) :
(x,y) = variables
first_eq = x + y**2 - 4
print(type(x))
second_eq = exp(x) + x*y - 3
return [first_eq, second_eq]
solution = opt.fsolve(f, (0.1, 1)) # fsolve(equations, X_0)  
print(solution)

是否有一种方法可以实现我想要做的事情?我需要在动态创建方程后使用上述函数。

scipy.optimize.fsolve预计每个方程等于0,所以你需要变换方程通过通过移动右边的东西等号的左边。然后,您可以解压缩变量并遍历每个表达式,并简单地使用eval对它们进行评估。所以你可以这样做:

import scipy.optimize as opt
from math import exp 
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)
def f(variables) :
(x,y) = variables
res = []
for eq in eq_list_altered:
res.append(eval(eq))
return res
solution = opt.fsolve(f, (0.1, 1))
print(solution)

请注意,通常不建议使用eval,因为它可以运行任意代码,因此请确保字符串仅是来自可信源的表达式。更多关于eval的安全问题可以在这里找到。