Under/over 求和 int 乘以 double 时的近似值

Under/over approximation while summing int multiplied by double

我的代码也应该通过微分方程离散化的方法来评估系统的演化,但它需要修改的所有数据都是整数,总和需要是常数。问题就出在这里,他们的总和减少了。我该如何尝试解决这个问题?

 mystruct Population {
      int T;
      int S;
      int R;
      int I;
    };
     
    std::vector<Population> result{p0_};
    int repetitions = 20 ;
    double gamma = 0.01 ;
    double beta = 0.02 ;
    for (int i = 1; i < repetitions; ++i) {
    auto const& prev = result.back();

 mystruct p;
      p.S = prev.S - (prev.I * prev.S) * beta;
      p.I = prev.I + (prev.I * prev.S) * beta -
              prev.I * gamma;
      p.R = prev.R + prev.I * gamma;
 result.push_back(p);

  }

这是方程式。

这些是输出的几个例子,其中 T 应该是 50

S = 47; I = 3; R = 0; T = 50

S = 43; I = 5; R = 0; T = 48

这很简单。 float/double 的乘法自动将整数转换为浮点类型。将浮点类型转换为整数存在舍入错误:向零舍入是默认行为。

如果您只想确保在处理整数时总和保持不变,只需确保您 add/subtract 的数字是整数且一致。

   mystruct p;
   int tmpInt1 = (prev.I * prev.S) * par_.beta;
   int tmpInt2 = prev.I * par_.gamma;
   p.S = prev.S - tmpInt1;
   p.I = prev.I + tmpInt1 -tmpInt2;
   p.rec = prev.R + tmpInt2;

您可能还更喜欢在 double/float 之前使用 round() 进行 int 转换。

编辑:另外,.R.rec 之间有什么区别?您可能忘记了一个成员变量。