2016-02-06 11 views
5

Zostałem przypisany program do pobierania danych wejściowych i wyprowadzania tabeli, która obliczała wzór Verhulsta na k liczbę lat. Że stosuje się równania:Czy coś jest nie tak z moją implementacją Formuły Verhulsta?

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

Równanie poniżej:

p (n + 1) = (1 + G-H), p (n) - GP (n)^2/m.

Oto program, który zrobiłem. I usunęliśmy część mojego kodu, który żąda wejście jak czuję, że byłoby uciążliwe dla Was przesiać przez:

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

} 

polecono mi sprawdzić mój kod za pomocą przykładów z linku powyżej, który określa g (stopa wzrostu) odpowiednio na poziomie 125, 250 i 300. Czuję, że mój program jest dość dokładny w przypadku pierwszych dwóch liczb (pasują one do wykresu dość dokładnie), ale po podłączeniu 300 otrzymuję bardzo różne wartości z przedstawionego wykresu. Nie jestem pewien, czy popełniłem jakiś błąd w wyrażaniu powyższego w moim kodzie, czy wykres jest szczególnie okropny. Utrzymałem wszystko inne na stałym poziomie, używając parametrów wspomnianych na wyżej wymienionej stronie.

Oto wynik mam ustawić g = 300. Pierwsza kolumna to lat, drugi jest populacja:

1 35 
2 96 
3 88 
4 102 
5 75 
6 116 
7 37 
8 100 
9 80 
10 112 

Versus wyjściu mam eyeballed od 3 wykresem w powyższy link. Ponownie, są to przypuszczenia, więc nie mogę ręczyć za ich dokładność:

1 25 
2 70 
3 120 
4 33 
5 94 
6 90 
7 98 
8 86 
9 92 
10 70 

Że mogę wyjść, które odpowiadają pierwszej i drugiej wykresy, ale nie trzeci jest dość kłopotliwy. Czy moja implementacja w C++ dźwięku równania ?:

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

No nie. OP naprawdę prosi nas o znalezienie (możliwych) błędów. Witryna codereview służy do >> pracy tylko z kodem <<. –

Odpowiedz

3

zauważy populacja w roku 0 w 3. wykresie jest początkowo 120, a nie 20. Zmień swoje wejście do 120 i będziesz skończyć z wartościami dużo bliżej do stołu, który oglądałeś.

Pozostawienie danych jako typy twojej przewidzianego kodu, wyjście staje:

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 

Chciałbym podkreślić, że dodanie 0,5 do uwzględnienia zaokrąglenia błąd jest niepotrzebna, jeśli używasz typu double za wszystkie swoje wartości:

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

to będzie produkować

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 
+0

Dziękuję bardzo za to - myślę, że to wyjaśnia niedopasowanie moich wyników. –

Powiązane problemy