sympy:不正确的替换结果
sympy: Incorrect substitution results
我无法在 Ipython 笔记本的 sympy 中评估和绘制一个简单(已知)函数:
y(x) = ( F / 6EI )( x^3 - 3Lx^2 ) where:
- 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) = (infinity)x^3 -(infinity)x^2
这显然是不正确的,因为系数应该是有理数——这是很好理解的cantilevered beam deflection equation。它应该评估为:
y(x) = 2E-5*x^3 - 1.8E-4*x^2 where:
- y(x=0) = 0
- y(x=L) = FL^3 / 3EI.
为什么 sympy 会产生这个结果,我该如何修改我的解决方案以获得正确的解决方案?
如评论中所述,上述代码在 Python 3 中正常工作,但在 Python 2.7(我是 运行 的版本)中失败。
如果您使用 Python 2,由于整数除法,1/12
结果为 0。你可以使用from __future__ import division
,或者使用Python3(我推荐使用Python3),它会return一个float。
不过,对于 SymPy,更好的方法是使用有理数。如果你使用 Rational(1, 12)
你会得到一个准确的结果。通常,如果您使用精确数字(有理数),然后在末尾使用 evalf()
将表达式转换为浮点数,您使用 SymPy 的答案会更准确。
我无法在 Ipython 笔记本的 sympy 中评估和绘制一个简单(已知)函数:
y(x) = ( F / 6EI )( x^3 - 3Lx^2 ) where:
- 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) = (infinity)x^3 -(infinity)x^2
这显然是不正确的,因为系数应该是有理数——这是很好理解的cantilevered beam deflection equation。它应该评估为:
y(x) = 2E-5*x^3 - 1.8E-4*x^2 where:
- y(x=0) = 0
- y(x=L) = FL^3 / 3EI.
为什么 sympy 会产生这个结果,我该如何修改我的解决方案以获得正确的解决方案?
如评论中所述,上述代码在 Python 3 中正常工作,但在 Python 2.7(我是 运行 的版本)中失败。
如果您使用 Python 2,由于整数除法,1/12
结果为 0。你可以使用from __future__ import division
,或者使用Python3(我推荐使用Python3),它会return一个float。
不过,对于 SymPy,更好的方法是使用有理数。如果你使用 Rational(1, 12)
你会得到一个准确的结果。通常,如果您使用精确数字(有理数),然后在末尾使用 evalf()
将表达式转换为浮点数,您使用 SymPy 的答案会更准确。