首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C微分方程

C微分方程
EN

Stack Overflow用户
提问于 2016-04-17 16:38:48
回答 1查看 132关注 0票数 4

我似乎想不出如何解决这个问题。程序使用一秒钟来表示无限循环中运行期间的一年。在循环中,我需要解这个方程。

微分方程: dP/dt = rP(1-P/K) - hP

其中P(t)是随时间t(以年为单位)变化的人口。

这些符号的含义是: dP/dt是瞬时人口增长率(以年增长率为单位),r是自然生殖增长率(以每年部分增长)K是人口承载能力(环境所能支持的最大人口)h是种群被剔除的收获率(作为每年的部分损失)。

取决于运行时秒(每秒钟代表一年),下面是正确的示例

代码语言:javascript
复制
Simulation run time minute = 0; second = 3; millisec = 156
Year of simulation = 3
Rate of population change = 5180.209961

正如您所看到的,在执行我的代码时,我无法计算出正确的人口变化。这取决于秒,所以它会变化。

代码语言:javascript
复制
#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;
  }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-17 18:04:46

以下代码:

  1. 干净地编译
  2. 将功能分离为单独的可调用函数。
  3. 包含事件的适当顺序。
  4. 暗示模拟必须考虑到先前迭代的结果。
  5. 正确检查用户输入错误
  6. 您仍然需要完成‘processParameters()’函数
  7. processParameters()中,确保包含达到最大人口时的代码。

以下是拟议的守则:

代码语言:javascript
复制
#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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36679244

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档