我无法在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(我正在运行的版本)中失败。
答案 0 :(得分:3)
如果您使用的是Python 2,由于整数除法,1/12
会导致0。您可以使用from __future__ import division
,或使用Python 3(我建议使用Python 3),它将返回一个浮点数。
但是,对SymPy来说,更好的是使用理性。如果您使用Rational(1, 12)
,您将获得准确的结果。通常,如果使用精确数字(有理数),则使用SymPy的答案将更准确,然后使用evalf()
将表达式转换为最后的浮点数。