2016-09-15 67 views
2

我無法評估和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(我運行的版本)失敗。

+0

當我運行你的代碼時,數量'y'(在'subs'之前和之後)是正確的。也許問題是顯示功能(你不提供,我不能重現) – Stelios

+0

@Stelios感謝您的關注。 'display()'函數從Ipython導入 - Ive編輯以反映這一點。然而,我仍然得到相同的結果,而不使用'display()':你用'print y'? – theNamesCross

+0

是的,'print(y)'(Python 3)給出了預期的結果。 *然而*,在Python 2中,'print y'給出了「無窮大」的結果! – Stelios

回答

3

如果您使用的是Python 2,1/12結果爲0,由於整數除法。你可以使用from __future__ import division,或者使用Python 3(我推薦使用Python 3),它會返回一個浮點數。

儘管如此,SymPy更好的是使用理性。如果你使用Rational(1, 12),你會得到一個確切的結果。一般來說,如果使用精確數字(有理數),使用SymPy的答案將會更加準確,然後使用evalf()將表達式轉換爲最終的浮點數。