Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python scipy中使用矢量输入进行odeint以求解两个微分方程组_Python_Scipy_Odeint - Fatal编程技术网

在python scipy中使用矢量输入进行odeint以求解两个微分方程组

在python scipy中使用矢量输入进行odeint以求解两个微分方程组,python,scipy,odeint,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

我正在尝试使用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:使用序列设置数组元素


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

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

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解释器

你可以看到g(t)有一个待定常数C_1和f(t)以及待定函数f(y),这需要由初始条件来定义。
如果您知道您的系统在时间t=0时的行为,可以很容易地确定C_1和F(y)。

非常感谢,Dietrich。然而,我的方程确实是耦合的。在我上面的例子中,df/dt依赖于g(t)。我要解的实际方程是双向耦合的。虽然f(y,t)是两个变量的函数,但只涉及到t的导数。当我只有一个方程需要求解时,我的程序在odeint上运行得很好:df(y,t)/dt=(1-y)+f(y,t)。很难对如何求解ODE系统做出一般性的陈述。解决方案策略及其质量在很大程度上取决于系统的结构。例如,查看ODE系统类型的(不完整)列表。