3

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

  • a*x + b = c
  • a x + b = c x + d
  • 16*x – 9*x = 一个
  • x/16 – x/9 = 一个
  • 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
  • 日志 3*x - 日志 6 = 1
  • 日志 3*x – 日志 6*x^2 = a
  • 2^(x-1) * a = 2^(3*x+1)

我看过,只发现了一些有用的建议。我试图理解这个实现,但没有看到我把算术规则放在哪里。我试图阅读 Sympy 源代码,但我不知道要寻找我正在寻找的东西。我想在 txt 文件中定义某些规则。例如 u - v + v = u 并尝试看看如何将此规则应用于方程。

你们中有人知道我如何设计这个吗?

4

2 回答 2

1

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

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

此外,这里有一个关于antlr的优秀教程,可能会帮助您入门。

于 2011-11-30T23:23:37.380 回答
1

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

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

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

instance Num Polynomial where
    a + b = ...

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

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

对于一个方程,您可以简单地使用元组并为其创建一个新类型:

type Equation = (Polynomial, Polynomial)

为了解决它,可以使用这样的函数:

solve :: Equation -> String -> Polynomial

...其中字符串是变量的名称。

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

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”。

于 2011-12-01T00:39:39.750 回答