2009-05-20 13 views
3

私は、デリバティブを計算するために、このコードを持っていますか? PAIPから式の簡素化

代わりのx + x代わりx * x2x

を示しx^2

+0

多くの具体的で簡単な実装ルールを含む素敵な要約については、「計算の歴史とコンピュータ代数システムの開発」を参照してください。関連する章は次のとおりです。http://www.math.wpi.edu/IQP/BVCalcHist/calc5.html#_Toc407004393 – dsg

答えて

0

を示しおそらくthis codeは有用であろう。これはCommon Lispです。これはSchemeに非常によく似ています。エントリポイントはsimp関数です。

this fileも使用しています。

ヒストリカルノート:関連PAIPの章は、1960年代にMITで開発されたMacsymaというコンピュータ代数システムを指し、Mathematica、Maple(現在のMatlab)などのツールの基礎となっていました。

0

ここでスタートだ:

変更(define (diff x expr) ...)から(define (simp expr) ...)ような何かにあなたの導関数。 x + x場合の

(case (car expr) 
    ((+) (if (equal u v) ; check for identical subexpressions 
     `(* ,(simp u) 2) ; if u==v, simplify 2u 
     `(+ ,(simp u) ,(simp v)))) 
    ...) 

ような何かをx * x場合は類似していなければなりません。さまざまな簡略化が必要な場合は、ifcondに変換することをおすすめします。

これは完全に解決するのは難しい問題であり、elibenが提供するリンクは見ておく価値があります。

3

代数式の簡略化は、特に派生物の計算と比較すると非常に困難です。簡略化は再帰的に行う必要があります。最も内側の式を最初に簡略化します。一度にあまり試してはいけません。私は、最も基本的な単純化だけ例えばで開始したい:

0 + x -> x 
0 * x -> 0 
1 * x -> x 
x^0 -> 1 
x^1 -> x 

これは単純化として見ていないかもしれないが、それはあなたのコードを簡素化します乗算

x - y -> x + (-1)*x 
x/y -> x^(-1) 

により加算と除算減算を交換してください。最後にこのステップをいつでも元に戻すことができます。

次に、結合性と可換性を使用して用語をソートします。

(x * y) * z -> x * (y * z) 
x * 2 -> 2 * x 
2 * (x * 3) -> 2 * (3 * x) 

簡素化指数

(x^y)^z -> x^(y * z) 

は、数値を簡素化(それはアルファベットである必要はありませんが、それは常に同じである必要があります)いくつかの事前定義された順序で変数をソートし、左側に数値を移動します部品。

2 * (3 * x) -> 6 * x 
2 + (3 + x) -> 5 + x 

これを済ませたら、一般的な表現を収集することができます。

0

一般的な問題は難しいですが、キー(変数名)から係数までの有限マップとして表される積和の正規形では、長い道のりを得ることができます。この形式は、線形方程式と線形解法に最適であり、多大なトラブルを伴わずに乗算と累乗に拡張することができます。このフォームで算術演算に "スマートコンストラクタ"を定義すると、妥当なシンボリックな微分と方程式の解法が得られます。

これは簡単なハックですが、いくつかのアプリケーションで使用しました。それはいくつか働いていました。数回それは十分ではなかった。より深刻なことに対して、あなたは長年の仕事を話しています。

コード例が必要な場合は、one of my equation solversを参照してください。

+0

面白いですね。あなたは.pdfのような論文を持っていますか? – Accipitridae