我试图设计一种将数学方程表示为Java对象的方法。这是我到目前为止所提出的:
- 扩展 Term 的对象会包含 TrigTerm 等内容来表示三角函数。
公式
总体思路是我能够以编程方式操纵方程式(例如,一个能够返回方程式的方向式方法,这个方程式是它所要求的方程式的导数,或者是一种评估方程式的评估方法对于某个等于某个值的变量)。
我对简单方程式的效果很好:
这只是两个 Term :一个带有变量“x”和一个指数“2”,另一个带有一个常数“3”。
但对于更复杂的方程式而言并非如此:
是的,这是一个可怕的例子,但我只是说明一点。
现在问题是:将数学方程表示为Java对象的最佳方法是什么?是否有任何库已经这样做了?
答案 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[]
规则来实现衍生函数。