我分配了一个程序来接受输入并输出一个表,该表计算了k年的Verhulst公式。我用这个方程式:

http://www.resnet.wm.edu/~jxshix/math410/Verhulst.html

等式如下:

p(n + 1)=(1 + g-h)p(n)-gp(n)^ 2/M。

这是我制作的程序。我已经删除了我的代码中要求输入的部分,因为我觉得这对你们来说是很乏味的:

> #include <iostream>
using namespace std;


  int main() {


   int k = 20; // number of years to calculate for
   int pn = 10; // the population of animals for the first year
   double g = 275; // rate of growth
   g = g/100.00;
   double h = 20; // rate of animal death/animals leaving population
   h = h/100.00;
   int M = 100; // carrying capacity of the ecosystem



/*
Implementing Verhulst's Formula in C++
*/



 int i;
 int pop;
 for (i = 1; i <= k ; i++)
 {
 pop = (((1 + (g - h)) * pn) - g*(pn*pn)/M) + .5; // the equation
 pn = pop; // this takes the new value of pop and inserts it as pn, to be looped until i <= k
 cout << i << " " << pop << endl;
 }


 return 0;

}

我被指示使用上面链接中的示例测试我的代码,该示例分别将g(增长率)设置为125、250和300。我觉得我的程序对于前两个数字来说是非常准确的(它们与图形非常准确地匹配),但是当我插入300时,所显示的图形会得到非常不同的值。我不确定在代码中表达以上内容时是否犯了某种错误,或者图表是否特别糟糕。我使用上述网站上提到的参数使其他所有内容保持不变。

这是我得到的输出,我将g设置为300。第一列是年份,第二列是人口:
1 35
2 96
3 88
4 102
5 75
6 116
7 37
8 100
9 80
10 112

与我在上面链接中的第三张图上看到的输出对比。同样,这些都是猜测,因此我不能保证其准确性:
1 25
2 70
3 120
4 33
5 94
6 90
7 98
8 86
9 92
10 70

我可以得到与第一张和第二张图匹配的输出,但第三张图却不匹配,这很令人困惑。我在C++中实现的方程式听起来不错吗?:
 int i;
 int pop;
 for (i = 1; i <= k ; i++)
 {
 pop = (((1 + (g - h)) * pn) - g*(pn*pn)/M) + .5; // the equation
 pn = pop; // this takes the new value of pop and inserts it as pn, to be looped until i <= k
 cout << i << " " << pop << endl;
 }

最佳答案

请注意,第三张图中第0年的人口最初是120,而不是20。将输入更改为120,最终得到的值将更接近于您所关注的表的值。

将数据保留为提供的代码中的类型,输出将变为:

1 24
2 74
3 117
4 34
5 95
6 90
7 99
8 82
9 110
10 55
11 118
12 31
13 89
14 101
15 78
16 114
17 43
18 108
19 60
20 120

我想指出的是,如果对所有值都使用double类型,则无需为舍入误差添加0.5。
#include <iostream>
using namespace std;

int main() {
  int k = 20; // number of years to calculate for
  double pn = 120; // the population of animals for the first year
  double g = 300; // rate of growth
  g = g/100.00;
  double h = 20; // rate of animal death/animals leaving population
  h = h/100.00;
  double M = 100; // carrying capacity of the ecosystem

/*
Implementing Verhulst's Formula in C++
*/

  int i;
  double pop;
  for (i = 1; i <= k ; i++)
  {
    pop = (((1 + (g - h)) * pn) - g*(pn*pn)/M); // the equation
    pn = pop; // this takes the new value of pop and inserts it as pn, to be looped until i <= k
    cout << i << " " << (int)pop << endl;
  }

  return 0;
}

那会产生
1 24
2 73
3 116
4 34
5 94
6 91
7 97
8 85
9 105
10 67
11 119
12 25
13 76
14 115
15 39
16 102
17 73
18 117
19 32
20 91

关于c++ - 我实现Verhulst公式有什么问题吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35236815/

10-11 16:06