3
この問題を解決する方法がわかりません。 プログラムは、無限ループで実行時から1年を表すために秒を使用します。ループの中で私はこの方程式を解く必要があります。C微分方程式
微分方程式:DP/DT = rPの(1-P/K) - HP
P(t)が(年)は時間tとともに変化集団です。
記号は意味を有する: DP/dtは Rが(年間分数増加など)の天然生殖増加率である(年間増加として)瞬時人口増加率である Kは、容量を運ぶ集団であります(環境がサポートできる最大人口) hは、人口が淘汰される率(年間損失として)
実行時間秒に応じて(秒は1年を表します)以下の正しい例
Simulation run time minute = 0; second = 3; millisec = 156
Year of simulation = 3
Rate of population change = 5180.209961
私のコードが実行されたときにわかるように、正しい母集団の変化を計算する方法を理解することはできません。それは秒によって異なりますので、それは異なります。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
int option = 0;
float initialPopulation = 0; //starting population
float maximumPopulation = 0; //max population
float harvestingRate = 0;
float fractionGrowthPopulationRate = 0;
int minutes = 0;
int milliseconds = 0;
char quit;
int forever = 1;
float total = 0.0;
printf("Population Simulation\n");
printf("1. run the simulation\n");
printf("2. Quit\n");
scanf("%d", &option);
if (option == 1) {
printf("ENTER SIMULATION PARAMETERS\n");
printf("Initial population (typically 900000)?");
scanf("%d", &initialPopulation);
printf("Maximum population the environment can support (typically 1000000)? \n");
scanf("%d", &maximumPopulation);
printf("Initial harvesting rate (fraction per year - 0 for no\n harvesting)? ");
scanf("%f", &harvestingRate);
printf("Natural fractional growth population rate (typically 0.2 per year)?\n");
scanf("%f", &fractionGrowthPopulationRate);
printf("\n");
}
else if (option == 2) {
return 0;
}
while (forever != 'q') {
printf("starting simulation\n");
clock_t t;
t = clock();
//confused on how to code the formula
total = fractionGrowthPopulationRate * initialPopulation* (1 - initialPopulation/maximumPopulation) - harvestingRate*initialPopulation;
t = clock() - t;
int seconds = ((int)t)/CLOCKS_PER_SEC; // in seconds
printf("Simulation run time minute = %d; second = %d; millisec = %d\n", minutes, seconds, milliseconds);
printf("*****************************************************************\n");
printf("Year of simulation = %d\n", seconds); //every seconds equals 1 year
printf("Rate of population change = %f\n", total); //total should be calculated
printf("*****************************************************************\n");
printf("Press w/e to increase/decrease harvesting rate.\n");
printf("Current harvesting rate : %f\n", harvestingRate);
printf("Press p/o to increase/decrease Max population supported.\n");
printf("Current Max population : %d\n", maximumPopulation);
printf("Press k/l to increase/decrease growth rate.\n");
printf("Current growth rate : %f\n", fractionGrowthPopulationRate);
printf("Press q to quit.\n");
fflush(stdin);
scanf("%c", &forever);
}
return 0;
}
コードでは、実際に微分方程式を解くことはありません。そのためにはインテグレータが必要です。 Runge-KuttaはP(t)を数値的に計算する。そのような機能を提供するライブラリの例は、[GSL](http://www.gnu.org/software/gsl/manual/html_node/Numerical-Integration.html)です。良い積分器のコーディングは簡単ではありませんが、単純な問題については、有限の後方差分、台形などの単純な方法で逃げることができます。また、微分方程式を解析的に解くこともできます。 – Cyb3rFly3r
'scanf("%d "、&maximumPopulation);'これを 'scanf("%f "、&maximumPopulation)に変更します;' harvestingRate'と同じ行います –
その微分方程式では、 http://www.wolframalpha.com/input/?i=p%27(t)%3Dr*p(t)*(1+-+p(t)+%2F+k)+-+h*p (t))。 – Cyb3rFly3r