Что-то не так с моей реализацией формулы Ферхулста?

Мне поручили программу для ввода и вывода таблицы, которая рассчитывала формулу Верхульста для К Количество лет. Я использовал это уравнение:

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

По сравнению с выводом, который я озвучил из 3-го графика в приведенной выше ссылке. Опять же, это предположения, поэтому я не могу ручаться за их точность:

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;
}

5

Решение

Обратите внимание, что население для года 0 на 3-м графике изначально равно 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

Я хотел бы отметить, что добавление 0,5 к учетной записи для ошибки округления не требуется, если вы используете тип double для всех ваших ценностей:

#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
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]