将Mathematica函数转换为Java形式

时间:2018-07-11 12:49:42

标签: python

我们正在研究一个大型数学项目,其中包含许多由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 regex,但找不到任何合适的解决方案。问题是幂函数必须将所有内容都放在方括号内,例如:

(Math.cos(R) * X1 - X2)^2     >>>>    Math.pow(Math.cos(R) * X1 - X2, 2)

我希望有人有一个快速而理想的解决方案。否则,我将需要一些时间并编写一个冗长且“肮脏”的脚本,它将解决此问题。

感谢您的帮助:)

2 个答案:

答案 0 :(得分:1)

您的正则表达式搜索可能是这样的:

import re

E = "(Math.cos(R) * X1 - X2)^2"

regex = re.compile(r'\((.*)\)\^(\d)')
match = regex.match(E)

new_E = "Math.pow(%s, %s)" % (match.group(1), match.group(2))

print(new_E)  # Math.pow(Math.cos(R) * X1 - X2, 2)

它的工作方式是搜索括号内的所有内容,然后搜索^nn是从0到9的数字。

我希望您可以根据需要对其进行调整以使其通用化。

答案 1 :(得分:0)

我尝试使用mathematica的fullform []函数将a ^ b转换为Power [a,b]。然后我使用查找和替换将Power [a,b]更改为任意函数,例如PowerJ [a,b]。然后,我可以改回输入stlye,以将公式返回到具有“ *,+”等的形式。然后,我便可以使用上面的代码将PowerJ [a,b]更改为Math.pow [a,b] ]。