Как сократить уравнения ОДУ с помощью вспомогательных функций - PullRequest
0 голосов
/ 14 сентября 2018

Я хотел бы как-то сократить свои уравнения ОДУ, потому что иначе код станет грязным. Я попытался использовать вспомогательные функции, такие как fe () здесь, но это не работает. Приведенный ниже код является лишь примером. Любой совет приветствуется! Спасибо!

# Import the required modules
import numpy as np
import matplotlib.pyplot as plt

from scipy.integrate import odeint

# Here the parameters
a,b,c,d = 1,1,1,1

def fe(P[0]):
    return d*P[0]

# Define a function which calculates the derivative
def dP_dl(P, l):
    return [P[0]*(a - b*P[1]),
            -P[1]*(c - fe(P[0]) )]


ts = np.linspace(0, 12, 100)
P0 = [1.5, 1.0]
Ps = odeint(dP_dl, P0, ts) 
prey = Ps[:,0]
predators = Ps[:,1]


plt.plot(ts, prey, "+", label="Rabbits")
plt.plot(ts, predators, "x", label="Foxes")
plt.xlabel("Time")
plt.ylabel("Population")
plt.legend();

Это то, что я получил с консоли Python.

Python 3.6.3 | Anaconda, Inc. | (по умолчанию 15 октября 2017 г., 07:29:16) [MSC v.1900 32 бит (Intel)] Введите «авторское право», «кредиты» или «лицензия» для больше информации.

IPython 6.1.0 - улучшенный интерактивный Python.

runfile ('C: / Users / Matteo S / Desktop / vocaboli tedesco / untitled0.py', wdir = 'C: / Users / Matteo S / Desktop / vocaboli tedesco') Traceback (большинство последний звонок последний):

Файл "C: \ Anaconda3 \ Lib \ сайт-пакеты \ IPython \ ядро ​​\ interactiveshell.py", строка 2862, в run_code exec (code_obj, self.user_global_ns, self.user_ns)

Файл "", строка 1, в runfile ('C: / Users / Matteo S / Desktop / vocaboli tedesco / untitled0.py', wdir = 'C: / Users / Matteo S / Desktop / vocaboli tedesco')

Файл "C: \ Anaconda3 \ Lib \ сайт-пакеты \ Spyder \ Utils \ сайт \ sitecustomize.py", строка 710, в runfile execfile (имя файла, пространство имен)

Файл "C: \ Anaconda3 \ Lib \ сайт-пакеты \ Spyder \ Utils \ сайт \ sitecustomize.py", строка 101, в execfile exec (compile (f.read (), filename, 'exec'), пространство имен)

Файл "C: / Users / Matteo S / Desktop / vocaboli tedesco / untitled0.py", строка 17 def fe (P [0]): ^ SyntaxError: неверный синтаксис

1 Ответ

0 голосов
/ 14 сентября 2018

Функции не должны знать, что вы передаете первый элемент итерируемого, он должен знать только, что вы передаете число.С другой стороны, в этом случае функция dP_dl предназначена для разделения компонентов, чтобы сделать их более читабельными.

# Import the required modules
import numpy as np
import matplotlib.pyplot as plt

from scipy.integrate import odeint

# Here the parameters
a,b,c,d = 1,1,1,1

def fe(x): return d*x

# Define a function which calculates the derivative
def dP_dl(P, l):
    x1, x2 = P
    dx1dt = x1*(a-b*x2)
    dx2dt = -x2*(c-fe(x1)) 
    return dx1dt, dx2dt


ts = np.linspace(0, 12, 100)
P0 = [1.5, 1.0]
Ps = odeint(dP_dl, P0, ts) 
prey = Ps[:,0]
predators = Ps[:,1]


plt.plot(ts, prey, "+", label="Rabbits")
plt.plot(ts, predators, "x", label="Foxes")
plt.xlabel("Time")
plt.ylabel("Population")
plt.legend();
plt.show()
...