9

特定の変数を解くために使用する必要があるかなり大きな方程式がありました。そこで、特定の変数に関して方程式を書き換えることができるオンライン ツールを使用しました。それは私に巨大な700文字の方程式を与えました. 私はそれをテストしましたが、うまくいきます。

代わりに一時変数として保存できる値を再計算している方程式には、かなり明白な冗長性がいくつか見られます。方程式全体を調べて自分で最適化することもできますが、これをさらに多くの方程式で行う必要がある可能性が高いため、代わりにプロセスを自動化したいと考えています。

数学的冗長性を最適化するのに役立つ優れたツールは何ですか?
(これは個人的なプロジェクトのためのものなので、私は本当に無料のものを望んでいます)

これが本当に必要なのかどうか、私が知っているすべての人に尋ねます。これはパフォーマンスが重要なコードであり、私の経験から、AS3 コンパイラはこの種の最適化を単独では行いません。冗長性をなくすと、コードが読みやすくなります。

4

4 に答える 4

10

編集>式は700から20文字以下に縮小されました

Wolfram Alpha または Mathematica で FullSimplify を使用してみてください。

WolframAlpha FullSimplify(x^2+2 x +1)

編集 ->

もう一度考えてみると、Mathematica はそれを解くために 1 つの var 方程式を単純化する必要はありません... Solve コマンド (または FindRoot、または FindInstance など) がそれを行います。

たとえば、試してみてください

WolframAlpha Solve(x^2+2*x+1=0 , x)

編集 -> ideone.com からの依存関係をなくすために、単純化した後の 700 文字の式は次のようになります。

   t= -((E*A+B*F+ Sqrt(2*A*E*F*B+ A^2*(I^2-F^2) + B^2*(I^2-E^2))) /(A^2 + B^2))

どこ

   E = e - g
   A = a - c
   B = b - d
   F = f - h
   I = i + j

他の「幾何学的な」考慮事項に基づいて、Sqrt引数が完全な正方形であるかどうかを確認してください...吠え、尻尾があります...犬ですか?

編集 ->当て推量:

証拠はありませんが、方程式の対称性は、あなたの問題で

  E^2 = (I^2-F^2)  => (e-g)^2 = (i+j)^2 - (f-h)^2

その場合 (確認してください)、式は次のようになります。

  t= -((E*A+B*F+ Abs(E*A+B*F)) /(A^2 + B^2))

A E+B F > 0 の場合 (t===0 でない場合は、そうであると思います)

  +-----------------------------------+
  ¦  Your 700 chars equation comes to ¦
  ¦                                   ¦
  ¦ t= -2 * (A*E + B*F) / (A^2 + B^2) ¦
  ¦                                   ¦
  +-----------------------------------+

短くて甘い... :)

于 2010-06-25T00:34:58.227 に答える
5

私は使用しましwxMaximaた。置換を行うのはかなり簡単で、無料です。部分分数展開を使用して、大量のラプラス変換をクランクする必要がありました。使い方を学んだら、あっという間でした。

于 2010-06-25T13:15:34.110 に答える
3

Maxima には と呼ばれる便利な関数がありますoptimize:

関数: 最適化 (expr)

expr と同じ値と副作用を生成する式を返しますが、一般的な部分式の再計算を避けることでより効率的に生成します。また、optimize には、すべての共通部分式が共有されるように、その引数を「折りたたむ」という副作用もあります。例の例を実行 (最適化) します。

これにより、Ideone にアップロードした式が次のように簡素化されます。

block(
[%1,%2,%3,%4,%5,%6,%7,%8,%9,%10,%11,%12,%13,%14],
  %1:a^2,
  %2:b^2,
  %3:c^2,
  %4:d^2,
  %5:-%4+2*b*d-%2,
  %6:-%3+2*a*c-%1,
  %7:2*a-2*c,
  %8:2*c-2*a,
  %9:
  %8*d+b*%7,
  %10:%7*d+b*%8,
  %11:i^2,
  %12:j^2,
  %13:-2*%12-4*i*j-2*%11,
  %14:%12+2*i*j+%11,(-sqrt(%4*%14+%3*%14+%2*%14+%1*%14+b*d*%13+a*c*%13+%6*h^2+    (%9*g+2*%3-4*a*c+2*%1)*f+%10*e)*h+%5*g^2+f*(%10*g+%9*e)+(2*%4-4*b*d+2*%2)*e*g+%6*f^2+%5*e^2)-(d-b)*h-(c-a)*g-(b-d)*f-(a-)*e)/(%4-2*b*d+%3-2*a*c+%2+%1))

必ずしも読みやすくはありませんが、一般的な部分式は含まれていません。

于 2010-06-25T13:59:54.627 に答える
2

ベリサリウスが示唆したように、方程式をmatlab、mathematica、mapleなどの数学的プログラミング言語に入れると、それらの単純化ツールと簡約ツールを使用できるようになります。

matlab ライセンスに高額​​な費用を払いたくない場合は、無料の matlab のようなプログラムのリストhttp://www.dspguru.com/dsp/links/matlab-clonesをご覧ください。

于 2010-06-25T00:40:19.213 に答える