integral doble
Publicado por ros (17 intervenciones) el 28/03/2009 00:05:48
buenas noches,
os escribo porque ya me duele la cabeza de darle vueltas y seguro que alguien con mas experiencia que yo, puede que vea el error rápido.
A ver estoy intentando hacer una integral doble, se trata de la potencia radiada por una antena, que si no os conoceis la formula, se trata de la integral entre 0 y 2PI y 0 yPI del patron de radiacion de esta...pues bueno, ps pongo mi codigo y no me da error ni de memoria ni de compilacion...solo es error de resultado, vamos que calculo mal la integral...
este es mi codigo, se trata de un dipolo y el resultado de la integral deberia ser 8.y ahora mismo no me acuerdo de los decimales pero la ganancia tiene que ser 1.77dB aprox.
aki esta;
float pattern(void)
{
float G=ZERO;
int nargin=ZERO;
int i=ZERO;
double *punt_C=NULL;
double C[181][361];
dipole_ant(C);
if(NULL!=C)
{
nargin++;
}
nargin++;
G=CalcGain(C,nargin);
return G;
}
void dipole_ant(double patt[181][361])
{
double single=ZERO;
int k=ZERO;
int l=ZERO;
double theta[180];
for(k=ZERO;k<180;k++)
{
theta[k]=k*d2r;
single=fabs(sin(theta[k]));
for(l=ZERO;l<360;l++)
{
patt[k][l]=single;
}
}
return;
}
float CalcGain(double C[181][361],int nargin)
{
double g[181][361];
float G=ZERO;
double Prad=ZERO;
int k=ZERO;
int l=ZERO;
if(TWO==nargin)
{
for(k=ZERO;k<180;k++)
{
for(l=ZERO;l<360;l++)
{
g[k][l] = fabs(C[k][1]);
g[k][l] = pow(g[k][l],2);
}
}
Prad=integral(g);
}
else
{
mexErrMsgTxt("Illegal number of arguments");
}
G =(float) 10*log10(4*PI/Prad);
return G;
}
double integral(double f[181][361])
{
int l=ZERO;
int k=ZERO;
double result=ZERO;
double delta_psi=ZERO;
double delta_phi=ZERO;
delta_psi=2*PI/360;
delta_phi=PI/180;
for(l=ZERO;l<361;l++)
{
for(k=ZERO;k<181;k++)
{
result=result+f[k][l]*sin(k*d2r)*delta_psi*delta_phi;
}
}
return result;
}
gracias y buenas noches!!
os escribo porque ya me duele la cabeza de darle vueltas y seguro que alguien con mas experiencia que yo, puede que vea el error rápido.
A ver estoy intentando hacer una integral doble, se trata de la potencia radiada por una antena, que si no os conoceis la formula, se trata de la integral entre 0 y 2PI y 0 yPI del patron de radiacion de esta...pues bueno, ps pongo mi codigo y no me da error ni de memoria ni de compilacion...solo es error de resultado, vamos que calculo mal la integral...
este es mi codigo, se trata de un dipolo y el resultado de la integral deberia ser 8.y ahora mismo no me acuerdo de los decimales pero la ganancia tiene que ser 1.77dB aprox.
aki esta;
float pattern(void)
{
float G=ZERO;
int nargin=ZERO;
int i=ZERO;
double *punt_C=NULL;
double C[181][361];
dipole_ant(C);
if(NULL!=C)
{
nargin++;
}
nargin++;
G=CalcGain(C,nargin);
return G;
}
void dipole_ant(double patt[181][361])
{
double single=ZERO;
int k=ZERO;
int l=ZERO;
double theta[180];
for(k=ZERO;k<180;k++)
{
theta[k]=k*d2r;
single=fabs(sin(theta[k]));
for(l=ZERO;l<360;l++)
{
patt[k][l]=single;
}
}
return;
}
float CalcGain(double C[181][361],int nargin)
{
double g[181][361];
float G=ZERO;
double Prad=ZERO;
int k=ZERO;
int l=ZERO;
if(TWO==nargin)
{
for(k=ZERO;k<180;k++)
{
for(l=ZERO;l<360;l++)
{
g[k][l] = fabs(C[k][1]);
g[k][l] = pow(g[k][l],2);
}
}
Prad=integral(g);
}
else
{
mexErrMsgTxt("Illegal number of arguments");
}
G =(float) 10*log10(4*PI/Prad);
return G;
}
double integral(double f[181][361])
{
int l=ZERO;
int k=ZERO;
double result=ZERO;
double delta_psi=ZERO;
double delta_phi=ZERO;
delta_psi=2*PI/360;
delta_phi=PI/180;
for(l=ZERO;l<361;l++)
{
for(k=ZERO;k<181;k++)
{
result=result+f[k][l]*sin(k*d2r)*delta_psi*delta_phi;
}
}
return result;
}
gracias y buenas noches!!
Valora esta pregunta


0