我无法评估和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