6

これは、より「教育的な」質問です。:)

でも、やがてこういうことをしたいと思います。

だから、私が方程式を得たとしましょう。それがばかげていなくて、数学が得意な人間がそれを解くことができれば、どんな種類の方程式でもかまいません。

たとえば...0=(x-1)(x + 2)

または...y=(x ^ 2)、y = 1 / x

または正弦関数など。基本的に、学校で行ったように数学を行います。

問題は、これを解決するためのコンピュータプログラムをどのように書くかということです。MathematicaやMapleなどのプログラムが何十年もこれを行ってきたので、それが可能であることを私は知っています!しかし、単純な方程式ソルバーを作成する方法についての適切なドキュメントは見つかりません。

もちろん、そのようなことは単なるコードスニペットではなく、大きなプログラム全体であるため、「これがまさにあなたのやり方です」という答えは期待していません。

しかし、一般的な概要、またはいくつかの優れたドキュメントへのリンクだけですか?それは素晴らしいことです!ありがとう :)

特に必要なデータ構造とアルゴリズムの種類。

それができない場合は、方程式を解く方法を理解し、それをエンコードする必要があります。しかし、それが正しくなるまでには文字通り数か月かかります(私は以前にこの種のことを行い、自分の思考プロセスをコードに形式化したことがあります。それは機能しますが、遅いです)。

4

4 に答える 4

3

シンボリック操作に関するいくつかの論文を見てください。

Peter Norvig のPAIP book は、記号操作と方程式の解法の非常に単純なシステムを扱っているので、一読の価値があります。最終的にMathematicaの基礎となったMacSymaと呼ばれる AI プログラムの基礎を紹介します。

于 2011-07-17T15:07:01.453 に答える
3

Wolfram Alphaは、最も簡単に利用できるベンチマークです。

入力は文字列であるため、最初のステップは、これらの文字列をトークンに分解し、抽象構文木 (AST) に入れるレクサー/パーサーを作成することです。

これをどの言語で実装したいかは言いませんが、ANTLRを見ることをお勧めします。これは、AST の作成に役立つパーサー ジェネレーターです。方程式の文法を考え出す必要があります。

AST を取得すると、ソルバーはツリーをたどり、より具体的な操作を「+」、「-」などの記号に関連付けます。処理できる演算子が多いほど、ソルバーはより強力で包括的なものになります。

ただし、対処または除外する必要がある多くの複雑さがあります。

  1. すべての方程式に解があるわけではありません。
  2. すべての方程式が閉形式の解を持つわけではありません。
  3. すべての方程式が線形であるとは限りません。
  4. 多くの興味深い問題は、多くの連立方程式で構成されています (線形代数を考えてみてください)。
  5. 閉じた形式がうまくいかないときのために、数値法について多くのことを知る必要があります。

単純な算術演算と多項式から始めて、上に向かっていくことをお勧めします。Stephen Wolfram は Mathematica を 1 日で書き上げたわけではありません.

于 2011-07-17T15:01:41.860 に答える
1

基本的なテクニックは、コンピュータープログラムで数式の構造を表現することです。これはコンパイラが行うことと非常によく似た考え方ですが、コンパイラはほとんどの場合、入力を機械可読形式に変換しますが、コンピュータ代数システムはほとんど入力と同じ形式の出力を生成しますが、興味深い方法で変換します。どちらの場合も、すぐに出力されるのは抽象構文ツリーです。次のステップでは、いくつかのパターン マッチング手法 (正規表現がどのように機能するかに似ています) を適用し、いくつかの機械的な変換を適用して、何らかの有用な方法でツリーを書き換えます。

これが実際にどのように行われるかを知りたい場合は、SymPy はオープン ソースであり、トピックの主にシンボル操作の側面に焦点を当てている Python シンボリック数学ライブラリです。

于 2011-07-17T15:05:42.207 に答える
0

他の人による有用な回答に加えて: このリンクは興味深いようです: http://en.wikipedia.org/wiki/Pattern_matchingまた、「抽象ツリー構文」も興味深いようです。基本的には、構文ツリーで「パターン マッチング」を行うことです。正規表現に似ていますが、コード用です。

私は実際に私自身の「抽象ツリー構文」をすでに書いています:)だから、私はすでにシンボリックマニピュレーターへの道を少し下っています。

于 2011-07-17T22:32:08.573 に答える