2016-04-17 17 views
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; 
    } 
+1

コードでは、実際に微分方程式を解くことはありません。そのためにはインテグレータが必要です。 Runge-KuttaはP(t)を数値的に計算する。そのような機能を提供するライブラリの例は、[GSL](http://www.gnu.org/software/gsl/manual/html_node/Numerical-Integration.html)です。良い積分器のコーディングは簡単ではありませんが、単純な問題については、有限の後方差分、台形などの単純な方法で逃げることができます。また、微分方程式を解析的に解くこともできます。 – Cyb3rFly3r

+1

'scanf("%d "、&maximumPopulation);'これを 'scanf("%f "、&maximumPopulation)に変更します;' harvestingRate'と同じ行います –

+0

その微分方程式では、 http://www.wolframalpha.com/input/?i=p%27(t)%3Dr*p(t)*(1+-+p(t)+%2F+k)+-+h*p (t))。 – Cyb3rFly3r

答えて

1

次のコード:

  1. はきれい
  2. をコンパイルしたシミュレーションは、アカウントに前を取らなければならないイベント
  3. ヒントの適切な順序付けが含まれてい
  4. 別々の呼び出し可能な関数に機能を分離反復の結果。
  5. 適切それでも最大の人口がここ

に達したときのためのコードを含めるようにしてください、processParameters()に「processParameters() `関数

  • を完了する必要がありますユーザーの入力ミス
  • をチェック

    #define _CRT_SECURE_NO_WARNINGS 
    #include <stdio.h> // printf(), scanf() 
    #include <stdlib.h> // exit(), EXIT_FAILURE 
    //#include <time.h> 
    #include <string.h> // strerror() 
    #include <errno.h> // errno 
    
    // prototypes 
    void inputParameters(void); 
    void processParameters(void); 
    void displayResults(void); 
    int handleMenu(void); 
    
    // global data 
    float initialPopulation = 0.0f; //starting population 
    float maximumPopulation = 0.0f; //max population 
    float harvestingRate = 0.0f; 
    float fractionGrowthPopulationRate = 0.0f; 
    float total = 0.0f; 
    
    int minutes = 0; 
    int seconds = 0; 
    int milliseconds = 0; 
    
    
    int main(void) 
    { 
        int quit = 0; 
    
        while(!quit) 
        { 
         int option = handleMenu(); 
    
         switch(option) 
         { 
          case 1: 
           inputParameters(); 
           processParameters(); 
           displayResults(); 
           break; 
    
          case 2: 
           quit = 1; 
           break; 
    
          default: 
           printf("invalid option: %d try again\n", option); 
           break; 
         } // end switch 
        } // end while 
    
        return 0; 
    } // end function: main 
    
    
    void inputParameters() 
    { 
        printf("ENTER SIMULATION PARAMETERS\n"); 
    
        printf("Initial population (typically 900000)?"); 
        if(1 != scanf("%f", &initialPopulation)) 
        { 
         fprintf(stderr, "input of initial population failed due to: %s\n", strerror(errno)); 
         exit(EXIT_FAILURE); 
        } 
    
        printf("Maximum population the environment can support (typically 1000000)? \n"); 
        if(1 != scanf("%f", &maximumPopulation)) 
        { 
         fprintf(stderr, "input of maximum population failed due to: %s\n", strerror(errno)); 
         exit(EXIT_FAILURE); 
        } 
    
        printf("Initial harvesting rate (fraction per year - 0 for no harvesting)? "); 
        if(1 != scanf("%f", &harvestingRate)) 
        { 
         fprintf(stderr, "input of omotoa; jarvestomg rate failed due to: %s\n", strerror(errno)); 
         exit(EXIT_FAILURE); 
        } 
    
        printf("Natural fractional growth population rate (typically 0.2 per year)?\n"); 
        if(1 != scanf("%f", &fractionGrowthPopulationRate)) 
        { 
         fprintf(stderr, "input of initial population failed due to: %s\n", strerror(errno)); 
         exit(EXIT_FAILURE); 
        } 
    
        printf("\n"); 
    } // end function: inputParameters 
    
    
    void displayResults() 
    { 
        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 : %f\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"); 
    } // end function: displayResults 
    
    
    int handleMenu() 
    { 
        int option = 0; 
    
        printf("\nPopulation Simulation\n"); 
        printf("1. run the simulation\n"); 
        printf("2. Quit\n"); 
    
        if(1 != scanf("%d", &option)) 
        { 
         fprintf(stderr, "scanf failed due to: %s\n", strerror(errno)); 
         exit(EXIT_FAILURE); 
        } 
    
        return(option); 
    } // end function: handleMenu 
    
    
    void processParameters() 
    { 
        int simulationDuration = 0; 
    
        printf("how long is simulation to run:"); 
        if(1 != scanf("%d", &simulationDuration)) 
        { 
         fprintf(stderr, "input of simulation Duration failed due to: %s\n", strerror(errno)); 
         exit(EXIT_FAILURE); 
        } 
    
        printf("\nstarting simulation\n"); 
    
        total = initialPopulation; 
        for(int i=0; i<simulationDuration; i++) 
        { 
         //confused on how to code the formula 
         total = fractionGrowthPopulationRate * total * (1 - total/maximumPopulation) - harvestingRate*initialPopulation; 
    
         seconds = i; // in seconds 
        } 
    
        printf("\nsimulation complete\n"); 
    } // end function: processParameters 
    
  • 関連する問題