scipy odeint -(类型错误:无法将表达式转换为浮点型)-将表达式导入到函数中以执行odeint

y0u0uwnf  于 2022-11-10  发布在  其他
关注(0)|答案(2)|浏览(143)

"这是我的错误"

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)

我只需要得到一个没有这个错误的答案。还有有没有办法在一个单一的函数中完成所有这些

ltskdhd1

ltskdhd11#

如果在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表达式。
特别是如果你是一个编程新手,你应该坚持使用一个包或另一个包。如果用符号定义函数,那么就使用sympy和它自己的解算器。但是如果scipy产生的那种数值解很重要,那么就用python/numpy定义函数。不要试图混合使用sympy和numpy(没有更多的经验)。

tv6aics1

tv6aics12#

这是一个老问题,但看起来你可以用sympy的lambdify函数来解决这个问题。你可以这样做:

f = lambdify(x, x**2, modules=['scipy'])

现在,f是一个lambda,可以与scipy一起使用。

相关问题