优化 SciPy fsolve 函数的动态方程创建
Dynamic equations creation for optimize SciPy fsolve function
我正在使用 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 安全问题的更多信息,请参见 here。
我正在使用 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 安全问题的更多信息,请参见 here。