将数学方程表示为Java对象

4
我正在尝试设计一种将数学方程表示为Java对象的方法。目前我想到的是:
  • Term
  • - 包括系数(可能为负数)、指数和变量(x、y、z等)等字段。有些字段甚至可以作为它们自己的术语,引入递归。
  • - 扩展 Term 的对象包括诸如 TrigTerm 之类的东西,用于表示三角函数。
  • Equation

  • - 这是一个 Term 集合
  • - Equation 的 toString() 方法将调用其所有 Term 的 toString() 方法并连接结果。
总体思路是,我能够以编程方式操作方程式(例如,计算导数的方法将返回一个导数方程式,或者计算某个变量等于某个值时的方程式)。
对于简单的方程式,我的方法运行良好: x^2 + 3
这只是两个 Term:一个带有变量“x”和指数“2”,另一个仅是常数“3”。
但是对于更复杂的方程式,情况就不是那么理想了: alt text
是的,这是一个糟糕的例子,但我只是想说明一下。
那么问题来了:什么是将数学方程表示为Java对象的最佳方法?是否有任何已经实现这个功能的库?

7
构建一棵表达式树。 - NullUserException
1
在谷歌上搜索Content MathML,这是解决您问题的一种方法。 - High Performance Mark
1
请查看Aho和Ullman的《计算机科学基础》第5章,了解构建简单表达式树的解释。该书网址为http://infolab.stanford.edu/~ullman/focs.html。 - johnny_bgoode
3个回答

14
如何将数学方程表示为Java对象最好的方式是什么?
请注意,你没有任何方程。方程看起来像这样:x = 3。
你所拥有的是表达式:符号集合,在某些情况下可能计算出一些特定的值。
你应该编写一个类Expression。Expression有三个子类:Constant(例如3),Variable(例如x)和Operation。
一个Operation具有类型(例如“指数”或“否定”)和要处理的Expressions列表。 这就是关键思想:Operation是一个Expression,也有一些Expressions。
因此,你的 是SUM(EXP(X, 2), 3) - 即SUM操作,采用两个表达式,第一个是Expressions变量X和常量2的Exponentiation,第二个是常量3。
这个概念可以无限 elaborated 来表示你可以在纸上写的任何表达式。
难点在于评估表示你的表达式的字符串并生成Expression对象 - 正如有人建议的那样,阅读一些解析方面的论文。 这是最难的部分,但仍然相当容易。
对Expression进行评估(给定所有Variables的固定值)和输出表达式非常容易。 更复杂的变换(如微分和积分)可能会具有挑战性,但仍然不是火箭科学。

1

有关如何编写将输入转换为表达式树的编译器部分的详细信息,请参考一本好的编译器书籍。

您可能会发现这个系列很有启发性:http://compilers.iecc.com/crenshaw/

如果您“只是”想评估一个输入字符串,那么请查看Javassist库中的片段编译器。


0

在这里,我描述了抽象语法树Symja项目中作为解析数学表达式的表示方法。

D.java文件中的D[f,x]函数通过从System.mep文件中读取初始的Derivative[]规则来实现导数函数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接