我必须编写两个骨再生模型,一个没有延迟,这是一个常微分方程,我没有遇到任何问题,另一个模型是一个有延迟的微分方程,我正在使用 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 模型但有延迟,在平滑的波浪中。
请,如果有人可以帮助我找到错误,我将非常感激。初始参数无法更改,因为它们是我所要求的。
我已经测试了我编写的代码,我希望有人能告诉我为什么它会失控。
根据您提供的代码,有一些潜在问题可能导致此行为: 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()
希望对你有帮助