Principiante- programma c++ modello preda- predatore

di il
2 risposte

Principiante- programma c++ modello preda- predatore

Ciao a tutti! Sono ancora una principiante e sto cercando di creare un programma c++ che mi risolva le equazioni di Lotka-Volterra del modello preda predatore! Uso un algoritmo runge-kutta per risolvere le equazioni differenziali.
Ma il programma non sembra voler funzionare
Qualcuno mi saprebbe indicare gli errori?

#include <iostream>
#include <cmath>
 
using namespace std;
 
int N; double a,b,c,d;
 
double *predatore (double *y, double t)
{ 
  double *z = new double [2];
   
 
  z[0]=(a-(b*y[1]))*y[0];
  z[1]=((c*y[0])-d)*y[1];
   
   
return z;
};
 
double *(*funzione)(double *,double)=predatore; 
 
double *X (double H, double T_0, double *X_0, double *Y, int M)
 
{ double *K1,*K2,*K3,*K4;
 
double *k2 = new double [M];
 
double *k3 = new double [M];
 
double *k4 = new double [M];
 
 
K1 = funzione (X_0, T_0);
 
 
for (int i=0; i<M;i++) {k2[i]= X_0[i] + ((H/2)* K1[i]);};
K2 = funzione (k2 ,(T_0 + (H/2))); 
 
 
for (int i=0; i<M;i++) {k3[i]= X_0[i] +((H/2)*K2[i]);};
K3 = funzione (k3 ,(T_0 + (H/2)));
 
 
for (int i=0; i<M;i++) {k4[i]= X_0[i] +(H*K3[i]);};
K4 = funzione (k4 ,(T_0 + H));
 
 
for (int i=0; i<M; i++) {Y[i] = X_0[i] + ((H/6) * (K1[i] + (2*(K2[i])) + (2*(K3[i])) + K4[i]));
 
if (Y[i]<0) Y[i]=0.0;
 
 cout << Y[i]<< '\n'; };
 
 
  
}
 
int main () { 
 
int i;
double t_0,o, h;
 
 
N=2; 
cout << "a= ";cin >> a;cout<< "\nb= " ;cin>>b; cout <<"\nc= ";cin>> c;cout<<"\nd= "; cin >>d;
auto *x_0 = new double [N];
cout << " \n  indicami le componenti (" << N << ") di x_0 \n"; 
for (i=0;i<N;i++) {cin >> o; x_0[i]=o;};
cout << "\n   indicami h\n", cin >> h;
double *x = new double [N];
 
for (i=0; i<100; ++i ) { X(h, t_0, x_0, x, N); 
double c= ((a*(log(x[1])))- (b*(x[1])) -(c*(x[0]))+(d*(log(x[0])))); 
cout << "questo è c "<< c << '\n';
t_0+=h; x_0=x;}
 
 
}

2 Risposte

  • Re: Principiante- programma c++ modello preda- predatore

    Non "sembra voler funzionare" non è molto indicativo.

    Sei tu che devi dare i dettagli del malfunzionamento (e intendo dettagli !) per poter indagare eventuali cause nel codice ...
  • Re: Principiante- programma c++ modello preda- predatore

    Giusto
    Il programma di fatto dovrebbe risolvere le equazioni di Lotka- Volterra che sono
    x'=(a-b*y)*x
    y'=(c*x-d)*y

    la funzione "predatore" rappresenta proprio queste funzioni. La eguaglio al puntatore a funzione "funzione" così ci applico runge-kutta. Questo algoritmo permette di ottenere il valore della funzione, soluzione delle equazioni differenziali, ad un dato tempo t_0+h, noto il valore dell’incognita x all’“istante” t0 (valore iniziale che è 0). In main ho fatto un ciclo che dovrebbe rieseguire la funzione "X" ogni volta aggiungendo "h" al tempo e usando come condizione iniziale della x la x trovata al tempo precedente.
    I valori di x e y vengono ogni volta mandati in output sul terminale.
    Per controllare che il programma funzioni faccio scrivere ad ogni ciclo quella costante "c" (alla fine di main), quella è la costante del moto e dovrebbe rimanere uguale ad ogni iterazione:
    c= a*ln(y)-b*y-c*x+d*ln(x).
    Spero di essermi un pochino spiegata altrimenti ci riprovo
Devi accedere o registrarti per scrivere nel forum
2 risposte