簡體   English   中英

sympy:錯誤的替換結果

[英]sympy: Incorrect substitution results

我無法在Ipython Notebook中的sympy中評估和繪制一個簡單的(已知)函數:

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

  • F = 10 ^ 6
  • E = 200E9
  • 我=(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

這顯然是不正確的,因為系數應該是有理數-這是眾所周知的懸臂梁偏轉方程 它應該評估為:

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

如果您使用的是Python 2,則由於整數除法, 1/12結果為0。 您可以使用from __future__ import division ,也可以使用Python 3(我建議使用Python 3),它將返回浮點數。

不過,對於SymPy而言,更好的方法是使用理性。 如果使用Rational(1, 12)您將獲得准確的結果。 通常,如果使用精確數字(有理數),然后使用evalf()將表達式最后轉換為浮點數,則SymPy的答案將更加准確。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM