首页 > 解决方案 > 在python中评估字符串中的数学表达式

问题描述

我有一堆从JSON 文件加载的方程,我想评估这些表达式。这些表达式有一些常量,常量的值 ( 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。

标签: python-3.xequation-solvingmathematical-expressions

解决方案


我将简单地使用 更新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定义变量。这更像是一种 hack,不过我不知道有一种更优雅的方式。还要记住eval一个不是很安全的功能。


推荐阅读