【发布时间】:2018-07-11 12:49:42
【问题描述】:
我们正在开展一个大型数学项目,其中包含大量由 Wolfram Mathematica 生成的长方程和导数。我们有 1000 多个非常长的方程。
主程序是用 Java 编写的,Mathematica 仅用于生成方程。我们的目标是将“Mathematica”形式转换为“Java”形式的方程。然后我们可以将生成的代码直接复制/粘贴到“Java”代码中。
例如,我们有 Mathematica 形式的短方程:
Sqrt[((Cos[R]*X1 - X2)^2 + (Sin[R]*Y1 - Y2)^2)/S^2]/S
我们希望它以 Java 形式出现,所以这是预期的结果:
Math.sqrt((Math.pow(Math.cos(R) * X1 - X2, 2) + Math.pow(Math.sin(R) * Y1 - Y2, 2)) / Math.pow(S, 2)) / S
这是一个简短的 python 脚本,它管理一些功能:
E = "Sqrt[((Cos[R]*X1 - X2)^2 + (Sin[R]*Y1 - Y2)^2)/S^2]/S"
E = E.replace("[", "(") # Replaces Square brackets with normal brackets
E = E.replace("]", ")") # Replaces Square brackets with normal brackets
E = E.replace("*", " * ") # Add some spaces for easier reading
E = E.replace("/", " / ") # Add some spaces for easier reading
E = E.replace("Cos", "Math.cos") # Change "Mathematica" cos to "Java" cos
E = E.replace("Sin", "Math.sin") # Change "Mathematica" sin to "Java" sin
E = E.replace("Sqrt", "Math.sqrt") # Change "Mathematica" SQRT to "Java" SQRT
# Converting Power function is missing here... This is a must :)
print(E)
以上代码产生:
Math.sqrt(((Math.cos(R) * X1 - X2)^2 + (Math.sin(R) * Y1 - Y2)^2) / S^2) / S
问题是我们没有找到任何幂函数的解决方案。我们想使用 python 正则表达式,但找不到任何合适的解决方案。问题是幂函数必须将所有内容都放在括号内,例如:
(Math.cos(R) * X1 - X2)^2 >>>> Math.pow(Math.cos(R) * X1 - X2, 2)
我希望有人有一个快速而奇特的解决方案。否则我需要花一些时间来写一个又长又“脏”的脚本来解决这个问题。
感谢您的帮助:)
【问题讨论】:
-
正则表达式不是嵌套值的正确工具(如括号内的括号可能是例如
((x+1)^2 + 3)^4。查看python中可用的一些parsing库,以便处理带括号的部分作为单独的单元。 -
这远非完美或“即用型”,但在我的codegen project 中,您可以创建一个预处理器,它可以使用Symja 来解析数学表达式。对于转换器,请在 doc/functions 文件夹中搜索
JavaForm、TeXForm或MathMLForm。
标签: python