2016-03-16 43 views
2

我很好奇使用sympy函數編寫程序(如autowrap)來創建一個函數,陣列輸入的正確方法的功能。使用sympy編譯與數組參數

隨着lambdify,我可以做這些的任一個:)

import numpy as np 
import sympy as sp 
x, y, a,b = sp.symbols('x,y,a,b') 
f=a*x**2 + b*y**3 

L1 = sp.lambdify([x,y,a,b],f) 
v1=np.array([1,2]) 
v2=np.array([3,4]) 
L1(*np.concatenate([v1,v2])) 

35

B)

M1=sp.Matrix([x,y]) 
M2=sp.Matrix([a,b]) 
L2 = sp.lambdify([M1,M2],f) 
L2(v1,v2) 

35

大概在引擎蓋下(B)和(A)是一樣的。

但與autowrap我只有選項A據我所知。

from sympy.utilities.autowrap import autowrap 
A1 = autowrap(f,args=[x,y,a,b],backend='cython') 
A1(*np.concatenate([v1,v2])) 

35.0

A2 = autowrap(f,args=[M1,M2],backend='cython') 

CodeGenArgumentListError: ("Argument list didn't specify: a, b, x, y ", [InputArgument(a), InputArgument(b), InputArgument(x), InputArgument(y)])

有沒有辦法做到這一點?我的用例是編譯ODE模擬的dy/dx函數。該函數(比上面的例子要複雜得多)需要採用一組x值和一組參數。現在我正在使用上面的代碼,np.concatenate和python list擴展,如果我剖析代碼,連接實際上需要比計算更多的時間。所以,我很想得到它周圍,並有sympy採取的最後一條語句,並生成C代碼,看起來像

double f(double* M1,double* M2) { 
    return M1[0]*pow(M2[0],2)+M1[1]*pow(M2[1],3) 
} 

想必那麼numpy的陣列可以得到直接傳遞。

這可能嗎?有一個更好的方法嗎?或者我是否在這裏過度/過度優化?

+0

我不是100%肯定,但是這可能是HTTPS的副本: //stackoverflow.com/questions/35430479/convert-sympy-expressions-to-function-of-numpy-arrays。 – asmeurer

+0

您還可能有興趣在https://github.com/sympy/sympy/pull/10640 – asmeurer

+0

你是絕對正確的,這個問題是問同樣的事情。看起來好像沒有完美的解決方案,但我會研究在github線程中鏈接的示例。 –

回答