2017-06-19 43 views
1

給定方程取決於未知變量(y)和一組參數。我想用數值方法求解y,給出網格中每個元素的參數值。Python - Sympy - 數值求解網格中多個參數的方程

我嘗試的解決方案的簡化的例子如下(y是未知變量,x是參數):

import numpy as np 
import sympy as sp 
x,y=sp.symbols('x y') 
xgrid=np.arange(1,6) 
f = sp.lambdify(x,sp.nsolve(x**2+y,y,2),"numpy") 
print(f(xgrid)) 

然而,我收到以下錯誤:「預期的一維和數值函數「。我期待在xgrid中爲每個x值接收一個y = -x ** 2的向量。

請注意,實際感興趣的函數不是y = -x ** 2,而是一個非線性函數,它隱含在x中的y中。

我被迫做了一個在網格中的每個值的循環,或者我仍然可以使用lambdify莫名其妙嗎?提前致謝!

回答

1

sympy.lambdify的作用是將符號表達式轉換爲數字表達式。這是沒有意義的「lambdyfing」sympy.nsolve,因爲後者是(默認情況下)數值函數。如果你需要爲sympy.nsolve定義一個「包裝器」功能,你應該使用標準的python方法。

def f(x): 
    y = sp.symbols('y') 
    return float(sp.nsolve(x**2+y,y,2)) 

現在呼籲f(xgrid),其中xfridndarray是沒有意義的函數接受標量參數。你需要寫一個循環。如果你感覺很懶,你可以改用方便的np.vectorize函數,即使只爲標量參數定義函數,該函數也會對ndarrays進行函數計算。但是,請注意,這種方法本質上是循環的縮寫,即它執行完全相同的計算,就像您明確寫入循環一樣。

f = np.vectorize(f) 
f(xgrid) 

array([ -1., -4., -9., -16., -25.])

1

當這行f = sp.lambdify(x, sp.nsolve(x**2+y,y,2),"numpy")正在執行時,第一個python執行sp.nsolve(x**2+y, y, 2)。這是你的代碼的問題,SymPy有一個方程需要解決2個未知數。

+0

謝謝!這是否意味着我被迫對網格中的每個值執行循環,或者我仍然可以使用lambdify? – CarlosH

+0

我會說可悲的循環 – glegoux

+0

謝謝。我編輯了這個問題,看看是否有人可以提出更有效的解決方案。如果從現在起一週內沒有人回覆,我會將您的問題標記爲您解決。再次感謝。 – CarlosH