如何解决计算python中字符串中的数学表达式
我有一堆从 JSON file 加载的方程,我想评估这些表达式。这些表达式有一些常量,常量的值(K1
,K2
,...)也保存在json文件中。与表达式中存在的变量 (var1
,var2
...) 对应的值在字典 vars
中定义。我想在表达式中插入常量和变量的值并计算数值。
import json
vars = {"var1": 1,"var2": 2,"var3": 3,"var4": 4,"var5": 5,"var6": 5}
with open("tst.json",'r') as f:
r = json.load(f)
print(r)
json 内容:
{
"EQ1": {
"parameters": {
"EQ1_coeff1": {
"value": 1.0e-06
},"P2": {
"value": 3.0
},"P3": {
"value": 3.0
}
},"expression": "(EQ1_coeff1 * ((1 dimensionless)/(1 dimensionless)) / (1 dimensionless))*(var1^P3/(var1^P3 + P2^P3) )"
},"EQ2": {
"parameters": {
"EQ2_coeff2": {
"value": 5253
},"K2": {
"value": 3
},"K5": {
"value": 1
},"K3": {
"value": 525
},"K4": {
"value": 3
},"K6": {
"value": 2
},"K7": {
"value": 0.01
}
},"expression": "(EQ2_coeff2 *((var2*var3)/(K1*K2))* ((1 dimensionless - ((var3*var4)/(var2))/K6) / ((1 dimensionless + var1/K1)*(1 dimensionless + var2)+ 1 dimensionless)))*(1 dimensionless/(1 dimensionless + var5/K7))"
}
}
我想就如何计算这些表达式(存储在 expression
中)征求建议。
附注:
1 dimensionless
只不过是 1。
解决方法
我将简单地用 globals()
更新 dict
,然后使用 eval
,如下所示:
import json
vars = {"var1": 1,"var2": 2,"var3": 3,"var4": 4,"var5": 5,"var6": 5}
r = {
"EQ1": {
"parameters": {
"EQ1_coeff1": {
"value": 1.0e-06
},"P2": {
"value": 3.0
},"P3": {
"value": 3.0
}
},"expression": "(EQ1_coeff1 * ((1 dimensionless)/(1 dimensionless)) / (1 dimensionless))*(var1^P3/(var1^P3 + P2^P3) )"
},"EQ2": {
"parameters": {
"EQ2_coeff2": {
"value": 5253
},"K2": {
"value": 3
},"K5": {
"value": 1
},"K3": {
"value": 525
},"K4": {
"value": 3
},"K6": {
"value": 2
},"K7": {
"value": 0.01
}
},"expression": "(EQ2_coeff2 *((var2*var3)/(K1*K2))* ((1 dimensionless - ((var3*var4)/(var2))/K6) / ((1 dimensionless + var1/K1)*(1 dimensionless + var2)+ 1 dimensionless)))*(1 dimensionless/(1 dimensionless + var5/K7))"
}
}
globals().update( **{k:v['value'] for k,v in r["EQ1"]["parameters"].items()})
globals().update( **{k:v['value'] for k,v in r["EQ2"]["parameters"].items()})
globals().update(**vars)
eval(r['EQ1']['expression'].replace("dimensionless","").replace("^","**"))
这给出:3.571428571428571e-08
对于 EQ2
,您没有定义变量 K1
。这更像是一种黑客行为,但我不知道更优雅的方式。还要记住 eval
是一个不太安全的函数。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。