2016-09-15 63 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()将表达式转换为最终的浮点数。