2009-04-17 13 views
4

式を個々の変数の式に変換するにはどうすればよいですか?私は任意の式を処理できる機能を持っている、と私は、個々の変数の数式をさせていただきたいと思い数式を個々の変数の式に変換するにはどうすればよいですか?

c^2 = a^2 + b^2 

:私のような数学の方程式について考えています。上記の式は次のように生成します:

a = (c^2 - b^2)^0.5 
b = (c^2 - a^2)^0.5 
c = (a^2 + b^2)^0.5 

私もで始めたいと思います:

a = (c^2 - b^2)^0.5 

と出力:

b = (c^2 - a^2)^0.5 
c = (a^2 + b^2)^0.5 

私は式ツリーを見てきましたが、私はこれがどのように機能するかを視覚化するのに問題があります。私は、.NET(C#、VB.NET、またはF#)ソリューションをご希望です。何か案は?

のような何か:

public string[] GetFormulas(string equation) 
{ 
    ... 
} 

感謝。

答えて

6

シンボリック方程式の解法は複雑な問題であり、多くの方程式の閉鎖解はありません。あなた自身のComputer Algebra Systemを書くことは自明ではありませんが、あなたは簡単な方程式のためのプログラムを書くことができます。

入力文字列の式ツリーを構築し、式ツリーを操作するための変換ルールを定義する必要があります。変数を解くためには、 変換規則の複数のアプリケーションによって元のツリーから派生することができる式ツリーのスペース上で検索を実行することができます(実行時間を許容するための良いヒューリスティックによって導かれます)。

0

C^2 = a^2 + b^2はC#の式ではないので、間違ったトラックを表示しています。

.NETの表現ツリーについて忘れて、自分で作成してください。これらの変換を行うために必要なアルゴリズムと、方程式を記述するために必要なデータを記述する必要があります。あなたが目を奪うのは、.NETの式ツリーとはまったく異なります。

1

これはおそらく数学ライブラリを使用して見たいと思うものです。 .NETの場合、Math.NETが最も完全なオプションであると思われます(どれくらい安定しているかわかりませんが、確かに非常に完全です)。シンボリック操作を行うためのライブラリは、あなたがここで提起した特定の問題に対処できる必要があります。

正直言って、これを一から書くのは難しいですが、でもではありません。しかし、表現木に慣れておらず、タスクにアプローチする方法がわからない場合は、数学ライブラリ、Math.NET、またはシンボリックな代数を行うその他の適切なライブラリです。

+1

また、与えられた任意の方程式を単純に並べ替えるのは、実際にそれを解決するよりも簡単です(しかし、それはかなり難しいかもしれません)。複雑な方程式を解きたければ、一般的なMathematicaパッケージのようなものが必要になります。 – Noldorin

+0

最後に、F#のような言語を使用することをお勧めします。もしあなたがそれをよく知っていて、重要なコードをあなた自身(ライブラリを使うのではなく)で書くつもりならば。関数型言語は、数学的および科学的アプリケーションに特によく適していると広く考えられている。 – Noldorin

+0

GPLが原因でMath.NETが動作しません。 –

4

これはあなたが解決しようとしている重要な問題ではありません...私はあなた自身でそれを解決しようと多くの運を持っているとは思わない。それを行うサードパーティ製のアプリやライブラリを探すのがよいでしょう。 MatlabやMapleなど、あなたが話している操作を実行できるプログラムがいくつかあります。また、TI-89のグラフ電卓も使えます。基本的にはMatlabのオープンソース実装である必要なアルゴリズムをOctaveから得ることができます。

1

記号的で非数値的な方法で方程式を扱うことは、間違いなく簡単な作業です。あなたのための最も簡単な方法は、Mathematica、Mapleなどをバックグラウンドで使い、あなたに苦労させることです。

2

あなたの唯一の選択は、すべての既知の技術を適用することによってそれを強制的に強制することです。上記のような単純な代数方程式では、それで十分かもしれませんが、より複雑な問題はますます複雑な解決策を必要とします。簡潔に言えば、それは容易ではありません。

あなたがシンボルにテキストを解析する方法を見つけ出すたら、何について、

c^2 = a^2 + b^2 

c = (a^2 + b^2)^.5 

として置換することができると判断することができるアプリを作成するために十分な簡単なことかもしれませんが、

cos(c) = sin(a^2/b) - b^(a/sin(b)) 

未解決の統合と抽象代数があります。複雑さの線をどこかに描かなければなりません。さもなければ、もう一度Mapleをビルドすることになります。

+0

私は同意します。私が使用する方程式のほとんどは、基本的な代数と基本幾何学です。いくつかのTrig、しかし非常に少し。 –

0

すでに言われていることに加えて、数値的方法を見ることができます。

方程式の解を近似するアルゴリズムがあります。彼らの大部分は正確に解決するのが簡単ではない(または不可能でさえない)からです。

0

一般的に厄介な問題です。低次多項式の場合、これはあまりにも難しいことではありません。線形問題の場合は、パーサと後処理を少し必要とするだけです。しかし、簡単な表現でも、それほど簡単ではありません。たとえば、あなたが他の面でxまたはyのいずれかの解決

x^5 + y^5 - xy + 1 = 0 

で何をしますと、あなたはこれができなくなりますため5の非定数係数多項式の根のために解決しなければならないことを意味します一般的には。

さらに悪いことに、三角関数や特殊関数をミックスに導入すると、完了する前にMathematicaを書き直す必要があります。

関連する問題