有延迟的模型

问题描述 投票:0回答:1

我必须编写两个骨再生模型,一个没有延迟,这是一个常微分方程,我没有遇到任何问题,另一个模型是一个有延迟的微分方程,我正在使用 ddeint 库。我已经实现了以下代码:

from scipy.integrate import odeint
import matplotlib.pyplot as plt
from ddeint import ddeint

def komarova_model(y, t, alpha1, alpha2, beta1, beta2, gamma11, gamma12, gamma21, gamma22):
    u1, u2 = y
    du1dt = alpha1 * u1**gamma11 * u2**gamma21 - beta1 * u1
    du2dt = alpha2 * u1**gamma12 * u2**gamma22 - beta2 * u2
    return [du1dt, du2dt]

def dde_model(Y, t, alpha1, alpha2, beta1, beta2, gamma11, gamma12, gamma21, gamma22, tau1, tau2):
    u1, u2 = Y(t)  # current state
    u1d, u2d = Y(t - tau1) if t > tau1 else [u1_0], Y(t - tau2) if t > tau2 else [u2_0]
    du1dt = alpha1 * u1**gamma11 * u2d[0]**gamma21 - beta1 * u1
    du2dt = alpha2 * u1d[0]**gamma12 * u2**gamma22 - beta2 * u2
    return [du1dt, du2dt]

def history(t):
    return np.array([u1_0, u2_0])

# Parámetros para ambos modelos
alpha1 = 3
alpha2 = 4
beta1 = 0.2
beta2 = 0.02
gamma11 = 1.1
gamma22 = 0
gamma12 = 1
gamma21 = -0.5
tau1 = tau2 = 0.1

# Condiciones iniciales
u1_0 = 12  # Densidad inicial de osteoclastos
u2_0 = 250  # Densidad inicial de osteoblastos

t = np.linspace(0, 1000, 10000)
sol_komarova = odeint(komarova_model, [u1_0, u2_0], t, args=(alpha1, alpha2, beta1, beta2, gamma11,         gamma12, gamma21, gamma22))

dde_sol = ddeint(dde_model, history, t, fargs=(alpha1, alpha2, beta1, beta2, gamma11, gamma12, gamma21,    gamma22, tau1, tau2))

# Graficando los resultados
plt.figure(figsize=(15, 5))

# Comparación de osteoclastos
plt.subplot(1, 2, 1)
plt.plot(t, sol_komarova[:, 0], 'k-', label='Komarova model (no delay)')
plt.plot(t, dde_sol[:, 0], 'r--', label='Model with delays')
plt.title('Osteoclasts without and with delays')
plt.xlabel('t')
plt.ylabel('Osteoclasts')
plt.legend()

# Comparación de osteoblastos
plt.subplot(1, 2, 2)
plt.plot(t, sol_komarova[:, 1], 'b--', label='Komarova model (no delay)')
plt.plot(t, dde_sol[:, 1], 'g-.', label='Model with delays')
plt.title('Osteoblasts without and with delays')
plt.xlabel('t')
plt.ylabel('Osteoblasts')
plt.legend()

plt.tight_layout()
plt.show()

通过这段代码,我成功地正确绘制了 Komarova 模型(没有延迟),但是有延迟的模型增长得非常快,然后稳定下来,它不应该是这样的,它应该像 Komarova 模型但有延迟,在平滑的波浪中。

请,如果有人可以帮助我找到错误,我将非常感激。初始参数无法更改,因为它们是我所要求的。

Correct graphic

Incorrect graphic

我已经测试了我编写的代码,我希望有人能告诉我为什么它会失控。

python
1个回答
0
投票

根据您提供的代码,有一些潜在问题可能导致此行为: 1)初始条件 2)积分时间跨度 3)延时参数 4)函数定义 5)积分法 这是代码的修改版本,其中包含一些可能的调整:

from scipy.integrate import odeint
import numpy as np
import matplotlib.pyplot as plt
from ddeint import ddeint

def komarova_model(y, t, alpha1, alpha2, beta1, beta2, gamma11, gamma12, gamma21, gamma22):
    u1, u2 = y
    du1dt = alpha1 * u1**gamma11 * u2**gamma21 - beta1 * u1
    du2dt = alpha2 * u1**gamma12 * u2**gamma22 - beta2 * u2
    return [du1dt, du2dt]

def dde_model(Y, t, alpha1, alpha2, beta1, beta2, gamma11, gamma12, gamma21, gamma22, tau1, tau2):
    u1, u2 = Y(t)
    u1d, u2d = Y(t - tau1)[0], Y(t - tau2)[1]
    du1dt = alpha1 * u1**gamma11 * u2d**gamma21 - beta1 * u1
    du2dt = alpha2 * u1d**gamma12 * u2**gamma22 - beta2 * u2
    return [du1dt, du2dt]

def history(t):
    if t < 0:
        return [u1_0, u2_0]
    else:
        return [u1(t), u2(t)]

# Parameters for both models
alpha1 = 3
alpha2 = 4
beta1 = 0.2
beta2 = 0.02
gamma11 = 1.1
gamma22 = 0
gamma12 = 1
gamma21 = -0.5
tau1 = tau2 = 0.1

# Initial conditions
u1_0 = 12
u2_0 = 250

t = np.linspace(0, 1000, 10000)
sol_komarova = odeint(komarova_model, [u1_0, u2_0], t, args=(alpha1, alpha2, beta1, beta2, gamma11, gamma12, gamma21, gamma22))
dde_sol = ddeint(dde_model, history, t, fargs=(alpha1, alpha2, beta1, beta2, gamma11, gamma12, gamma21, gamma22, tau1, tau2))

# Plotting the results
plt.figure(figsize=(15, 5))

plt.subplot(1, 2, 1)
plt.plot(t, sol_komarova[:, 0], 'k-', label='Komarova model (no delay)')
plt.plot(t, dde_sol[:, 0], 'r--', label='Model with delays')
plt.title('Osteoclasts without and with delays')
plt.xlabel('t')
plt.ylabel('Osteoclasts')
plt.legend()

plt.subplot(1, 2, 2)
plt.plot(t, sol_komarova[:, 1], 'b--', label='Komarova model (no delay)')
plt.plot(t, dde_sol[:, 1], 'g-.', label='Model with delays')
plt.title('Osteoblasts without and with delays')
plt.xlabel('t')
plt.ylabel('Osteoblasts')
plt.legend()

plt.tight_layout()
plt.show()

希望对你有帮助

© www.soinside.com 2019 - 2024. All rights reserved.