Ir ao conteúdo

Posts recomendados

Postado

No estudo da dinâmica das populações, o modelo mais básico para o crescimento de uma
espécie é dado por:


N = N0ert


Onde N é o número de indivíduos em função do tempo, N0 é uma constante que representa o
número de indivíduos no início da contagem, r é a taxa de crescimento, que resulta da taxa de
natalidade menos a taxa de mortalidade e t representa o tempo. Escreva um programa que
calcule, para uma variação de t=0 até t=100, o crescimento populacional de uma espécie em
que ele recebe os valores para N0 e r. Note que o programa vai imprimir na tela uma tabela do
número de indivíduos com o passar do tempo. Note também que, para r negativo, o programa
não deve dar como resposta valores negativos para N; ou seja, quando a espécie se extinguir,
as saídas com o passar do tempo continuam a ser N=0.
 

Postado

amigo eu infelizmente não posso te ajudar. eu nunca vi este assunto antes, até dei uma pesquisada e compreendi bastante coisas a respeito, o problema não é programar o algoritmo e sim interpretar o enunciado logo que precisamos do valor de N, N0 ,R e T. . Acredito que para você que esta estudando este assunto seja algo muito simples. mas não desista tente resolver e poste sua tentativa,. boa sorte bons estudos.

Postado

@herbertbahia Tudo bem cara, obrigado ae. desculpa qualquer coisa.

adicionado 2 minutos depois
3 horas atrás, Lone_l disse:

@herbertbahia Tudo bem cara, obrigado ae. desculpa qualquer coisa.

#include <iostream>
#include <math.h>

using namespace std;

int main ()
{
  double t,r,Nzero;
  int N=0;

   cout << "Digite o numero de individuos:" << endl;
   cin >> Nzero;
   cout << "Digite a taxa de crescimento:" << endl;
   cin >> r;

   for(int N = 0; N<100; N++)
   {
   cout << exp(N) << endl;
   }

   for(int t = 0; t<100; t++)
   {
   cout << exp(t) << endl;
   }

   return 0;
}


 

  • Obrigado 1
Postado

Pelo que eu entendi, seria algo assim:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

/*
 * N = N0 ^ (RT)
 */

int main() {
    long n = 0;
    long n0 = 0;
    long r = 0;
    int t = 0;

    printf("Digite a quantidade inicial: ");
    scanf(" %li%*c", &n0);

    printf("Digite a taxa de crescimento: ");
    scanf(" %li%*c", &r);

    while (t < 100) {
        n = (long ) pow(n0, (r * t));
        printf("Tempo [ %3i ]: %li \n", t, n);
        t++;
    }

    return EXIT_SUCCESS;
}

Mas obtive resultados duvidosos...

  • Curtir 2
  • Amei 1
Postado
4 horas atrás, Lone_l disse:

Note também que, para r negativo, o programa
não deve dar como resposta valores negativos para N; ou seja, quando a espécie se extinguir,
as saídas com o passar do tempo continuam a ser N=0

 

Faz sentido já que morreu todo mundo 

 

A notação não ficou muito boa no enunciado :D poderia ser 

image.png.70ac3bc3a3237ef356c4fb6c4e268085.png

Se eu entendi direito. 

 

Em https://www.tutorialspoint.com/online_mathml_editor.php tem um editor de MathML online onde você pode digitar as coisas e copiar o resultado, enquanto o editor do forum aqui não chega a esse nível. É divertido.

 

Seu programa deve ser uma função com um único loop... Vou te mostrar um exemplo

 

 

 

adicionado 3 minutos depois
4 minutos atrás, AdrianoSiqueira disse:

Mas obtive resultados duvidosos...

 

Entendo. Não use pow num loop ou vai variar justamente na potência. Apenas multiplique pela base a cada loop. E quando e se morrer todo mundo continue mostrando zero... Acho que a fórmula é n * (r^t) e não como eu escrevi quando estava brincando de MathML

adicionado 4 minutos depois

Algo assim 
 

image.png.30894e3144552c5691688e82b1167751.png

  • Curtir 1
  • Amei 1
Postado

@arfneto a fórmula  é assim N=NO eRT

adicionado 1 minuto depois

@AdrianoSiqueira mas a formula e assim N=NO eRT, o e significa base natural que equivale a 2,71, ae esse valor de e 

e elevado r*t

adicionado 1 minuto depois

@arfneto

mas a formula e assim N=NO eRT, o e significa base natural que equivale a 2,71, ae esse valor de e 

e elevado r*t

  • Curtir 1
Postado
16 minutos atrás, Lone_l disse:

@arfneto a fórmula  é assim N=NO eRT

adicionado 1 minuto depois

@AdrianoSiqueira mas a formula e assim N=NO eRT, o e significa base natural que equivale a 2,71, ae esse valor de e 

e elevado r*t

adicionado 1 minuto depois

@arfneto

mas a formula e assim N=NO eRT, o e significa base natural que equivale a 2,71, ae esse valor de e 

e elevado r*t

 

Você poderia ter escrito algo assim:
onde 'e' é o numero de Euler. Ele é conhecido assim :) vou revisar a fórmula
 

image.png.2e089974609e0a61c198930b2832121b.png

 

Acertei afinal?

  • Curtir 2
Postado
35 minutos atrás, Lone_l disse:

mas a formula e assim N=NO eRT, o e significa base natural que equivale a 2,71, ae esse valor de e 

e elevado r*t

Poderia ter falado antes.... 😑 Eu achava que e significava "elevado" 😂

  • Curtir 1
  • Triste 1
Postado

Sei que não era para usar pow dentro do loop, mas.... Parece que funcionou, mas ainda acho esses resultados um tanto duvidosos.

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

// N = N0*e^(RT)

int main() {
    const double e = 2.71;

    double n = 0.0;
    double n0 = 0.0;
    double r = 0.0;
    int t = 0;

    printf("Digite a quantidade inicial: ");
    scanf(" %lf%*c", &n0);

    printf("Digite a taxa de crescimento: ");
    scanf(" %lf%*c", &r);

    while (t <= 100) {
        n = n0 * pow(e, (r * t));
        printf("Tempo [ %3i ]: %lf \n", t, n);
        t += 1;
    }

    return EXIT_SUCCESS;
}

 

  • Obrigado 1
Postado
7 minutos atrás, AdrianoSiqueira disse:

Eu achava que e significava "elevado"

 

:D até significa afinal: o número de euler elevado ao produto da taxa de crescimento multiplicada pelo tempo, e isso multiplicado pela população inicial.

 

Mas não estava escrito completamente em português ou em matemática. Eu espero ter acertado a fórmula afinal. E agradeço aos caras do site que tem o trem online pra gente usar. :D 

 

Mas eis o que eu não entendo: se você vai calcular todas as 100 primeiras gerações a taxa de crescimento sendo constante não pode simplesmente multiplicar a cada geração? Entendo que rapidamente o valor vai convergir para  a fórmula (na verdade o contrário), mas a fórmula existe para quando se quer calcular direto para a geração 822 por exemplo. Para calcular de 1 em 1 não faz sentido usar a fórmula. 


Para 10000 caras e uma taxa de 0.01 vamos ter para as primeiras 3 gerações

1 10000
2 10100
3 10201
4 10303

 

E a fórmula vai dar

1 10000
2 10100
3 10202
4 10304

Devido a arredondamento nas tabelas de logaritmos.

 

De todo modo a fórmula em C++ pode ser escrita em uma linha só

struct lib
{
    static int populacao(int Nz, double r, int t)
    {
        return (int)(Nz * exp(r*t));
    };
};

Algo assim já serviria. 

 

Mas uma função lambda seria mais legível até

auto pop = [](int Nz, double r, int t) { return (int)(Nz * exp(r * t)); };

Sim. Só uma linha. 
 

E já que estamos usando computadores, seria legal comparar os valores da tabela, já que eu disse que eles provavelmente vão convergir logo, e programas são pra isso mesmo.

 

Veja as primeiras gerações para uma população de 10.000 e uma taxa de 1% positiva e negativa e os resultados de um programa.
Sim, o programa vem depois.

 

10.000 a 1%

Numero de individuos: 10000
Taxa de crescimento: 0.01
Populacao Inicial: 10000
Taxa de Crescimento: 0.01
t = 0 N = 10000
t =    1        N =    10100  via Funcao:    10100 ou Lambda:    10100
t =    2        N =    10201  via Funcao:    10202 ou Lambda:    10202
t =    3        N =    10303  via Funcao:    10304 ou Lambda:    10304
t =    4        N =    10406  via Funcao:    10408 ou Lambda:    10408
t =    5        N =    10510  via Funcao:    10512 ou Lambda:    10512
t =    6        N =    10615  via Funcao:    10618 ou Lambda:    10618
t =    7        N =    10721  via Funcao:    10725 ou Lambda:    10725
t =    8        N =    10828  via Funcao:    10832 ou Lambda:    10832
t =    9        N =    10936  via Funcao:    10941 ou Lambda:    10941
t =   10        N =    11045  via Funcao:    11051 ou Lambda:    11051
t =   11        N =    11155  via Funcao:    11162 ou Lambda:    11162
t =   12        N =    11266  via Funcao:    11274 ou Lambda:    11274
t =   13        N =    11378  via Funcao:    11388 ou Lambda:    11388
t =   14        N =    11491  via Funcao:    11502 ou Lambda:    11502
t =   15        N =    11605  via Funcao:    11618 ou Lambda:    11618
t =   16        N =    11721  via Funcao:    11735 ou Lambda:    11735
t =   17        N =    11838  via Funcao:    11853 ou Lambda:    11853
t =   18        N =    11956  via Funcao:    11972 ou Lambda:    11972
t =   19        N =    12075  via Funcao:    12092 ou Lambda:    12092

10.000 a -1%

Numero de individuos: 10000
Taxa de crescimento: -0.01
Populacao Inicial: 10000
Taxa de Crescimento: -0.01
t = 0 N = 10000
t =    1        N =     9900  via Funcao:     9900 ou Lambda:     9900
t =    2        N =     9801  via Funcao:     9801 ou Lambda:     9801
t =    3        N =     9703  via Funcao:     9704 ou Lambda:     9704
t =    4        N =     9606  via Funcao:     9607 ou Lambda:     9607
t =    5        N =     9510  via Funcao:     9512 ou Lambda:     9512
t =    6        N =     9415  via Funcao:     9417 ou Lambda:     9417
t =    7        N =     9321  via Funcao:     9323 ou Lambda:     9323
t =    8        N =     9228  via Funcao:     9231 ou Lambda:     9231
t =    9        N =     9136  via Funcao:     9139 ou Lambda:     9139
t =   10        N =     9045  via Funcao:     9048 ou Lambda:     9048
t =   11        N =     8955  via Funcao:     8958 ou Lambda:     8958
t =   12        N =     8866  via Funcao:     8869 ou Lambda:     8869
t =   13        N =     8778  via Funcao:     8780 ou Lambda:     8780
t =   14        N =     8691  via Funcao:     8693 ou Lambda:     8693
t =   15        N =     8605  via Funcao:     8607 ou Lambda:     8607
t =   16        N =     8519  via Funcao:     8521 ou Lambda:     8521
t =   17        N =     8434  via Funcao:     8436 ou Lambda:     8436
t =   18        N =     8350  via Funcao:     8352 ou Lambda:     8352
t =   19        N =     8267  via Funcao:     8269 ou Lambda:     8269

E o programa

#include <iomanip>
#include <iostream>
#include <math.h>

using namespace std;

struct lib
{
    static int populacao(int Nz, double r, int t)
    {
        return (int)(Nz * exp(r*t));
    };
};

auto pop = [](int Nz, double r, int t) { return (int)(Nz * exp(r * t)); };

int main()
{
    double r;
    int Nzero = 0;

    cout << "Numero de individuos: " << flush;
    cin >> Nzero;
    cout << "Taxa de crescimento: " << flush;
    cin >> r;

    cout << "Populacao Inicial: " << Nzero << endl;
    cout << "Taxa de Crescimento: " << r << endl;

    int t = 0; // tempo inicial
    int v = Nzero; // populacao inicial
    cout << "t = " << t << " N = " << (int)v << endl;

    for (t = 1; t < 20; t += 1)
    {
        v = v + (int)(v * r);
        cout <<  "t = " << setw(4) << t << 
            "\tN = " << setw(8) << (int)v << 
            "  via Funcao: " << 
            setw(8) << lib::populacao(Nzero, r, t) << 
            " ou Lambda: " <<
            setw(8) << pop(Nzero, r, t) <<
            endl;
    };  // for()
    return 0;
}

Note que isso vai dar overflow rapidinho para taxas grandes... Convém testar a progressão. Está usando int

 

4 minutos atrás, AdrianoSiqueira disse:

Parece que funcionou, mas ainda acho esses resultados um tanto duvidosos

 

Use exp()  não pow() assim vai conseguir uma precisão muito maior.  Se for um trabalho de escola então... use mesmo

 

adicionado 11 minutos depois

Se alguém ficou curioso, a fórmula em MathML

<!DOCTYPE html>
<html lang="en">
<head>
</head>
<body>
<p>

<math xmlns="http://www.w3.org/1998/Math/MathML">
   <mi>N</mi> <mo>=</mo>
    
    <msub>
       <mi>N</mi>
       <mn>0</mn>
    </msub>
    
    <msup>
        <mi>e</mi>
       <mn>rt</mn>
    </msup>
</math>
<BR><BR>
onde 
<BR><BR>
    <mi>N</mi> <mo>=  </mo>
<mtext>população atual</mtext>
<BR>
<math xmlns="http://www.w3.org/1998/Math/MathML">
    <msub>
       <mi>N</mi>
       <mn>0</mn>
    </msub>
    <mo>=</mo>
<mtext>população inicial</mtext>
</math>
<BR>
<math xmlns="http://www.w3.org/1998/Math/MathML">
    <mi>e</mi>
    </msub>
    <mo>=</mo>
<mtext>número de Euler</mtext>
</math>
<BR>
<math xmlns="http://www.w3.org/1998/Math/MathML">
       <mi>r</mi>
    <mo>=</mo>
<mtext>taxa de crescimento</mtext>
</math>
<BR>
<math xmlns="http://www.w3.org/1998/Math/MathML">
       <mi>t</mi>
    <mo>=</mo>
<mtext>tempo em alguma unidade</mtext>
</math>
</p>
</body>
</html>

Pode salvar como html e abrir em qualquer navegador

adicionado 20 minutos depois

image.png.e86dda34e5abb2d82817c8b339b46252.pngimage.png.71d20b67ce90a7dc172b0c448f395de7.pngimage.png.bc3ea52aab0d4877183b197a51b0030b.png

O Edge é mais exigente: precisaria ter colocado o encoding :D Como sofrem os caras que escrevem para web ...

  • Curtir 2
  • Obrigado 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...