![](/img/trans.png)
[英]Improving accuracy in scipy.optimize.fsolve with equations involving integration
[英]Dynamic equations creation for optimize SciPy fsolve function
我正在使用 scipy 优化 function 来求解一些非线性方程。 但是我有 11 个变量可以改变的方程,所以我需要为 opt.fsolve function 创建非线性方程。
我尝试编写一个公式,其中我使用 function 创建方程并将它们存储在列表中。 该列表有 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)
但由于这些方程式采用字符串格式,因此 function 会抛出异常。
异常“function 调用的结果不是正确的浮点数组。”
我正在尝试使用以下示例
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)
有没有办法实现我想要做的事情? 动态创建方程后,我需要使用上面的 function。
所以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 安全问题的更多信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.