簡體   English   中英

派生表達式樹Java

[英]Derivative expression tree java

我正在嘗試實現一種方法,該方法返回表示表達式派生的新樹。 我有原始的表達樹,以及可供使用的確切副本。 我知道我可以遞歸使用微分規則和基本情況(當節點是常數或數字時)。 但是我在如何存儲新表達式方面遇到了麻煩。

我不需要確切的答案,只需要有關如何存儲新表達式的一些指導/建議?

該圖很有幫助,謝謝! 我到了那里,但是仍然無法實現工作代碼。

  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!

        }

顯而易見的答案是使用一種專門用於公式的符號操作的語言。 提示:它始於1960年,是四個字母的單詞。

嘿,看看這個,看來這方面有一些新技術: http : //www.autodiff.org/

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

基本上,您從原始樹的根部開始,一直向下移動,並在必要時計算節點的導數。 例如,由於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是否總是返回相同的對象? 它的名字表明它每次都會制作一個新副本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM