我無法評估和IPython的筆記本內sympy繪製一個簡單的(已知)函數:sympy:不正確的替換導致
Y(X)=(F/6EI)(X^3 - 3LX^2)其中:
- F = 10^6
- E = 200E9
- I =(1/12)(0.5 * 1^3)
- L = 3
我定義(使用subs()
)使用symbols()
和替代已知的值表達。
import sympy
from sympy import symbols
sympy.init_printing()
from IPython.display import Math, Image
from IPython.display import display
F, E, L, I, x = symbols('F, E, L, I, x') #Definition of sympy symbols
y = F/(6*E*I) * (x**3 - 3*L*x**2) #Define beam deflection equation
display(Math("y=" + latex(y)))
y = y.subs({F:10**6, E:200E9, L:3, I:(1/12)*(0.5)*(1**3)}) #Substitute known values to define specific deflection curve
display(Math("y=" + latex(y)))
然而,它導致:
Y(X)=(無窮大)的x^3 - (無窮大)的x^2
這是顯然是不正確的,因爲係數應該是有理數 - 這是很好理解的cantilevered beam deflection equation。它應評估爲:
Y(X)= 2E-5 * X^3 - 1.8E-4 * X^2其中:
- Y(X = 0)= 0
- y(x = L)= FL^3/3EI。
爲什麼sympy產生這樣的結果,我該如何修改我的解決方案,以達到正確的解決方案?
正如評論指出的,上面的代碼工作正常的Python 3,但在Python 2.7(我運行的版本)失敗。
當我運行你的代碼時,數量'y'(在'subs'之前和之後)是正確的。也許問題是顯示功能(你不提供,我不能重現) – Stelios
@Stelios感謝您的關注。 'display()'函數從Ipython導入 - Ive編輯以反映這一點。然而,我仍然得到相同的結果,而不使用'display()':你用'print y'? – theNamesCross
是的,'print(y)'(Python 3)給出了預期的結果。 *然而*,在Python 2中,'print y'給出了「無窮大」的結果! – Stelios