[英]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/
基本上,您從原始樹的根部開始,一直向下移動,並在必要時計算節點的導數。 例如,由於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.