繁体   English   中英

为优化创建动态方程 SciPy fsolve function

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM