如何在数值积分的不同步骤中添加随机项

问题描述

对于下面的函数,我不会在每个时间步中添加噪声(下面代码中的 Inoise),但例如,只在每第二个时间步中添加。因此,虽然 dt=0.0025 作为数值积分的时间步长,但例如,我只会在每第二个时间步长(即 0.005 步长)中添加 Inoise

将其插入到我现有的函数中的最佳方法是什么?

    runs = 1000;
    t_end = 5;
    dt = 0.0025;
    t_steps = t_end/dt;

    for(int j=0; j<runs; j++){

        double vT = v0;
        double mT = m0;
        double hT = h0;
        double nT = n0;

        for(int i=0; i<t_steps; i++){

            double IStim = 0.0;
            if ((delay / dt <= (double)i) && ((double)i <= (delay + duration) / dt))
               IStim = I;

            mT = (mT + dt * alphaM(vT)) / (1.0 + dt * (alphaM(vT) + betaM(vT)));
            hT = (hT + dt * alphaH(vT)) / (1.0 + dt * (alphaH(vT) + betaH(vT)));
            nT = (nT + dt * alphaN(vT)) / (1.0 + dt * (alphaN(vT) + betaN(vT)));

            const double iNa = gNa * pow(mT,3.0) * hT * (vT - vNa);
            const double iK = gK * pow(nT,4.0) * (vT - vK);
            const double iL = gL * (vT-vL);
            const double Inoise =  (doubleRand() * knoise * sqrt(gNa * A));
            const double IIon = ((iNa + iK + iL) * A) + Inoise;

            vT += ((-IIon + IStim) / C) * dt;
            voltage[i] = vT;

            if(vT > 60.0) {
                count++;
                break;
            }
        }
    }
    return count;
}

解决方法

您可以累积经过的时间,并在经过足够多的步骤后才添加噪音:

double elapsedTime = 0;
double INoiseThreshold = 0.005;

for(int j=0; j<runs; j++){

    //...

    for(int i=0; i<t_steps; i++){

        //...

        double Inoise = 0;
        elapsedTime += dt;

        if(elapsedTime >= INoiseThreshold){
            Inoise = (doubleRand() * knoise * sqrt(gNa * A));
            elapsedTime = 0;
        }
        const double IIon = ((iNa + iK + iL) * A) + Inoise;

        //...
    }
}
return count;
  • 不是直接比较浮点数,而是检查它们的差异是否在一个小的 epsilon 内以允许舍入误差。

  • 不是让 Inoise 的值依赖于条件,你可以让 Ion 公式中的存在依赖,例如:

    const double IIon = ((iNa + iK + iL) * A) + (elapsedTime >= INoiseThreshold) ? Inoise : 0;
    

    只要记住在超过阈值后重置 elapsedTime。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...