【问题标题】:Converting Mathematica functions to Java form将 Mathematica 函数转换为 Java 形式
【发布时间】: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


【解决方案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)

它的工作方式是搜索括号内的任何内容,后跟^n,即n 是从0 到9 的数字。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-28
      • 2016-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多