XJTUSE-数学建模-homework3

1 问题复现

1.1   问题的提出

医生给病人开处方时必须注明两点:服药的剂量和服药的时间间隔。超剂量的药品会对身体产生严重不良后果,甚至死亡,而剂量不足,则不能达到治病的目的。已知患者服药后,随时间推移,药品在体内逐渐被吸收,发生生化反应,也就是体内药品的浓度逐渐降低。药品浓度降低的速率与体内当时药品的浓度成正比。当服药量为D、服药间隔为T,试分析体内药的浓度随时间的变化规律。

1.2   问题分析

变量的确定:服药的剂量和服药的时间间隔,分别命名服药量为D、服药间隔为T。

求解问题的标准:避免超剂量的药品,否则对身体产生严重不良后果,甚至死亡,同时避免剂量不足,则不能达到治病的目的。

问题关键条件:已知患者服药后,随时间推移,药品在体内逐渐被吸收,发生生化反应,也就是体内药品的浓度逐渐降低。药品浓度降低的速率与体内当时药品的浓度成正比。

2 模型建立与求解

2.1   符号定义

服药量

D

服药间隔

T

未被吸收的数量

y(t)

已吸收的数量

x(t)

2.2   模型建立及求解

1.患者进行口服药,需要时间才能被吸收,药物被吸收的速率与存量药物的浓度成正比,由于体积可以看出近似不变,因此药物被吸收的速率与存量药物的数量成正比,记比例系数为K1。满足下面公式:

\frac{dy}{dt}=\ -K1\ast y

y\left(0\right)=D

求解上述微分方程得:

y\left(t\right)=D\ast\ e^{-K1\ast t}

2.人体内的药物会随时间流逝,药物流逝的速率与体内药物的数量(浓度)成正比,记比例系数为K2。满足下面公式:

\frac{dx}{dt}+K2\ast x=K1\ast\ D\ast\ e^{-K1\ast t}

x\left(0\right)=0

解得:

x\left(t\right)=\left(K1\ast D\right)/\left(K1-K2\right)\left(e^{\left(-K2\ast t\right)}-e^{\left(-K1\ast t\right)}\right)

3.把药物数量减少至原先一半的时间,称之为半衰期。该问题药物的半衰期难以直接确定。

因此假设D=10;K1= 4;K2=3


得到下图:

3 模型分析及改进

3.1   解答题目问题

根据图像可知,在口服药后,体内药物浓度会在短时间内迅速上升至最高点,这需要医生判断最高点是否达到了危害人体的最低浓度,如果达到了,就需要适当减少药物。到达最高点后,药物浓度缓慢下降直到全部排出体内,假设浓度达到一定值后,则无药效,则需测量达到浓度之上的时间,以保证药效作用人体足够长时间。

3.2   模型的改进

上述模型只讨论了一次口服药的结果,这显然是不够的,我们可以做如下情况讨论:

1.如果在下次服药之前,绝大部分的药均被排除体内,则可以把每次口服药视为相互独立事件,每次服药重复上述模型。

2.如果在下次服药之前,还有剩余,则需要对上述模型进行微调:

具体步骤如下:

周期性处理,每次过了服药间隔T时,计算未被吸收剩余量D‘,体内剩余量E,时间归零重新开始计时。

y\left(0\right)=A+D'=D

x\left(0\right)=E

 

其余公式不变,解得:

x\left(t\right)=\ \frac{K1\ast D}{K1-K2}\ \left(e^{-K2\ast t}-\ e^{-K1\ast t}\right)+E\ast e^{-K2\ast t}

根据实际服药次数的情况,不断进行上述迭代即可求解模型。

仍带入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()

  • 22
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值