【问题标题】:Half-lives. Need help designing an algorithm半条命。需要帮助设计算法
【发布时间】:2016-05-05 17:59:07
【问题描述】:

输入:

x - how many days patient was taking a substance
y - how many miligrams per day
z - what's the half-life of the substance in hours

输出:

a - for how many hours substance will stay in patient's body
    (Let's assume that below y/200 threshold we say it's gone).

编辑: 我到目前为止所尝试的我知道是不正确的。就是这样:

public static int computeEliminationTime(int days, double dosage, int half_life) {
    double saturation = 0.0d;
    double threshold = dosage/200.0d;
    boolean isHeStillTakingMedicine = true;
    for (int hours = 0;; hours++) {
        if (isHeStillTakingMedicine) {
            if (hours % 24 == 0) {
                saturation += dosage;
                days--;
                if (days == 0){
                    isHeStillTakingMedicine = false;
                    hours=1;
                }
            }
        }

        if (hours % half_life == 0) {
            saturation /= 2.0d;
        }
        if (saturation < threshold) {
            return hours;
        }
    }
}

我知道这种方法是错误的,因为物质的消除是一个持续的过程,它不会每隔几个小时的半衰期发生一次。我对exponential decay 进行了一些研究,但我只是不知道如何处理这个怪物。我的数学能力很差。

【问题讨论】:

  • 您是否从数学的角度研究过半衰期问题?这个问题的解决方案是微分方程。
  • 到目前为止你做了什么?
  • 请明确说明y——这个数量是在每天开始时单次服用的,对吧?另外,a 是从服用第一剂剂的那一刻开始计算的,还是从服用最后一次剂的那一刻开始计算的?
  • @Dilum y - 在每天开始的时候单身,a - 从最后一剂开始

标签: algorithm


【解决方案1】:

首先让我们看看这种物质一天会衰减多少。超过 z 小时,数量减少 1/2 倍,然后超过 24 小时,它会减少 q = (1/2) 24/ z = 2 -24/z 次。

现在让我们看看服用最后一剂后会有多少物质。第一剂后是 T1 = y。在第 n + 1 天,金额为 Tn+1 = Tn q + y。我们需要在第 x 天找到物质 Tx 的数量。

如果您尝试写出此递归关系的前几项,您会注意到这归结为 Tx = y em> • qx-1 + yqx-2 + ... + y。这只是几何级数的总和。因此,Tx = y • (1 - q x ) / (1 - q)

现在我们必须找出 Tx 衰减到 y / 200 所需的时间。这是 log 2 (Tx / (y / 200)) 半衰期,即等于 zlog2 (Tx / (y / 200)) 小时。

所以,如果你替换 Tx,结果将是 a = z日志2 (200 • (1 - qx) / (1 - q)) 小时,其中 q = 2 -24/z

【讨论】:

  • 对我来说有点太聪明了,所有这些对数之类的东西。但是你的 q 公式对我帮助很大。
  • @VladK。看来您正在使用 Java。在这种情况下计算 log2(x),你可以使用Math.log(x) / Math.log(2),或者使用 Guava 库DoubleMath.log2。整个公式类似于double q = Math.pow(2, -24.0d/(double)half_life); double a = half_life * Math.log(200 * (1 - Math.pow(q, (double)days)) / (1 - q)) / Math.log(2)。但是测试它是否给出正确的结果,我可能在数学上犯了一些错误。
【解决方案2】:

这是我最终想到的:

public static int computeEliminationTime(int days, double dosage, int half_life) {
    double saturation = 0.0d;
    double threshold = dosage/200.0d;
    double degradationFactor = Math.pow(2, -1.0d/(double)half_life);
    boolean isHeStillTakingMedicine = true;
    for (int hours = 0;; hours++) {
        if (isHeStillTakingMedicine) {
            if (hours % 24 == 0) {
                saturation += dosage;
                days--;
                if (days == -1){
                    isHeStillTakingMedicine = false;
                    hours=0;
                }
            }
        }

        saturation = saturation * degradationFactor; 

        if (saturation < threshold) {
            return hours;
        }
    }
}

【讨论】:

  • 我还做了一个有图表的小应用程序。 https://github.com/p-majewski/HalfLives
  • 我决定接受我自己的答案,因为我正在寻找一种算法而不是一个方程来解决我的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多