1

式の導関数を表す新しいツリーを返すメソッドを実装しようとしています。元の表現ツリーと、正確なコピーを自由に使用できます。ノードが定数または数値である場合の微分ルールと基本ケースを使用して、これを再帰的に実行できることを私は知っています。しかし、新しい式を保存する方法に頭を悩ませています。

正確な答えは必要ありません。新しい式を保存する方法についてのガイダンス/推奨事項だけですか?

図は役に立ちます、ありがとう!私はそこに着いていますが、まだ作業コードの実装に問題があります.

  if(this.getValue().equals("mult")){
        this.deepCopy().setValue("add");
        this.deepCopy().getRightChild().setValue("mult");
        this.deepCopy().getLeftChild().setValue("mult");
        // not sure what to recursively here!

        }
4

2 に答える 2

0

明白な答えは、数式の記号操作用に設計された言語を使用することです。ヒント: 1960 年より前に始まった、4 文字の単語です。

ちょっとこれをチェックしてください、この分野にはいくつかの新しいテクニックがあるようです: http://www.autodiff.org/

http://www.cs.berkeley.edu/~fateman/papers/ADIL.pdf

于 2012-03-16T23:49:44.533 に答える
0

基本的には、元のツリーのルートから開始し、必要に応じてノードの導関数を計算しながら下に向かって作業します。たとえば、D fg = f'g+fg' であるため、乗算ノードの場合、積の合計を出力します。

           ....                   ....
             \                      \
              *                      +
             / \           ->       / \
            F   G                  *   *
                                  / \ / \
                                 F' G F G'

どこから F' と G' を取得しますか? そこで再帰の出番です。

更新:原則として、それほど遠くないので、乗算のサブツリーを入力するだけです:

Node right = this.deepCopy().getRightChild();
Node left = this.deepCopy().getLeftChild();
right.setLeftChild(derivative(this.getLeftChild()))   // F'
right.setRightChild(this.getRightChild()))            // G
left.setLeftChild(this.getLeftChild())                // F
left.setRightChild(derivative(this.getRightChild()))) // G'

APIは少し奇妙に見えると言わざるを得ませんが。deepCopy常に同じオブジェクトを返しますか? その名前は、毎回新しいコピーを作成することを示唆しています。

于 2012-03-17T00:26:10.113 に答える