6

単純な記号代数式を再配置するための簡単なアルゴリズムがあるかどうか知りたいです。理想的には、左側の1つの変数だけでそのような式を書き直せるようにしたいと思います。たとえば、次の入力があります。

m = (x + y) / 2

...との観点から、xまたはとの観点から質問して、これらを取得できるようにしたいと思います。myyxm

x = 2*m - y
y = 2*m - x

もちろん、私たちは皆、このアルゴリズムを何年にもわたって紙の上で行ってきました。でも、名前はあるのかしら。簡単そうに見えますが、誰かがすでにさまざまな「落とし穴」をカタログ化していると、生活が楽になります。

私の目的では、二次方程式を処理するためにそれは必要ありません。

(そして、はい、CASシステムはこれを行います、そしてはい、私はそれらをライブラリとして使用できることを知っています。私のアプリケーションでそのような依存関係を避けたいです。この問題に取り組むための名前付きアルゴリズムがあるかどうかを本当に知りたいです。 。)

4

4 に答える 4

2

あなたが興味を持っているのは、連立一次方程式を維持し、いつでも、他のすべての変数に関して1つの変数を解くことができるようです。関係を行列としてエンコードする場合、行列をいくつかの適切な形式(たとえば、縮小された行階段形式)に縮小して、変数間の「最も単純な」依存関係を取得できるようです(「最も単純な」のいくつかの適切な定義の場合)。 ")このようなデータを取得したら、問題の変数のエントリがゼロ以外の行を調べ、変数が係数1になるように正規化するだけで、すべての依存関係を読み取ることができるはずです。

注-一般に、変数ごとに一意の解が得られるとは限りません。たとえば、自明な方程式が与えられた場合

x = y
x = z

次に、zを解くと、必要な単純化の程度に応じて、「z=x」または「z=y」のいずれかが得られます。または、次のような設定で

x = 2y + 3w
x = 9z

xの値を返すと、式、または2を超えるそれらの合計、あるいはすべて技術的には正しいが必ずしも有用ではない他の多くのものが返される可能性があります。これをどのように処理するかはわかりませんが、方程式の形式によっては、おそらくそれを処理する方法を見つけることができます。

于 2011-01-02T09:29:17.543 に答える
2

必要なのは方程式を解くアルゴリズムです。しかし、これは大きなトピックだと思います。一般的に、次のような場合があります。

  • 連立方程式
  • 方程式は非線形である可能性があるため、方程式の因数分解などの追加のアルゴリズムが必要です。
  • 関数を逆にする方法の知識が必要です。たとえば、=> sin(x) + 10 = z、xを解くと、arcsin()であるsin()が逆になります。(すべての機能が元に戻せるわけではありません!)
  • sin(x)+x=y最後に、xを解くなど、一部の方程式はCASでも解くことが難しい場合があります 。

難しい答えは-あなたの最善の策はいくつかのCASのソースコードを取ることです-例えば、LISPで書かれたMAXIMACASソースコードを見ることができます。そして、方程式の解法を担当するコードを見つけます。

簡単な答え-必要なのが線形で基本的な演算子+-*/のみで構成される方程式を解くことだけである場合。次に、答えはすでにわかっています-古き良き紙の方法を使用してください-紙に使用したルールを考えて、方程式の文字列を操作するシンボリックアルゴリズムとしてこれらのルールを書き直してください。

幸運を !

于 2011-01-02T21:12:45.097 に答える
1

式を逆ポーランド記法のデータ構造(ツリー)に変換します。ツリーはノードで構成されており、各ノードには左右の操作があります。左右のそれぞれは、シンボル(例:「x」)または別のノードにすることができます。例えば:

(x + (a + b))

になります:

(+ x (+ a b))

またはJSONの場合:

["+", "x", ["+", "a", "b"]]

元の式m = (x + y) / 2は次のようになります。

m = ["/", ["+", "x", "y"], "2"]

必要な式の1つ(xを解く)は次のようになります。

x = ["-", ["*", "m", "2"], "y"]

式のツリーが裏返しになっていて、各演算子が逆になっていることがわかりますか?「-」は「+」の逆で、「/」の逆である「*」をラップします。:

["+", "x", "y"]

になる:

["-", (something), "y"]

ここで、(何か)は再帰的に外部表現の反転です。プロセスを説明するには、次のようにします。a)解決したいシンボルを含むノードが見つかるまで式ツリーを再帰的に降ろします。b)このノード操作の逆を含む新しいノードを作成します。c)必要なシンボルを置き換えます。逆の外側の表現で解決し、外側に戻るときにこれを再帰的に実行します。

于 2021-03-03T23:04:53.197 に答える
0

初期方程式を修正する簡単な方法はいくつかあります。正しい修正を正しい順序で実行すると、正しい解が得られます。では、これを検索やパスファインディングの問題と見なしてはどうでしょうか。

于 2011-09-05T12:33:30.487 に答える