Uscita con valore 3221225477 c++

di il
18 risposte

Uscita con valore 3221225477 c++

Salve a tutti sono nuovo di questo forum come della programmazione in c++, sto scrivendo un programma con alcune function per un esercizio di un corso all'università.
Quando eseguo il programma questo dopo alcuni cicli si blocca per alcuni secondi e poi si arresta dando come uscita :
"Process exited after 7.767 seconds with return value 3221225477".
Di seguito vi riporto il programma,che vista la mia scarsa esperienza con c++ non sono riuscito a correggere, vi chiedo se per caso riuscite a notare l'errore e quindi se possibile avere una soluzione.
Chiedo subito scusa per la poca leggibilità del programma, ma è una delle cose che devo imparare e su cui devo lavorare.

#include <iostream>
#include <math.h>
#include <fstream>
#include <cstdlib>
#include <ctime>
using namespace std;
//parametri
const double mu=398600*pow(10.0,9);//costante gravità terrestre
const double Rt=6378000;//raggio terrestre
const double T=127500;//spinta
const double isp=280;//impulso specifico
const double d=2;//diametro lanciatore
const double rob=7078000;//raggio obiettivo
//condizioni iniziali
const double r0=Rt;//raggio iniziale
const double v0=0;//velocità iniziale
const double gam0=3.1415/2;//angolo di volo iniziale
const double m0=6491;//massa iniziale
const double csi0=0;//anomalia iniziale
const double alpha0=0;//angolo di attacco iniziale
const double g0=9.80665;//accelerazione di gravità sl
//tempo
const double bt=114;//tempo di accensione
const double dt=0.1;//passo di integrazione
//dichiarazione tempo
double tlo,tpo;//variabili da ottimizzare
void traiettoria(double tlo1,double tpo1);//valutazione fitness
double traiettoria1(double tlo,double tpo);//calcolo dati in uscita
void pso();//ottimizzatore
//programma prinicipale
int main(){
pso();
traiettoria(tlo,tpo);
system("pause");
return 0;
}
//ottimizzatore
void pso(){
int ni=200;//numero individui
int np=2;//numero parametri
int nc=100;//numero cicli
double lbtlo=3;//limite inferiore tempo di lift off
double ubtlo=12;//limite superiore tempo di lift off
double lbtpo=10;//limite inferiore tempo di pitch over
double ubtpo=35;//limite superiore tempo di pitch over
double p[ni][np],v[ni][np],bpg[2],bp[ni][np];
double bfg,fit[ni],bf[ni];
double tlo1,tpo1;
srand(time(0));
for(int i=0;i<ni;i++){
for(int j=0;j<np;j++){
p[j]=rand()%1000001/1000000.0;
};
bf=1000;
};
for(int i=0;i<ni;i++){
for(int j=0;j<np;j++){
v[j]=rand()%1000001/1000000.0;
};
};
bfg=1000;
for(int j=0;j<nc;j++){
cout <<j<<" "<<bfg<<endl;
for(int i=0;i<ni;i++){
tlo1=(ubtlo-lbtlo)*p[1]+lbtlo;
tpo1=(ubtpo-lbtpo)*p[2]+lbtpo;
fit=traiettoria1(tlo1,tpo1);
if(fit<bfg){
bfg=fit;
bpg[1]=p[1];
bpg[2]=p[2];
};
if(fit[i]<bf[i]){
bf[i]=fit[i];
bp[i][1]=p[i][1];
bp[i][2]=p[i][2];
};
srand(time(0));
v[i][1]=0.4*v[i][1]+0.5*(rand()%1001 /1000.0)*(bp[i][1]-p[i][1])+0.5*(rand()%1001 /1000.0)*(bpg[1]-p[i][1]);
v[i][1]=0.4*v[i][2]+0.5*(rand()%1001 /1000.0)*(bp[i][2]-p[i][2])+0.5*(rand()%1001 /1000.0)*(bpg[2]-p[i][2]);
p[i][1]=p[i][1]+v[i][1];
p[i][2]=p[i][2]+v[i][2];
};
};
tlo=(ubtlo-lbtlo)*bpg[1]+lbtlo;
tpo=(ubtpo-lbtpo)*bpg[2]+lbtpo;
};
//calcolo fitness
double traiettoria1(double tlo1,double tpo1){
int k,n=bt/dt;
double tspan[n];
double r[n],v[n],gam[n],m[n],csi[n],alpha[n];
double E,h,p,e,a,rmax;
long double fit;
r[0]=r0;
v[0]=v0;
gam[0]=gam0;
m[0]=m0;
csi[0]=csi0;
alpha[0]=alpha0;
tspan[0]=0;
// lift off
for(int i=0;i<tlo1/dt;i++){
r[i+1]=r[i]+v[i]*dt;
v[i+1]=v[i]+(-mu/(pow(r[i],2.0))+T/m[i])*dt;
gam[i+1]=gam[i];
m[i+1]=m[i]-T/(isp*9.80665)*1000*dt;
csi[i+1]=csi[i];
alpha[i+1]=alpha[i];
tspan[i+1]=tspan[i]+dt;
};
// pitch-over
for(int i=tlo1/dt;i<tpo1/dt;i++){
r[i+1]=r[i]+v[i]*sin(gam[i])*dt;
v[i+1]=v[i]+(-mu*sin(gam[i])/(pow(r[i],2.0))+T*cos(alpha[i])/m[i])*dt;
gam[i+1]=gam[i]+((pow(v[i],2.0)/r[i]-mu/pow(r[i],2.0))*cos(gam[i])+T*sin(alpha[i])/m[i])*dt/v[i];
m[i+1]=m[i]-T/(isp*9.80665)*1000*dt;
csi[i+1]=csi[i]+v[i]*cos(gam[i])/r[i]*dt;
alpha[i+1]=alpha[i]+(-3.1415/180+mu*cos(gam[i])/(pow(r[i],2.0)*v[i])-T*sin(alpha[i])/(m[i]*v[i]))*dt;
tspan[i+1]=tspan[i]+dt;
};
//gravity turn
for(int i=tpo1/dt;i<bt/dt;i++){
r[i+1]=r[i]+v[i]*sin(gam[i])*dt;
v[i+1]=v[i]+(-mu*sin(gam[i])/(pow(r[i],2.0))+T/m[i])*dt;
gam[i+1]=gam[i]+((pow(v[i],2.0)/r[i]-mu/pow(r[i],2.0))*cos(gam[i]))*dt/v[i];
m[i+1]=m[i]-T/(isp*9.80665)*1000*dt;
csi[i+1]=csi[i]+v[i]*cos(gam[i])/r[i]*dt;
if(i==tpo/dt){
alpha[i+1]=0;
}
else{
alpha[i+1]=alpha[i];
};
tspan[i+1]=tspan[i]+dt;
};
k=bt/dt;
E=-mu/r[k]+pow(v[k],2.0)/2;
a=-mu/(2*E);
h=r[k]*v[k]*cos(gam[k]);
p=pow(h,2.0)/mu;
e=sqrt(1-p/a);
rmax=a*(1+e);
fit=pow(pow(rmax-rob,2.0),0.5)/rob+E*2*rob/mu;
return fit;
};

void traiettoria(double tlo,double tpo){
int k,n=bt/dt;
double tspan[n];
double r[n],v[n],gam[n],m[n],csi[n],alpha[n];
double E,h,p,e,a,rmax;
ofstream raggio("raggio.txt");
ofstream velo("velocity.txt");
ofstream angolo("angolo di volo.txt");
ofstream massa("massa.txt");
ofstream anomalia("anomalia.txt");
ofstream attacco("angolo di attacco.txt");
r[0]=r0;
v[0]=v0;
gam[0]=gam0;
m[0]=m0;
csi[0]=csi0;
alpha[0]=alpha0;
tspan[0]=0;
raggio<<tspan[0]<<" "<<r[0]-Rt<<endl;
velo<<tspan[0]<<" "<<v[0]<<endl;
angolo<<tspan[0]<<" "<<gam[0]<<endl;
massa<<tspan[0]<<" "<<m[0]<<endl;
anomalia<<tspan[0]<<" "<<csi[0]<<endl;
attacco<<tspan[0]<<" "<<alpha[0]<<endl;
// lift off
for(int i=0;i<tlo/dt;i++){
r[i+1]=r[i]+v[i]*dt;
v[i+1]=v[i]+(-mu/(pow(r[i],2.0))+T/m[i])*dt;
gam[i+1]=gam[i];
m[i+1]=m[i]-T/(isp*9.80665)*1000*dt;
csi[i+1]=csi[i];
alpha[i+1]=alpha[i];
tspan[i+1]=tspan[i]+dt;
raggio<<tspan[i+1]<<" "<<r[i+1]-Rt<<endl;
velo<<tspan[i+1]<<" "<<v[i+1]<<endl;
angolo<<tspan[i+1]<<" "<<gam[i+1]<<endl;
massa<<tspan[i+1]<<" "<<m[i+1]<<endl;
anomalia<<tspan[i+1]<<" "<<csi[i+1]<<endl;
attacco<<tspan[i+1]<<" "<<alpha[i+1]<<endl;
};
// pitch-over
for(int i=tlo/dt;i<tpo/dt;i++){
r[i+1]=r[i]+v[i]*sin(gam[i])*dt;
v[i+1]=v[i]+(-mu*sin(gam[i])/(pow(r[i],2.0))+T*cos(alpha[i])/m[i])*dt;
gam[i+1]=gam[i]+((pow(v[i],2.0)/r[i]-mu/pow(r[i],2.0))*cos(gam[i])+T*sin(alpha[i])/m[i])*dt/v[i];
m[i+1]=m[i]-T/(isp*9.80665)*1000*dt;
csi[i+1]=csi[i]+v[i]*cos(gam[i])/r[i]*dt;
alpha[i+1]=alpha[i]+(-3.1415/180+mu*cos(gam[i])/(pow(r[i],2.0)*v[i])-T*sin(alpha[i])/(m[i]*v[i]))*dt;
tspan[i+1]=tspan[i]+dt;
raggio<<tspan[i+1]<<" "<<r[i+1]-Rt<<endl;
velo<<tspan[i+1]<<" "<<v[i+1]<<endl;
angolo<<tspan[i+1]<<" "<<gam[i+1]<<endl;
massa<<tspan[i+1]<<" "<<m[i+1]<<endl;
anomalia<<tspan[i+1]<<" "<<csi[i+1]<<endl;
attacco<<tspan[i+1]<<" "<<alpha[i+1]<<endl;
};
//gravity turn
for(int i=tpo/dt;i<bt/dt;i++){
r[i+1]=r[i]+v[i]*sin(gam[i])*dt;
v[i+1]=v[i]+(-mu*sin(gam[i])/(pow(r[i],2.0))+T/m[i])*1000*dt;
gam[i+1]=gam[i]+((pow(v[i],2.0)/r[i]-mu/pow(r[i],2.0))*cos(gam[i]))*dt/v[i];
m[i+1]=m[i]-T/(isp*9.80665)*dt;
csi[i+1]=csi[i]+v[i]*cos(gam[i])/r[i]*dt;
if(i==tpo/dt){
alpha[i+1]=0;
}
else{
alpha[i+1]=alpha[i];
};
tspan[i+1]=tspan[i]+dt;
raggio<<tspan[i+1]<<" "<<r[i+1]-Rt<<endl;
velo<<tspan[i+1]<<" "<<v[i+1]<<endl;
angolo<<tspan[i+1]<<" "<<gam[i+1]<<endl;
massa<<tspan[i+1]<<" "<<m[i+1]<<endl;
anomalia<<tspan[i+1]<<" "<<csi[i+1]<<endl;
attacco<<tspan[i+1]<<" "<<alpha[i+1]<<endl;
};
raggio.close();
velo.close();
angolo.close();
massa.close();
anomalia.close();
attacco.close();
k=bt/dt;
E=-mu/r[k]+pow(v[k],2.0)/2;
a=-mu/(2*E);
h=r[k]*v[k]*cos(gam[k]);
p=pow(h,2.0)/mu;
e=sqrt(1-p/a);
rmax=a*(1+e);
cout<<"la quota raggiunta all'apogeo e' "<<rmax-Rt<<endl;
}

18 Risposte

  • Re: Uscita con valore 3221225477 c++

    Metti i tag code al codice
  • Re: Uscita con valore 3221225477 c++

    Visto che nel main hai 'return 0', il programma 'schianta' per qualche altro motivo.
    I secondi impiegati solo legati alla creazione del 'core dump' da parte di windows.
  • Re: Uscita con valore 3221225477 c++

    Quel valore convertito in esadecimale è C0000005 ovvero il codice d'errore di una violazione di accesso in memoria.

    Sicuramente per un puntatore sballato.

    Ma se non posti il codice con i tag CODE non si capisce nulla e non si può correggere.
  • Re: Uscita con valore 3221225477 c++

    Scusate, ora ho usato il code tag, non so se ora è meglio.
    #include <iostream>
    #include <math.h>
    #include <fstream>
    #include <cstdlib>
    #include <ctime>
    using namespace std;
    //parametri
    const double mu=398600*pow(10.0,9);//costante gravità terrestre
    const double Rt=6378000;//raggio terrestre
    const double T=127500;//spinta
    const double isp=280;//impulso specifico
    const double d=2;//diametro lanciatore
    const double rob=7078000;//raggio obiettivo
    //condizioni iniziali
    const double r0=Rt;//raggio iniziale
    const double v0=0;//velocità iniziale
    const double gam0=3.1415/2;//angolo di volo iniziale
    const double m0=6491;//massa iniziale
    const double csi0=0;//anomalia iniziale
    const double alpha0=0;//angolo di attacco iniziale 
    const double g0=9.80665;//accelerazione di gravità sl
    //tempo
    const double bt=114;//tempo di accensione 
    const double dt=0.1;//passo di integrazione
    //dichiarazione tempo
    double tlo,tpo;//variabili da ottimizzare
    void traiettoria(double tlo1,double tpo1);//valutazione fitness
    double traiettoria1(double tlo,double tpo);//calcolo dati in uscita
    void pso();//ottimizzatore
    //programma prinicipale
    int main(){
    	pso();
    	traiettoria(tlo,tpo);
    	system("pause");
    	return 0;	
    }
    //ottimizzatore
    void pso(){
    	int ni=200;//numero individui
    	int np=2;//numero parametri
    	int nc=1000;//numero cicli
    	double lbtlo=3;//limite inferiore tempo di lift off
    	double ubtlo=12;//limite superiore tempo di lift off
    	double lbtpo=10;//limite inferiore tempo di pitch over
    	double ubtpo=35;//limite superiore tempo di pitch over
    	double p[ni][np],v[ni][np],bpg[2],bp[ni][np];
        double bfg,fit[ni],bf[ni];
    	double tlo1,tpo1;
    	srand(time(0));
    	for(int i=0;i<ni;i++){
    		for(int j=0;j<np;j++){
    			p[i][j]=rand()%1000001/1000000.0;
    		};
    		bf[i]=1000;
    	};
    	for(int i=0;i<ni;i++){
    		for(int j=0;j<np;j++){
    			v[i][j]=rand()%1000001/1000000.0;
    		};
    	};
    	bfg=1000;
    	for(int j=0;j<nc;j++){
    		cout <<j<<" "<<bfg<<endl;
    		for(int i=0;i<ni;i++){
    			tlo1=(ubtlo-lbtlo)*p[i][1]+lbtlo;
    			tpo1=(ubtpo-lbtpo)*p[i][2]+lbtpo;
    			fit[i]=traiettoria1(tlo1,tpo1);
    			if(fit[i]<bfg){
    				bfg=fit[i];
    				bpg[1]=p[i][1];
    				bpg[2]=p[i][2];
    			};
    			if(fit[i]<bf[i]){
    				bf[i]=fit[i];
    				bp[i][1]=p[i][1];
    				bp[i][2]=p[i][2];
    			};
    			srand(time(0));
    			v[i][1]=0.4*v[i][1]+0.5*(rand()%1001 /1000.0)*(bp[i][1]-p[i][1])+0.5*(rand()%1001 /1000.0)*(bpg[1]-p[i][1]);
    			v[i][1]=0.4*v[i][2]+0.5*(rand()%1001 /1000.0)*(bp[i][2]-p[i][2])+0.5*(rand()%1001 /1000.0)*(bpg[2]-p[i][2]);
    			p[i][1]=p[i][1]+v[i][1];
    			p[i][2]=p[i][2]+v[i][2];
    		};
    	};
    	tlo=(ubtlo-lbtlo)*bpg[1]+lbtlo;
    	tpo=(ubtpo-lbtpo)*bpg[2]+lbtpo;
    };
    //calcolo fitness
    double traiettoria1(double tlo1,double tpo1){
    	int k,n=bt/dt;
    	double tspan[n];
    	double r[n],v[n],gam[n],m[n],csi[n],alpha[n];
    	double E,h,p,e,a,rmax;
    	long double fit;
    	r[0]=r0;
    	v[0]=v0;
    	gam[0]=gam0;
    	m[0]=m0;
    	csi[0]=csi0;
    	alpha[0]=alpha0;
    	tspan[0]=0;
    	// lift off
    	for(int i=0;i<tlo1/dt;i++){
    		r[i+1]=r[i]+v[i]*dt;
    		v[i+1]=v[i]+(-mu/(pow(r[i],2.0))+T/m[i])*dt;
    		gam[i+1]=gam[i];
    		m[i+1]=m[i]-T/(isp*9.80665)*dt;
    		csi[i+1]=csi[i];
    		alpha[i+1]=alpha[i];
    		tspan[i+1]=tspan[i]+dt;
    	};
    	// pitch-over
    	for(int i=tlo1/dt;i<tpo1/dt;i++){
    	r[i+1]=r[i]+v[i]*sin(gam[i])*dt;
    		v[i+1]=v[i]+(-mu*sin(gam[i])/(pow(r[i],2.0))+T*cos(alpha[i])/m[i])*dt;
    		gam[i+1]=gam[i]+((pow(v[i],2.0)/r[i]-mu/pow(r[i],2.0))*cos(gam[i])+T*sin(alpha[i])/m[i])*dt/v[i];
    		m[i+1]=m[i]-T/(isp*9.80665)*dt;
    		csi[i+1]=csi[i]+v[i]*cos(gam[i])/r[i]*dt;
    		alpha[i+1]=alpha[i]+(-3.1415/180+mu*cos(gam[i])/(pow(r[i],2.0)*v[i])-T*sin(alpha[i])/(m[i]*v[i]))*dt;
    		tspan[i+1]=tspan[i]+dt;
    	};
    		//gravity turn
    	for(int i=tpo1/dt;i<bt/dt;i++){
    		r[i+1]=r[i]+v[i]*sin(gam[i])*dt;
    		v[i+1]=v[i]+(-mu*sin(gam[i])/(pow(r[i],2.0))+T/m[i])*dt;
    		gam[i+1]=gam[i]+((pow(v[i],2.0)/r[i]-mu/pow(r[i],2.0))*cos(gam[i]))*dt/v[i];
    		m[i+1]=m[i]-T/(isp*9.80665)*dt;
    		csi[i+1]=csi[i]+v[i]*cos(gam[i])/r[i]*dt;
    		if(i==tpo/dt){
    			alpha[i+1]=0;
    		}
    		else{
    		alpha[i+1]=alpha[i];
    	};
    		tspan[i+1]=tspan[i]+dt;
    	};
    	k=bt/dt;
    	E=-mu/r[k]+pow(v[k],2.0)/2;
    	a=-mu/(2*E);
    	h=r[k]*v[k]*cos(gam[k]);
    	p=pow(h,2.0)/mu;
    	e=sqrt(1-p/a);
    	rmax=a*(1+e);
    	fit=200*sqrt((rmax-rob,2.0))/rob+E*2*rob/mu;
    	return fit;
    };
    
    void traiettoria(double tlo,double tpo){
    	int k,n=bt/dt;
    	double tspan[n];
    	double r[n],v[n],gam[n],m[n],csi[n],alpha[n];
    	double E,h,p,e,a,rmax;
    	ofstream raggio("raggio.txt");
    	ofstream velo("velocity.txt");
    	ofstream angolo("angolo di volo.txt");	
    	ofstream massa("massa.txt");
    	ofstream anomalia("anomalia.txt");	
    	ofstream attacco("angolo di attacco.txt");
    	r[0]=r0;
    	v[0]=v0;
    	gam[0]=gam0;
    	m[0]=m0;
    	csi[0]=csi0;
    	alpha[0]=alpha0;
    	tspan[0]=0;
    	raggio<<tspan[0]<<" "<<r[0]-Rt<<endl;
    	velo<<tspan[0]<<" "<<v[0]<<endl;
    	angolo<<tspan[0]<<" "<<gam[0]<<endl;
    	massa<<tspan[0]<<" "<<m[0]<<endl;
    	anomalia<<tspan[0]<<" "<<csi[0]<<endl;
    	attacco<<tspan[0]<<" "<<alpha[0]<<endl;
    	// lift off
    	for(int i=0;i<tlo/dt;i++){
    		r[i+1]=r[i]+v[i]*dt;
    		v[i+1]=v[i]+(-mu/(pow(r[i],2.0))+T/m[i])*dt;
    		gam[i+1]=gam[i];
    		m[i+1]=m[i]-T/(isp*9.80665)*dt;
    		csi[i+1]=csi[i];
    		alpha[i+1]=alpha[i];
    		tspan[i+1]=tspan[i]+dt;
    		raggio<<tspan[i+1]<<" "<<r[i+1]-Rt<<endl;
    	    velo<<tspan[i+1]<<" "<<v[i+1]<<endl;
    	    angolo<<tspan[i+1]<<" "<<gam[i+1]<<endl;
    	    massa<<tspan[i+1]<<" "<<m[i+1]<<endl;
    	    anomalia<<tspan[i+1]<<" "<<csi[i+1]<<endl;
    	    	attacco<<tspan[i+1]<<" "<<alpha[i+1]<<endl;
    	};
    	// pitch-over
    	for(int i=tlo/dt;i<tpo/dt;i++){
    	r[i+1]=r[i]+v[i]*sin(gam[i])*dt;
    		v[i+1]=v[i]+(-mu*sin(gam[i])/(pow(r[i],2.0))+T*cos(alpha[i])/m[i])*dt;
    		gam[i+1]=gam[i]+((pow(v[i],2.0)/r[i]-mu/pow(r[i],2.0))*cos(gam[i])+T*sin(alpha[i])/m[i])*dt/v[i];
    		m[i+1]=m[i]-T/(isp*9.80665)*dt;
    		csi[i+1]=csi[i]+v[i]*cos(gam[i])/r[i]*dt;
    		alpha[i+1]=alpha[i]+(-3.1415/180+mu*cos(gam[i])/(pow(r[i],2.0)*v[i])-T*sin(alpha[i])/(m[i]*v[i]))*dt;
    		tspan[i+1]=tspan[i]+dt;
    		raggio<<tspan[i+1]<<" "<<r[i+1]-Rt<<endl;
    	    velo<<tspan[i+1]<<" "<<v[i+1]<<endl;
    	    angolo<<tspan[i+1]<<" "<<gam[i+1]<<endl;
    	    massa<<tspan[i+1]<<" "<<m[i+1]<<endl;
    	    anomalia<<tspan[i+1]<<" "<<csi[i+1]<<endl;
    	    	attacco<<tspan[i+1]<<" "<<alpha[i+1]<<endl;	
    	};
    	//gravity turn
    	for(int i=tpo/dt;i<bt/dt;i++){
    		r[i+1]=r[i]+v[i]*sin(gam[i])*dt;
    		v[i+1]=v[i]+(-mu*sin(gam[i])/(pow(r[i],2.0))+T/m[i])*dt;
    		gam[i+1]=gam[i]+((pow(v[i],2.0)/r[i]-mu/pow(r[i],2.0))*cos(gam[i]))*dt/v[i];
    		m[i+1]=m[i]-T/(isp*9.80665)*dt;
    		csi[i+1]=csi[i]+v[i]*cos(gam[i])/r[i]*dt;
    		if(i==tpo/dt){
    			alpha[i+1]=0;
    		}
    		else{
    		alpha[i+1]=alpha[i];
    	};
    		tspan[i+1]=tspan[i]+dt;
    		raggio<<tspan[i+1]<<" "<<r[i+1]-Rt<<endl;
    	    velo<<tspan[i+1]<<" "<<v[i+1]<<endl;
    	    angolo<<tspan[i+1]<<" "<<gam[i+1]<<endl;
    	    massa<<tspan[i+1]<<" "<<m[i+1]<<endl;
    	    anomalia<<tspan[i+1]<<" "<<csi[i+1]<<endl;
    	    	attacco<<tspan[i+1]<<" "<<alpha[i+1]<<endl;	
    	};
    	raggio.close();
    	velo.close();
    	angolo.close();
    	massa.close();
    	anomalia.close();
    	attacco.close();
    	k=bt/dt;
    	E=-mu/r[k]+pow(v[k],2.0)/2;
    	a=-mu/(2*E);
    	h=r[k]*v[k]*cos(gam[k]);
    	p=pow(h,2.0)/mu;
    	e=sqrt(1-p/a);
    	rmax=a*(1+e);
    	cout<<"la quota raggiunta all'apogeo e' "<<rmax-Rt<<endl;	
    }
  • Re: Uscita con valore 3221225477 c++

    In base a dove in genere mi si presenta l'uscita, cioè dopo un numero variabile di cicli, penso che l'errore si trovi in traiettoria1 o in pso
  • Re: Uscita con valore 3221225477 c++

    Sembra che il problema stia in

    n=bt/dt;

    Per problemi di approssimazione nella for si arriva oltre questo valore. Prova a usare

    n=bt/dt + 1;
  • Re: Uscita con valore 3221225477 c++

    Ho provato solo che l'errore si presenta comunque
  • Re: Uscita con valore 3221225477 c++

    Ho visto anche che ci sono altri problemi nel calcolo dei valori di alcuni indici che devi controllare tu.
    Ad esempio in traiettoria1 se aggiungi

    // pitch-over
    int test = tpo1 / dt;
    printf("test %f %f %d\n", tpo1, dt, test);

    vedrai sempre valori intorno a 102 103 ma un valore sballato nell'ultima chiamata ...
  • Re: Uscita con valore 3221225477 c++

    Si effettivamente la cosa strana è anche che questi valori superano pure quelli che avrei imposto in pso durante la chiamata
  • Re: Uscita con valore 3221225477 c++

    Ma sbaglio io oppure esistono

    p[ i ][0] e p[ i ][1]

    e non

    p[ i ][1] e p[ i ][2]

    come scrivi tu nel codice?

    E lo stesso discorso per v
  • Re: Uscita con valore 3221225477 c++

    Grazie mille,il problema era la formazione di questi valori anomali.
    Mi ero scordato di mettere un controllo sui limiti di questi valori.
    Grazie ancora
  • Re: Uscita con valore 3221225477 c++

    Si ho usato p[0] e p[1], perchè avevo letto che in c++ l'indice nei vettori inizia da 0 e non da 1.
  • Re: Uscita con valore 3221225477 c++

    Non ho capito ... hai usato 0 e 1 ma nel codice c'è 1 e 2 sia per p che per altri vettori

    Adesso qual è il codice che usi?
  • Re: Uscita con valore 3221225477 c++

    Il codice attuale è:
    
    #include <iostream>
    #include <math.h>
    #include <fstream>
    #include <cstdlib>
    #include <ctime>
    using namespace std;
    //parametri
    const double mu=398600*pow(10.0,9);//costante gravità terrestre
    const double Rt=6378000;//raggio terrestre
    const double T=127500;//spinta
    const double isp=280;//impulso specifico
    const double d=2;//diametro lanciatore
    const double rob=7078000;//raggio obiettivo
    //condizioni iniziali
    const double r0=Rt;//raggio iniziale
    const double v0=0;//velocità iniziale
    const double gam0=3.1415/2;//angolo di volo iniziale
    const double m0=6491;//massa iniziale
    const double csi0=0;//anomalia iniziale
    const double alpha0=0;//angolo di attacco iniziale 
    const double g0=9.80665;//accelerazione di gravità sl
    //tempo
    const double bt=114;//tempo di accensione 
    const double dt=0.1;//passo di integrazione
    //dichiarazione tempo
    double tlo,tpo;//variabili da ottimizzare
    void traiettoria(double tlo1,double tpo1);//valutazione fitness
    double traiettoria1(double tlo,double tpo);//calcolo dati in uscita
    void pso();//ottimizzatore
    //programma prinicipale
    int main(){
    	pso();
    	traiettoria(tlo,tpo);
    	system("pause");
    	return 0;	
    }
    //ottimizzatore
    void pso(){
    	int ni=200;//numero individui
    	int np=2;//numero parametri
    	int nc=1000;//numero cicli
    	double lbtlo=3.0;//limite inferiore tempo di lift off
    	double ubtlo=12.0;//limite superiore tempo di lift off
    	double lbtpo=10.0;//limite inferiore tempo di pitch over
    	double ubtpo=35.0;//limite superiore tempo di pitch over
    	double p[ni][np],v[ni][np],bpg[2],bp[ni][np];
        double bfg,fit[ni],bf[ni];
    	double tlo1,tpo1;
    	srand(time(0));
    	for(int i=0;i<ni;i++){
    		for(int j=0;j<np;j++){
    			p[i][j]=rand()%1000001/1000000.0;
    		};
    		bf[i]=1000;
    	};
    	for(int i=0;i<ni;i++){
    		for(int j=0;j<np;j++){
    			v[i][j]=rand()%1000001/1000000.0;
    		};
    	};
    	bfg=1000;
    	for(int j=0;j<nc;j++){
    		cout <<j<<" "<<bfg<<endl;
    		for(int i=0;i<ni;i++){
    			tlo1=(ubtlo-lbtlo)*p[i][1]+lbtlo;
    			tpo1=(ubtpo-lbtpo)*p[i][2]+lbtpo;
    			fit[i]=traiettoria1(tlo1,tpo1);
    			if(fit[i]<bfg){
    				bfg=fit[i];
    				bpg[1]=p[i][1];
    				bpg[2]=p[i][2];
    			};
    			if(fit[i]<bf[i]){
    				bf[i]=fit[i];
    				bp[i][1]=p[i][1];
    				bp[i][2]=p[i][2];
    			};
    			srand(time(0));
    			v[i][1]=0.4*v[i][1]+0.5*(rand()%1001/1000.0)*(bp[i][1]-p[i][1])+0.5*(rand()%1001/1000.0)*(bpg[1]-p[i][1]);
    			v[i][1]=0.4*v[i][2]+0.5*(rand()%1001/1000.0)*(bp[i][2]-p[i][2])+0.5*(rand()%1001/1000.0)*(bpg[2]-p[i][2]);
    			p[i][1]=p[i][1]+v[i][1];
    			p[i][2]=p[i][2]+v[i][2];
    			if(p[i][1]>1)p[i][1]=1;
    			else if(p[i][1]<0){
    			p[i][1]=0;
    			};
    			if(p[i][2]>1)p[i][2]=1;
    			else if(p[i][2]<0){
    			p[i][2]=0;
    			};
    		};
    	};
    	tlo=(ubtlo-lbtlo)*bpg[1]+lbtlo;
    	tpo=(ubtpo-lbtpo)*bpg[2]+lbtpo;
    };
    //calcolo fitness
    double traiettoria1(double tlo1,double tpo1){
    	int k,n=bt/dt+1;
    	double tspan[n];
    	double r[n],v[n],gam[n],m[n],csi[n],alpha[n];
    	double E,h,p,e,a,rmax;
    	double fit;
    	r[0]=r0;
    	v[0]=v0;
    	gam[0]=gam0;
    	m[0]=m0;
    	csi[0]=csi0;
    	alpha[0]=alpha0;
    	tspan[0]=0;
    	// lift off
    	for(int i=0;i<tlo1/dt;i++){
    		r[i+1]=r[i]+v[i]*dt;
    		v[i+1]=v[i]+(-mu/(pow(r[i],2.0))+T/m[i])*dt;
    		gam[i+1]=gam[i];
    		m[i+1]=m[i]-T/(isp*9.80665)*dt;
    		csi[i+1]=csi[i];
    		alpha[i+1]=alpha[i];
    		tspan[i+1]=tspan[i]+dt;
    	};
    	// pitch-over
    
    	for(int i=tlo1/dt;i<tpo1/dt;i++){
    	r[i+1]=r[i]+v[i]*sin(gam[i])*dt;
    		v[i+1]=v[i]+(-mu*sin(gam[i])/(pow(r[i],2.0))+T*cos(alpha[i])/m[i])*dt;
    		gam[i+1]=gam[i]+((pow(v[i],2.0)/r[i]-mu/pow(r[i],2.0))*cos(gam[i])+T*sin(alpha[i])/m[i])*dt/v[i];
    		m[i+1]=m[i]-T/(isp*9.80665)*dt;
    		csi[i+1]=csi[i]+v[i]*cos(gam[i])/r[i]*dt;
    		alpha[i+1]=alpha[i]+(-3.1415/180+mu*cos(gam[i])/(pow(r[i],2.0)*v[i])-T*sin(alpha[i])/(m[i]*v[i]))*dt;
    		tspan[i+1]=tspan[i]+dt;
    	};
    		//gravity turn
    	for(int i=tpo1/dt;i<bt/dt;i++){
    		r[i+1]=r[i]+v[i]*sin(gam[i])*dt;
    		v[i+1]=v[i]+(-mu*sin(gam[i])/(pow(r[i],2.0))+T/m[i])*dt;
    		gam[i+1]=gam[i]+((pow(v[i],2.0)/r[i]-mu/pow(r[i],2.0))*cos(gam[i]))*dt/v[i];
    		m[i+1]=m[i]-T/(isp*9.80665)*dt;
    		csi[i+1]=csi[i]+v[i]*cos(gam[i])/r[i]*dt;
    		if(i==(int)tpo){
    			alpha[i+1]=0;
    		}
    		else{
    		alpha[i+1]=alpha[i];
    	};
    		tspan[i+1]=tspan[i]+dt;
    	};
    	k=bt/dt;
    	E=-mu/r[k]+pow(v[k],2.0)/2;
    	a=-mu/(2*E);
    	h=r[k]*v[k]*cos(gam[k]);
    	p=pow(h,2.0)/mu;
    	e=sqrt(1-p/a);
    	rmax=a*(1+e);
    	if(rmax>rob){
    	fit=200*(rmax-rob)/rob+E*2*rob/mu;
    }
    else{
    	fit=200*(rob-rmax)/rob+E*2*rob/mu;
    };
    	return fit;
    };
    
    void traiettoria(double tlo,double tpo){
    	int k,n=bt/dt+1;
    	double tspan[n];
    	double r[n],v[n],gam[n],m[n],csi[n],alpha[n];
    	double E,h,p,e,a,rmax;
    	ofstream raggio("raggio.txt");
    	ofstream velo("velocity.txt");
    	ofstream angolo("angolo di volo.txt");	
    	ofstream massa("massa.txt");
    	ofstream anomalia("anomalia.txt");	
    	ofstream attacco("angolo di attacco.txt");
    	r[0]=r0;
    	v[0]=v0;
    	gam[0]=gam0;
    	m[0]=m0;
    	csi[0]=csi0;
    	alpha[0]=alpha0;
    	tspan[0]=0;
    	raggio<<tspan[0]<<" "<<r[0]-Rt<<endl;
    	velo<<tspan[0]<<" "<<v[0]<<endl;
    	angolo<<tspan[0]<<" "<<gam[0]<<endl;
    	massa<<tspan[0]<<" "<<m[0]<<endl;
    	anomalia<<tspan[0]<<" "<<csi[0]<<endl;
    	attacco<<tspan[0]<<" "<<alpha[0]<<endl;
    	// lift off
    	for(int i=0;i<tlo/dt;i++){
    		r[i+1]=r[i]+v[i]*dt;
    		v[i+1]=v[i]+(-mu/(pow(r[i],2.0))+T/m[i])*dt;
    		gam[i+1]=gam[i];
    		m[i+1]=m[i]-T/(isp*9.80665)*dt;
    		csi[i+1]=csi[i];
    		alpha[i+1]=alpha[i];
    		tspan[i+1]=tspan[i]+dt;
    		raggio<<tspan[i+1]<<" "<<r[i+1]-Rt<<endl;
    	    velo<<tspan[i+1]<<" "<<v[i+1]<<endl;
    	    angolo<<tspan[i+1]<<" "<<gam[i+1]<<endl;
    	    massa<<tspan[i+1]<<" "<<m[i+1]<<endl;
    	    anomalia<<tspan[i+1]<<" "<<csi[i+1]<<endl;
    	    	attacco<<tspan[i+1]<<" "<<alpha[i+1]<<endl;
    	};
    	// pitch-over
    	for(int i=tlo/dt;i<tpo/dt;i++){
    	r[i+1]=r[i]+v[i]*sin(gam[i])*dt;
    		v[i+1]=v[i]+(-mu*sin(gam[i])/(pow(r[i],2.0))+T*cos(alpha[i])/m[i])*dt;
    		gam[i+1]=gam[i]+((pow(v[i],2.0)/r[i]-mu/pow(r[i],2.0))*cos(gam[i])+T*sin(alpha[i])/m[i])*dt/v[i];
    		m[i+1]=m[i]-T/(isp*9.80665)*dt;
    		csi[i+1]=csi[i]+v[i]*cos(gam[i])/r[i]*dt;
    		alpha[i+1]=alpha[i]+(-3.1415/180+mu*cos(gam[i])/(pow(r[i],2.0)*v[i])-T*sin(alpha[i])/(m[i]*v[i]))*dt;
    		tspan[i+1]=tspan[i]+dt;
    		raggio<<tspan[i+1]<<" "<<r[i+1]-Rt<<endl;
    	    velo<<tspan[i+1]<<" "<<v[i+1]<<endl;
    	    angolo<<tspan[i+1]<<" "<<gam[i+1]<<endl;
    	    massa<<tspan[i+1]<<" "<<m[i+1]<<endl;
    	    anomalia<<tspan[i+1]<<" "<<csi[i+1]<<endl;
    	    	attacco<<tspan[i+1]<<" "<<alpha[i+1]<<endl;	
    	};
    	//gravity turn
    	for(int i=tpo/dt;i<bt/dt;i++){
    		r[i+1]=r[i]+v[i]*sin(gam[i])*dt;
    		v[i+1]=v[i]+(-mu*sin(gam[i])/(pow(r[i],2.0))+T/m[i])*dt;
    		gam[i+1]=gam[i]+((pow(v[i],2.0)/r[i]-mu/pow(r[i],2.0))*cos(gam[i]))*dt/v[i];
    		m[i+1]=m[i]-T/(isp*9.80665)*dt;
    		csi[i+1]=csi[i]+v[i]*cos(gam[i])/r[i]*dt;
    		if(i==tpo/dt){
    			alpha[i+1]=0;
    		}
    		else{
    		alpha[i+1]=alpha[i];
    	};
    		tspan[i+1]=tspan[i]+dt;
    		raggio<<tspan[i+1]<<" "<<r[i+1]-Rt<<endl;
    	    velo<<tspan[i+1]<<" "<<v[i+1]<<endl;
    	    angolo<<tspan[i+1]<<" "<<gam[i+1]<<endl;
    	    massa<<tspan[i+1]<<" "<<m[i+1]<<endl;
    	    anomalia<<tspan[i+1]<<" "<<csi[i+1]<<endl;
    	    	attacco<<tspan[i+1]<<" "<<alpha[i+1]<<endl;	
    	};
    	raggio.close();
    	velo.close();
    	angolo.close();
    	massa.close();
    	anomalia.close();
    	attacco.close();
    	k=bt/dt;
    	E=-mu/r[k]+pow(v[k],2.0)/2;
    	a=-mu/(2*E);
    	h=r[k]*v[k]*cos(gam[k]);
    	p=pow(h,2.0)/mu;
    	e=sqrt(1-p/a);
    	rmax=a*(1+e);
    	cout<<"la quota raggiunta all'apogeo e' "<<rmax-Rt<<endl;	
    }
    
Devi accedere o registrarti per scrivere nel forum
18 risposte