3

クラスでは、基本的な方程式ソルバーを行うプロジェクトに割り当てられました。線形方程式を解く必要があります。私が解決できるはずのいくつかの方程式の例:

  • a*x + b = c
  • 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
  • ログ 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 などのデータ型 Polynomial のインスタンスを作成して、数値と同じように多項式を処理できるようにします。

instance Num Polynomial where
    a + b = ...

これらの関数を作成するには、パターン マッチングを簡単に使用できます。

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

方程式の場合、単純に tupel を使用して新しいタイプを作成できます。

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 に答える