2015-06-07 2 views
1

Я пытаюсь решить систему двух связанных дифференциальных уравнений с использованием python odeint().Использование векторных входов для odeint в python scipy для решения системы двух дифференциальных уравнений

В этой системе функция f зависит от двух переменных f (y, t), а другая функция g зависит от одной переменной g (t). Например, что-то подобное (только иллюстративными):

  • DF (у, т)/дт = (1 - у) + F (у, т) + д (т)
  • дг (т)/дт = г (т)

Я попытался, используя следующий код:

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: setting an array element with a sequence.

Я угадываю, что не правильно устанавливаю свои начальные условия. Любой совет?

ответ

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

Вы видите, что г (т) имеет неустановленное постоянная C_1 и f (t) и неопределенная функция F (y), которые должны определяться начальными условиями. Если вы знаете, что ведет ваша система, например, время t = 0, C_1 и F (y) легко определить.

+0

Большое спасибо, Дитрих. Однако мои уравнения действительно связаны. В моем примере выше df/dt зависит от g (t). И фактические уравнения, которые я должен решить, связаны в обоих направлениях. И хотя функция f (y, t) является функцией двух переменных, используется только производная по t. Моя программа отлично работала с odeint, когда у меня было только одно уравнение для решения формы: df (y, t)/dt = (1 - y) + f (y, t) – mg547

+0

Трудно сделать общие заявления о том, как решить ODE. Стратегия решения и его качество сильно зависят от структуры системы. Например, ознакомьтесь с http://docs.sympy.org/dev/modules/solvers/ode.html#system-of-odes для (неполного) списка типов систем ODE. – Dietrich

 Смежные вопросы

  • Нет связанных вопросов^_^