2013-08-23 116 views
2

使用mathematica,我可以計算一個函數的數學表示,然後我想用C++進行編碼。代數計算的優化

說我得到的東西,如:

f=Log[2*x+3*y]+Sin[4*x+6*y] 

這顯然是有道理的在這種情況下做了計算:

temp=2*x+3*y 
f=Log[temp]+Sin[2*temp] 

是否有一種方式來獲得,這將減少執行時間的表達/操作次數/表達式大小還是給出更復雜的數學表達式的任何好的度量?

+1

對於像您發佈的一個優化至少,我知道優化編譯器應該爲你做。更復雜的可能是不可能的。 – vroomfondel

+0

@rogaos我知道任何優秀的優化器都會刪除出現在公有子表達式中的常見子表達式,但是大多數優化器確實會通過代數分析來檢測上述代碼中的公共因子嗎? – Barmar

+0

@Barmar啊,我誤解了這個問題。不,我不知道會不會。如果你最初把它寫成2 *(2 * x + 3 * y),它會優化,否則它不會。你可以預先寫一個方法來預測因素......但是這可能會是一個較慢的程序 – vroomfondel

回答

0

雖然它不爲你簡單的例子工作,你可以嘗試在數學以下

Experimental`OptimizeExpression[{Log[(2*x^3 + 3*y)^2] + Sin[2 (2*x^3 + 6*y)^2]}] 

至於導致你

Experimental`OptimizedExpression[ 
Block[{Compile`$3, Compile`$4}, Compile`$3 = x^3; 
    Compile`$4 = 2 Compile`$3; 
    {Log[(Compile`$4 + 3 y)^2] + Sin[2 (Compile`$4 + 6 y)^2]}]]