2017-06-20 52 views
1

首先,我不完全確定這是正確的stackexchange社區。我也發佈了數學論壇,我認爲它應該沒問題,因爲看着這個問題的人應該對溢出與數學有不同的觀點,但是告訴我,如果這是不好的,我會刪除其中一個帖子:減少用Sympy評估一系列公式的計算負擔

https://math.stackexchange.com/questions/2330004/reducing-the-computational-burden-in-evaluating-a-series-of-formula

我有一系列式(其中許多是,通常爲100),我從與CAS(Python的Sympy)計算得到的。這些公式將被轉換爲C++,並且應該在微控制器上進行有效評估。執行許多計算來評估每個公式在不同公式之間是多餘的。有沒有辦法通過Sympy中的算法找到'最優'或至少'合理'的方法來對計算進行分組,從而減少要執行的操作的數量,並以系統的方式進行操作?或者我應該讓編譯器這樣做(但有很多公式...)?

例如,如果許多式包括術語

$ \ COS \左(\壓裂{DT} {2} \ SQRT {w_x^2 + w_y^2 + w_z^2} \右)$

,我應該首先計算它並將其存儲在一個變量中,讓我們說$ cn $,並使用$ cn $進行後續評估。當然,我可以通過代碼來完成這項工作,但這並不是真正的可擴展性,絕對'醜陋',並且可能不是最優的。理論上來說,我認爲一個「完美」的C++編譯器應該能夠完成這項任務,但是我想如果這些方程很多並且足夠複雜,它將無法接近最佳狀態。

編輯:我當然知道使用sympy簡單的簡化,例如http://docs.sympy.org/latest/modules/simplify/simplify.html#module-sympy.simplify.cse_main或比化,簡化等。這裏的困難是,我想「十字」幾個方程之間的簡化。

+0

它看起來就像你有錯誤的假設,C++編譯器只是能神奇地優化你的東西,因爲它是一個低層次的語言什麼的。 – VTT

+0

@VTT:我不這麼認爲。我知道C++編譯器可以在某種程度上優化代碼[inling函數,識別代碼/公式的重複代碼,一次執行計算以及多次使用,就像我在這裏等等],這就是爲什麼我說'完美'編譯器應該是能夠做到這一點。但我知道編譯器並不完美,因此我想在Sympy中進行優化。所以我想在Sympy中優化的事實實際上是因爲我不認爲編譯器可以做魔法;) – Zorglub29

回答

2

cse能夠接受表達式列表並給出在所有表達式中出現的公共子表達式。

>>> cse([x**2+1, exp(x**2+1), 1/(x**2 + 1)]) 
([(x0,x2+1)],[x0,exp(x0),1/x0]) 
+0

這真的很好。我的糟糕之處在於,我之前曾經用過單一表達方式的cse,並且應該通過文檔再次閱讀更多細節。 – Zorglub29