1 问题复现
1.1 问题的提出
医生给病人开处方时必须注明两点:服药的剂量和服药的时间间隔。超剂量的药品会对身体产生严重不良后果,甚至死亡,而剂量不足,则不能达到治病的目的。已知患者服药后,随时间推移,药品在体内逐渐被吸收,发生生化反应,也就是体内药品的浓度逐渐降低。药品浓度降低的速率与体内当时药品的浓度成正比。当服药量为D、服药间隔为T,试分析体内药的浓度随时间的变化规律。
1.2 问题分析
变量的确定:服药的剂量和服药的时间间隔,分别命名服药量为D、服药间隔为T。
求解问题的标准:避免超剂量的药品,否则对身体产生严重不良后果,甚至死亡,同时避免剂量不足,则不能达到治病的目的。
问题关键条件:已知患者服药后,随时间推移,药品在体内逐渐被吸收,发生生化反应,也就是体内药品的浓度逐渐降低。药品浓度降低的速率与体内当时药品的浓度成正比。
2 模型建立与求解
2.1 符号定义
服药量 | D |
服药间隔 | T |
未被吸收的数量 | y(t) |
已吸收的数量 | x(t) |
2.2 模型建立及求解
1.患者进行口服药,需要时间才能被吸收,药物被吸收的速率与存量药物的浓度成正比,由于体积可以看出近似不变,因此药物被吸收的速率与存量药物的数量成正比,记比例系数为K1。满足下面公式:
求解上述微分方程得:
2.人体内的药物会随时间流逝,药物流逝的速率与体内药物的数量(浓度)成正比,记比例系数为K2。满足下面公式:
解得:
3.把药物数量减少至原先一半的时间,称之为半衰期。该问题药物的半衰期难以直接确定。
因此假设D=10;K1= 4;K2=3
得到下图:
3 模型分析及改进
3.1 解答题目问题
根据图像可知,在口服药后,体内药物浓度会在短时间内迅速上升至最高点,这需要医生判断最高点是否达到了危害人体的最低浓度,如果达到了,就需要适当减少药物。到达最高点后,药物浓度缓慢下降直到全部排出体内,假设浓度达到一定值后,则无药效,则需测量达到浓度之上的时间,以保证药效作用人体足够长时间。
3.2 模型的改进
上述模型只讨论了一次口服药的结果,这显然是不够的,我们可以做如下情况讨论:
1.如果在下次服药之前,绝大部分的药均被排除体内,则可以把每次口服药视为相互独立事件,每次服药重复上述模型。
2.如果在下次服药之前,还有剩余,则需要对上述模型进行微调:
具体步骤如下:
周期性处理,每次过了服药间隔T时,计算未被吸收剩余量D‘,体内剩余量E,时间归零重新开始计时。
其余公式不变,解得:
根据实际服药次数的情况,不断进行上述迭代即可求解模型。
仍带入D=10;K1= 4;K2=3。此时假设服药间隔为1h,一共进行两次服药,得到下图:
函数图像是连续的,这说明身体吸收不存在突然增加。
出现了一个不可导点,这是因为我们假设口服药后,未被吸收的浓度突增。
出现了两个极大值点,而且第二个极大值点比第一个极大值点大,这可能会导致浓度过高危害身体,需要注意。最高值变大这一情况与事实类似,即多吃药对身体不好。但是可以看到有效时间变长,这有助于患者的恢复。
由于出现不可导点,可以把模型简化为一个分段函数,但是程序上迭代求解更为方便,因此具体公式不再给出。
4 总结与附录
4.1 总结
本次作业学习了就口服药的实际情况,建立微分方程,并求解模型,在过程中我学习到了多房室模型的思想,受益匪浅。同时,进行了画图分析,更加直观的展示了模型,正面论证了模型的正确性。
4.2 代码
import numpy as np
import matplotlib.pyplot as plt
# 支持中文
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
K1 = 4
K2 = 3
D = 10
# 定义时间范围
t1 = np.arange(0, 1, 0.01)
t2 = np.arange(1, 5, 0.01)
# 计算浓度
C0 = (K1*D)/(K1-K2)
C1 = C0 * (np.exp(-K2*t1)-np.exp(-K1*t1))
C2 = C0 * (np.exp(-K2*(t2-1))-np.exp(-K1*(t2-1))) + C0*(np.exp(-K2)-np.exp(-K1))*np.exp(-K2*(t2-1))
# 绘制图像
plt.figure()
plt.plot(t1, C1)
plt.plot(t2, C2)
plt.xlabel('时间')
plt.ylabel('浓度')
plt.title('药物浓度随时间的变化')
plt.show()