4

私はPythonでプログラムを書いていますが、関数(文字列として表現された関数)の派生物を見つける必要があります。

  • 例えば:x^2+3*x
  • その派生物は次のとおりです。2*x+3

利用できるスクリプトはありますか、それとも何か役立つものがありますか?

4

10 に答える 10

6

多項式に制限されている場合(これが当てはまるようです)、基本的に3つのステップがあります。

  1. 入力文字列をx^nの係数のリストに解析します
  2. その係数のリストを取得し、多項式を導出するための規則に従って、それらを新しい係数のリストに変換します。
  3. 導関数の係数のリストを取得し、導関数の多項式関数を説明する素敵な文字列を作成します。

のような多項式を処理する必要がある場合は、係数のリストにa*x^15125 + x^2 + caを使用するdictのが理にかなっているかもしれませんが、このリストを反復処理するときはもう少し注意が必要です。

于 2009-11-22T20:34:58.850 に答える
5

sympyはそれをうまくやってくれます。

于 2009-11-22T20:25:58.577 に答える
4

あなたはすでに提供された答えであなたが探しているものを見つけるかもしれません。ただし、シンボリックデリバティブの計算方法について簡単に説明します。

このビジネスは、演算子のオーバーロードとデリバティブの連鎖律に基づいています。たとえば、の導関数はv^nですn*v^(n-1)dv/dxよね?それで、もしあなたがv=3*xとを持ってn=3いるなら、導関数は何でしょうか?答え:の場合f(x)=(3*x)^3、導関数は次のようになります。

f'(x)=3*(3*x)^2*(d/dx(3*x))=3*(3*x)^2*(3)=3^4*x^2

連鎖律を使用すると、操作を「連鎖」させることができます。個々の導関数は単純であり、複雑さを「連鎖」するだけです。別の例として、の導関数はu*vですv*du/dx+u*dv/dxよね?複雑な関数を取得した場合は、それをチェーンするだけです。

d/dx(x^3*sin(x))
u=x^3; v=sin(x)
du/dx=3*x^2; dv/dx=cos(x)
d/dx=v*du+u*dv

ご覧のとおり、差別化は単純な操作の連鎖にすぎません。

ここで、演算子のオーバーロード。

パーサーを作成できる場合(Pyparsingを試してください)、関数と導関数の両方を評価するようにパーサーに要求できます。私はこれを(Flex / Bisonを使用して)楽しみのために行いましたが、非常に強力です。アイデアを得るために、対応する演算子をオーバーロードし、連鎖律を再帰的に適用することで導関数が再帰的に計算されるため、の評価は"*"関数値と導関数値のu * vに対応しu*der(v)+v*der(u)ます(C ++で試してみてください)。また楽しい)。

さて、あなたはあなた自身のパーサーを書くつもりはないことを私は知っています-必ず既存のコードを使用してください(FortranとC / C ++コードの自動区別についてはwww.autodiff.orgをご覧ください)。しかし、このようなものがどのように機能するかを知ることは常に興味深いことです。

乾杯、

ファン

于 2009-11-25T08:10:54.587 に答える
3

シンボリック微分は主題への印象的な紹介です-少なくとも私のような非専門家にとっては:)コードはC++で書かれています。

于 2009-11-22T20:59:52.117 に答える
3

遅くなるよりはましですか?

私は常に、構文解析ツリーを使用して、どの言語でもシンボリック微分を行ってきました。しかし、最近、複素数を使用する別の方法にも気づきました。

ツリー解析アプローチは、次の小さなLispコードを好きな言語に翻訳することで構成されています。

(defun diff (s x)(cond
  ((eq s x) 1)
  ((atom s) 0)
  ((or (eq (car s) '+)(eq (car s) '-))(list (car s)
    (diff (cadr s) x)
    (diff (caddr s) x)
    ))
  ; ... and so on for multiplication, division, and basic functions
  ))

そしてそれに続いて適切な単純化を行うので、0の加算、1の乗算などを取り除くことができます。

しかし、複雑な方法は完全に数値的ですが、特定の魔法の性質を持っています。計算Fを倍精度でプログラミングする代わりに、倍精度複素数でプログラミングします。次に、変数Xに関する計算の導関数が必要な場合は、Xの虚数部を1e-100のように非常に小さい数hに設定します。次に、計算を実行して結果Rを取得します。これで、real(R)が通常取得する結果になり、imag(R)/ h = dF/dXの精度が非常に高くなります。

それはどのように機能しますか?複素数を乗算する場合を考えてみましょう。

(a+bi)(c+di) = ac + i(ad+bc) - bd

ここで、に関する導関数が必要な場合を除いて、虚数部がすべてゼロであると仮定しますab非常に少ない数に設定しましたh。今、私たちは何を得るのですか?

(a+hi)(c) = ac + hci

したがって、これの実数部はac、ご想像のとおりであり、虚数部を、で割ったものhは、です。これは、に関するcの導関数です。aca

同じ種類の推論がすべての微分法則に当てはまるようです。

于 2016-05-17T20:08:47.423 に答える
2

自動微分を調べます。Python用のツールがあります。また、これ

于 2009-11-22T21:51:21.790 に答える
1

他のライブラリをヘルプとして利用せずに、微分プログラムを最初から作成することを考えている場合は、ブログで説明した代数方程式の導関数を計算するアルゴリズム/アプローチが役立ちます。

于 2017-05-23T05:58:01.603 に答える
0

制限を厳密に表すクラスを作成してみて、xがaに近づくにつれて(f(x)-f(a))/(xa)について評価することができます。これにより、制限のかなり正確な値が得られるはずです。

于 2014-11-26T04:13:22.553 に答える
0

文字列を入力として使用している場合は、区切り文字として+または--charを使用して個々の用語を区切ることができます。これにより、個々の用語が得られます。これで、べき乗則を使用して各項を解くことができます。たとえば、べき乗則を使用すると3x^2が得られるx^3があるとします。または、a /(x ^ 3)やa(x^ -3)、ここでも他の変数を定数として選び出すことができ、x ^ -3を解くと、-3a /(x ^ 2)が得られます。べき乗則だけで十分ですが、因数分解を広範囲に使用する必要があります。

于 2021-01-31T08:59:36.637 に答える
-2

関数と式を解析して処理する必要があるため、ライブラリの派生がすでに作成されていない限り、非常に複雑です。

機械的でアルゴリズム的に実行できるため、それ自体を導出するのは簡単な作業ですが、関数を格納するには基本的な構造が必要です。

于 2009-11-22T20:27:10.050 に答える