【问题标题】:Converting Mathematica expression in python and evaluating it在 python 中转换 Mathematica 表达式并对其进行评估
【发布时间】:2021-11-29 15:29:47
【问题描述】:

我已经成功地在 python 中导入了一个 Mathematica 表达式,但我无法使用它来评估我在 python 代码中的数字。下面是一个例子:

from sympy.parsing.mathematica import mathematica
from sympy import var
import numpy as np

G=1
c=1
m1in=1
m2in=1
Rxin=1
Ryin=1
Rzin=1
Vxin=1
Vyin=1
Vzin=1
sx1in=1
sy1in=1
sz1in=1
sx2in=1
sy2in=1
sz2in=1

G,c,m1in,m2in,Rxin,Ryin,Rzin,Vxin,Vyin,Vzin,sx1in,sy1in,sz1in,sx2in,sy2in,sz2in = var('G c m1 m2 Rx Ry Rz Vx Vy Vz sx1 sy1in sz1 sx2 sy2 sz2')

term1 = mathematica('-1/(3 (m1 + m2) (Rx^2 + Ry^2 + Rz^2)^4)*16 G^2 m1 m2 (Rz (-((m2^2 sy1 + m1^2 sy2) Vx) + (m2^2 sx1 + m1^2 sx2) Vy) + Ry ((m2^2 sz1 + m1^2 sz2) Vx - (m2^2 sx1 + m1^2 sx2) Vz) + Rx (-((m2^2 sz1 + m1^2 sz2) Vy) + (m2^2 sy1 + m1^2 sy2) Vz)) (2 G (m1 + m2) Sqrt[Rx^2 + Ry^2 + Rz^2] - 30 Ry Rz Vy Vz - 30 Rx Vx (Ry Vy + Rz Vz) + Rz^2 (14 (Vx^2 + Vy^2) - Vz^2) + Ry^2 (14 Vx^2 - Vy^2 + 14 Vz^2) + Rx^2 (-Vx^2 + 14 (Vy^2 + Vz^2)))')

print(term1)

我想在代码开头编写的值中评估 term1 以便将数字作为最终输出。

【问题讨论】:

  • 你需要使用 subs 例如term1.subs(Symbol('m1'), 1)
  • 非常感谢!这是一个非常有用的建议

标签: python-3.x parsing sympy


【解决方案1】:

我不确定mathematica 变量在= 之前列出“in”是否很常见,但如果确实如此,以下内容可能有助于将该列表转换为可用于解析的替换字典表达式:

>>> def mathin2reps(s):
...   from sympy.parsing.sympy_parser import parse_expr
...   return dict(parse_expr(i.replace('in=','='), None, T[1,9]).args
...       for i in s.splitlines())
...
>>> reps = mathin2reps('''G=1
... c=1
... m1in=1
... m2in=1
... Rxin=1
... Ryin=1
... Rzin=1
... Vxin=1
... Vyin=1
... Vzin=1
... sx1in=1
... sy1in=1
... sz1in=1
... sx2in=1
... sy2in=1
... sz2in=1''')
>>> term1.xreplace(reps)
0

【讨论】:

  • 非常感谢您的帮助。但是,它也可以使用 .subs(sim.Symbol('m1'),1) 解决。我还有另一个问题是,当我计算一些东西时,我有像 1.6751 + 56*sqrt(2) 这样的表达式,其中 sqrt(2) 和任何不是完美平方的数字都不会被计算出来。我该如何解决这个问题?
  • @VDF 如果您想要一个数字近似而不是精确的符号表达式,您可以调用.evalf(),例如term1.xreplace(reps).evalf()
  • 您可以使用term1.evalf(subs=reps) 进行替换评估;这是使用替换值获得最准确结果的方法(假设所有变量都被替换)。
  • 非常感谢您的建议!他们很有帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-12
  • 1970-01-01
  • 1970-01-01
  • 2011-06-30
  • 1970-01-01
  • 1970-01-01
  • 2012-09-05
相关资源
最近更新 更多