在python scipy中使用向量输入odeint来求解两个微分方程组

时间:2015-06-07 23:08:42

标签: python scipy odeint

我正在尝试使用python odeint()来解决两个耦合微分方程的系统。

在该系统中,函数f取决于两个变量f(y,t),而另一个函数g取决于一个变量g(t)。例如,类似的东西(仅供说明):

  • df(y,t)/ dt =(1 - y)+ f(y,t)+ g(t)
  • dg(t)/ dt = g(t)

我尝试使用以下代码:

import numpy as np
from scipy import integrate

dy = 0.05
y = np.arange(0, 1 + dy, dy)
dt = 1
tmax = 100

t = np.arange(0,tmax,dt)
f = np.ones([tmax,len(y)])
g = np.ones(tmax)

def deriv(y,t):
    fi = y[0]
    gi = y[1]

    fprime = (1 - y) + fi + gi
    gprime = gi

    return [fprime, gprime]

# Initial conditions
f_ini = np.ones(len(y))*15          
g_ini = np.array([0.3])
sol_ini = np.concatenate((f_ini, g_ini), axis=0)

# solve the DEs
soln = integrate.odeint(deriv, sol_ini, t)

我在代码的最后一行收到以下错误:

  

ValueError:使用序列设置数组元素。

我猜我没有正确设置我的初始条件。有什么建议?

1 个答案:

答案 0 :(得分:1)

您可能没有选择最佳方程组:您的方程彼此独立,第一个是偏微分方程。使用Sympy,您可以找到封闭式解决方案:

from IPython.display import display
import sympy as sy
from sympy.solvers.ode import dsolve
from sympy.solvers.pde import pdsolve


sy.init_printing()  # LaTeX like pretty printing for IPython


t, y = sy.symbols("t, y", real=True)
f, g = sy.symbols("f, g", function=True)

eq1 = sy.Eq(g(t).diff(t), g(t))
g_sol = dsolve(eq1)
print("For the ode")
display(eq1)
print("the solution is")
display(g_sol)

eq2 = sy.Eq(f(y, t).diff(t), (1-y) + f(y, t) + g_sol.rhs)
f_sol = pdsolve(eq2)
print("For the pde")
display(eq2)
print("the solution is")
display(f_sol)

给出一个IPython解释器

solution

你看到 g(t)有一个未确定的常数 C_1 f(t)和未确定的函数 F(y ),需要由初始条件定义。 如果您知道系统的行为,例如:时间 t = 0 C_1 F(y)可以轻松确定。