在python中有什么方法/求解器可以求解常微分方程中的嵌入导数吗?

iyfjxgzm  于 2022-11-19  发布在  Python
关注(0)|答案(1)|浏览(106)

我从数学模型中得到了这个方程来了解电池的热行为。

dTsdt = Ts * a+ Ta * b + dTadt * c + d

然而,由于嵌套的导数,我无法解决它。
我需要解出Ts和Ta的方程。我试着把它定义如下,但是python不喜欢它,并且出现了一些错误。我使用scipy.integrate和求解器ODEint
由于模型从向量中获取数据,因此必须对每个时间步长求解并相应地记录输出。我还尝试将导数赋值给变量v1,v2,然后将所有内容都放入一个没有导数的方程中,就像下面所示的第二种方法一样。

def Tmodel(z,t,a,b,c,d):
    Ts,Ta= z
    dTsdt = Ts*a+ Ta*b + dTadt*c+ d
    dzdt=[dTsdt]
    return dzdt

z0=[0,0]
# solve ODE
for i in range(0,n-1):
   
    tspan = [t[i],t[i+1]]
    # solve for next step
    z = odeint(Tmodel,z0,tspan,arg=(a[i],b[i],c[i],d[i],))
    # store solution for plotting
    Ts[i] = z[1][0]
    Ta[i] = z[1][1]
    # next initial condition
    z0 = z[1]

def Tmodel(z,t,a,b,c,d):
    Ts,v1,Ta,v2= z
# v1= dTsdt
# v2= dTadt
    v1 = Ts*a+ Ta*b + v2*c+ d
    dzdt=[v1,v2]
    return dzdt

那也不起作用。我相信可能有一个求解器能够解出那个方程或者方程必须以某种方式解耦并相应地求解。
任何关于如何用python解决此类eqtn的建议都将不胜感激。
顺祝商祺!
毫米

anauzrmj

anauzrmj1#

你的困难似乎在于你得到的Ta没有一个容易的导数,所以你不知道从哪里得到它。一个解决办法是完全避免这个导数,并求解系统的y=Ts-c*Ta。在右边代入Ts=y+c*Ta,得到

dy/dt = y*a + Ta*(b+c*a) + d

当然,这需要后处理步骤Ts=y+c*Ta来得到所请求的变量。
如果Ta以函数表的形式给出,则使用插值函数获取常微分方程求解器所需的任意奇数时刻t的值。

Ta_func = interp1d(Ta_times,Ta_values)

def Tmodel(y,t,a,b,c,d):
    Ta= Ta_func(t)
    dydt = y*a+ Ta*(b+c*a) + d
    return dydt

y[0] = Ts0-c*Ta_func(t[0])

for i in range(len(t)-1):
    y[i+1] = odeint(Tmodel,y[i],t[i:i+2],arg=(a[i],b[i],c[i],d[i],))[-1,0]

Ts = y + c*Ta_func(t)

相关问题