sympy:替换结果不正确

时间:2016-09-15 20:03:50

标签: python-2.x sympy substitution symbolic-math

我无法在Ipython笔记本中评估和绘制简单(已知)函数:

  

y(x)=(F / 6EI)(x ^ 3 - 3Lx ^ 2)其中:

     
      
  • F = 10 ^ 6
  •   
  • E = 200E9
  •   
  • I =(1/12)(0.5 * 1 ^ 3)
  •   
  • L = 3
  •   

我使用symbols()定义表达式并替换已知值(使用subs())。

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(我正在运行的版本)中失败。

1 个答案:

答案 0 :(得分:3)

如果您使用的是Python 2,由于整数除法,1/12会导致0。您可以使用from __future__ import division,或使用Python 3(我建议使用Python 3),它将返回一个浮点数。

但是,对SymPy来说,更好的是使用理性。如果您使用Rational(1, 12),您将获得准确的结果。通常,如果使用精确数字(有理数),则使用SymPy的答案将更准确,然后使用evalf()将表达式转换为最后的浮点数。