[英]odeint -(TypeError: can't convert expression to float ) - Importing expression into a function to perform odeint
這是我得到的錯誤
Traceback (most recent call last):
File "C:\Users\user\.spyder-py3\Numerical Methods Problems\FreeFall.py", line 40, in <module>
ans=odeint(vel,0,t)
File "C:\ProgramData\Anaconda3\lib\site-packages\scipy\integrate\odepack.py", line 245, in odeint
int(bool(tfirst)))
File "C:\ProgramData\Anaconda3\lib\site-packages\sympy\core\expr.py", line 325, in __float__
raise TypeError("can't convert expression to float")
TypeError: can't convert expression to float
這是我的代碼-我對編碼很陌生,並且正在學習將其用於數值計算:
from scipy.integrate import odeint
from sympy import *
import numpy as np
import math
def diff_cd(re_no):
Re=Symbol('Re')
expr=(24/Re)+(6/(1+(Re**0.5)))+0.4
ans=diff(expr,Re).subs(Re,re_no)
return ans
def diff_re(k,u_no):
u=Symbol('u')
expr=k*u
ans=diff(expr,u).subs(u,u_no)
return ans
ans = [diff_cd(20),diff_re(11,15)]
rhog=1.2
mug=1.872*(10**(-5))
a=0.3
u=Symbol('u')
pi=math.pi
k=(2*rhog*a/mug)
Re=k*u
p1=(rhog*pi*(a**2)*u*Re*((24/Re)+(6/(1+(Re**0.5)))+0.4))+(0.5*rhog*pi*(a**2)*(u**2)*diff_cd(Re)*diff_re(k,u))
ansfu=p1*(-1/24)
def vel(y,t):
dudt = ansfu
return dudt
t=np.linspace(1,100,100)
ans=odeint(vel,0,t)
print(ans)
我只需要在沒有這個錯誤的情況下得到答案。 還有一種方法可以在單個 function 中完成所有這些操作
如果我在ode
調用之前添加一個print(vel(0,0))
我得到
-271.868595022194*u**2*(-3.97723522060237e-7*u**(-0.5)/(u**0.5 +
0.00509901951359279)**2 - 1.6224e-8/u**2) -
543.737190044387*u**2*(0.4 + 6/(196.116135138184*u**0.5 + 1) + 0.000624/u)
也就是說,一個sympy
的表達,而不是一個數字。 odeint
無法使用它!
u
被定義為Symbol
,因此任何使用它的 python 表達式也將是一個 sympy 表達式。
特別是如果您是編碼新手,您應該堅持使用 package 或其他。 如果以符號方式定義 function,則使用sympy
及其自己的求解器。 但是,如果scipy
產生的數值解很重要,那么使用 python/numpy 定義 function。 不要試圖混合 sympy 和 numpy (沒有更多經驗)。
老問題,但似乎你可以使用 sympy 的lambdify
function 解決這個問題。 你會這樣做:
f = lambdify(x, x**2, modules=['scipy'])
現在f
是 lambda,您可以將其與 scipy 一起使用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.