2012-08-16 53 views
1

作为我的项目的一部分我一直在用java中的reg-ex来评估算术表达式。使用java解析类似于http://integrals.wolfram.com/index.jsp的写入INTEGRATOR

表达式是这样的:2 + 3/4(5 + 7)

第一我将其修改为这样的:2 + 3/4 *(5 + 7)

并将其转换为后缀

后缀:23457 + */+

我已经采用了在解析的所有令牌的步骤(即整数,操作员打开括号,括号关闭),使用REG-Ex和然后由异排序他们的发生位置。之后,我将这个令牌数组转换为post-fix表达式,然后解决这个表达式,直到这一点,每件事情都正常工作。

现在我想扩展它来求解差分,积分或求解二次方程。

敌人例如:区分或集成的x^2 + 2 * X + 2

类似http://integrals.wolfram.com/index.jsp表达

这可能吗?因为现在我没有任何线索怎么处理呢?

+0

问题是什么?如何计算积分(例如)?如何解析它们? – amit 2012-08-16 07:30:56

+1

嗯,一件事你不应该依靠正则表达式来解析你的表情。如果数字长度超过一位,您刚刚给出的示例将不起作用。你应该定义你的语法,并使用解析器生成工具,如antlr(http://www.antlr.org/) – 2012-08-16 07:32:56

+0

@amit是的,这正是我的问题。 – Dude 2012-08-16 07:34:22

回答

1

我知道的大多数计算器 - 使用numerical analysis计算方程/差分和积分。这使得一个找到接近解决确切的(分析的)解决方案,甚至unsolveable方程有时(这就是我们得到了standard normal table,为unsolveable normal density function

例如,解决积分 - gaussian quardature是很常见并以有效的方式。
为了解决方程 - regula-falsi method是一个简单而直观的一个

+0

计算机代数系统,如Mathematica,可以象征性地求解积分; http://integrals.wolfram.com/是一个很酷的例子。 – 2012-08-16 07:43:11

+0

@JoshRosen:这是一个很好的评论,我的意思不同,但我缺乏用英语表达它的能力。 Mathlab也可以象征性地求解积分。我把第一句话固定为“最” - 我认为这是足够准确的。 – amit 2012-08-16 07:51:02

1

我认为,最完整的计算引擎使用的数值方法,正如阿米特说,但是有计算它象征性的一种方式,但它的启发式比算法的多,它的通过模式匹配完成。我认为Mathematica遵循这种方法。

+0

你可以举一个具体的例子或者任何相同的教程吗? – Dude 2012-08-17 09:04:52

+0

@Batman其实我没有一个具体的教程,但很少有搜索,你可能会找到一个办法,但启发式的方法将需要大量的研究和坚实的数学背景。 – 2012-08-17 11:49:40