将数学方程表示为Java对象

时间:2010-09-18 18:27:57

标签: java math

我试图设计一种将数学方程表示为Java对象的方法。这是我到目前为止所提出的:

  • 期限
  • - 包括诸如系数(可以是负数),指数和变量(x,y,z等)之类的字段。有些字段甚至可能完全符合他们自己的条件,引入了递归。
  • - 扩展 Term 的对象会包含 TrigTerm 等内容来表示三角函数。

  • 公式

  • - 这是 Term s
  • 的集合
  • - Equation 的toString()方法将调用其所有 Term 的toString()方法并连接结果。

总体思路是我能够以编程方式操纵方程式(例如,一个能够返回方程式的方向式方法,这个方程式是它所要求的方程式的导数,或者是一种评估方程式的评估方法对于某个等于某个值的变量)。


我对简单方程式的效果很好:
x^2 + 3
这只是两个 Term :一个带有变量“x”和一个指数“2”,另一个带有一个常数“3”。

但对于更复杂的方程式而言并非如此:
alt text
是的,这是一个可怕的例子,但我只是说明一点。


现在问题是:将数学方程表示为Java对象的最佳方法是什么?是否有任何库已经这样做了?

3 个答案:

答案 0 :(得分:13)

  

什么是最好的方式   将数学方程表示为Java   对象

我希望你注意,你没有任何方程式。方程看起来像这样;

  

x = 3

你所拥有的是表达式:在某些情况下可以评估某些特定值的符号集合。

你应该写一个类Expression。表达式有三个子类:常量(例如3),变量(例如x)和操作。

操作具有类型(例如“取幂”或“否定”)以及要处理的表达式列表。这是关键的想法:一个操作, 一个表达式, 有一些表达式。

所以你的是SUM(EXP(X,2),3) - 也就是SUM操作,取两个表达式,第一个是表达式变量X和常量2的指数,以及第二个是常数3。

这个概念可以无限详尽地表达你可以写在纸上的任何表达。

困难的部分是评估一个代表你的表达式并生成一个Expression对象的字符串 - 正如有人建议的那样,阅读一些关于解析的论文。这是最难的部分,但仍然很容易。

评估表达式(给定所有变量的固定值)并打印出一个实际上很容易。更复杂的变换(如差异化和整合)可能具有挑战性,但仍然不是火箭科学。

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

这里我在Abstract Syntax Trees项目中将解析后的数学表达式表示为Symja

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