2

ライブラリを使用して、次のMathNet.Symbolicsような代数式を単純化しています

string f = Infix.Print(Infix.ParseOrThrow("L+H+L+H"))

そして、私は正しく取得しますf="2*L+2*H"

これらの式のうち2つを減算する必要がある場合、私の問題が発生します。

string f = Infix.Print(Infix.ParseOrThrow("L+H+L+H - (L+H)"))

そして、ここで私はf="2*L+2*H - (L+H)"代わりに(L+H)

正しい単純化を行うにはどうすればよいですか?

4

1 に答える 1

2

Math.NET シンボリックは、非正規化された形式が存在することさえできないように、式を作成するときに常に自動単純化を適用します。これは、代数アルゴリズムの複雑さを低く抑えるために不可欠ですが、意図的に非常に制限されています。これは実際には用語の正規化であり、単純化ではありません。

2*H + 2*L - (H + L)は技術的には正規化/自動簡略化された形式ですが、Infix.PrintStrictこれはかなり読みにくいですが、式が内部でどのように表現されているかを正確に示しています2*H + 2*L + (-1)*(H + L)

このような式を操作および単純化するために使用できる代数ルーチンがかなりあります。この場合、単純な代数展開がうまくいきます。

var e1 = Infix.ParseOrThrow("L+H+L+H");
var e2 = Infix.ParseOrThrow("L+H");
var e3 = e1 - e2;
// or: var e3 = Infix.ParseOrThrow("L+H+L+H - (L+H)");

var expanded = Algebraic.Expand(e3);
Infix.Print(expanded); // prints "H + L"
于 2015-07-31T07:05:13.773 に答える