设计符号方程求解器

时间:2011-11-30 23:10:40

标签: java equation solver symbolic-math

对于一个班级,我被分配到一个项目来做一个基本的方程求解器。它需要求解线性方程。例如。我应该能够解决的一些方程式:

  • a * x + b = c
  • a x + b = c x + d
  • 16 * x - 9 * x = a
  • x / 16 - x / 9 = a
  • 8 *(x + 3)-5 *(x + 4)= 12
  • x ^ 2 + 2 * x + 1 = 0
  • (x + 1)*(x-1)= 0
  • (x + 1)(x - 1)= 2 (x-1)
  • x - 2 * sqrt(x)+ 1 = 0
  • log 3 * x - log 6 = 1
  • log 3 * x - log 6 * x ^ 2 = a
  • 2 ^(x-1)* a = 2 ^(3 * x + 1)

我看过,只发现了一些有用的建议。我试图了解this implementation,但未能看到我放置算术规则的位置。我试图阅读Sympy源代码,但我不知道是不是要寻找我想要的东西。我想过在txt文件中定义某些规则。例如,u - v + v = u并尝试了解如何将此规则应用于方程式。

你们有没有想过我怎么设计这个?

2 个答案:

答案 0 :(得分:1)

您可以选择编写自己的数学表达式解析器/解释器或使用现有的数学表达式解析器。 Jep是开源数学表达式解析器的一个很好的例子。

否则,如果您想知道编译器和语法分析器在幕后做什么,那么您可以使用jFlex and CUP编写自己的表达式解析器

另外,here是关于antlr的优秀教程,可能有助于您入门。

答案 1 :(得分:1)

首先,您应该考虑如何为此目的声明方程(或多项式)。例如,您可以定义

data Polynomial = Polynomial [Polynomial]
   | Sum Polynomial Polynomial
   | Ln Polynomial
   | Log10 Polynomial Polynomial
   | Var String -- a named Variable
   | ...

为了轻松处理多项式,您可以为Eq,Ord,Num等数据类型Polynomial创建实例,这样就可以处理多项式,就像数字一样。

instance Num Polynomial where
    a + b = ...

要创建这些功能,您可以轻松使用模式匹配:

(Sum a b) + (Sum c d) = Sum (Sum a b) (Sum c d)

对于一个等式,你可以简单地使用tupels并为它创建一个新类型:

type Equation = (Polynomial, Polynomial)

为了解决这个问题,可以使用这样的函数:

solve :: Equation -> String -> Polynomial

...其中String是变量的名称。

解决不仅需要做真正的工作。同样,对于这种模式匹配可以用于第一步:

solve ((Sum (Var a) b, e) x -- solves polynomials of type a + b = c + d
    | a == x = Sum e (negate b)
    | ...

当然这是非常基本的,你可以通过使用例如标准化来减少可能情况的数量来更聪明地做到这一点。将“a + a + a”组合成“3 * a”。