2017-06-18 12 views
-2

私はlog10(E)の最初の値として上限と下限を指定してEに関して積分する必要があります。 mの印刷と、同じ列の最後の値としての上限が含まれます。 My機能は次のとおりです。何もありませんが、私のcorrectedDiffluxが、ここで定義され FO E^-spectralindex EXP(-tau1)、。 [この関数wrt E]。ここでは簡略化のために 'v'と 'w'を下限と上限として取っていますが、私がここで行っている統合はこれらに対して正しい値を与えていません。 私のコード:あなたはいくつかの助けが必要であることをコメントし、この関数で私はCで統合したい複数変数関数を持っています(台形ルール)

#include<stdio.h> 
#include<stdlib.h> 
#include<math.h> 
float ebl(float zz, float ee) // Function ebl assigned for returning ta3 
value to be used later 
{ 



float e1, e2, z1, z2, tau_a, tau_b, ta1, ta2, ta3, tau[500], z[500], e[500]; 
    int i, j, ii, jj; 
float tauM[501][500]; 
FILE *fp; 

fp=fopen("tau_dominguez11_cta.txt", "r"); // Reading a file for creating a 
matrix which has redshift and energy values 

for(i=0; i<501; i++) 
    { 
    for(j=0; j<400; j++) 
    { 
fscanf(fp, "%f", &tauM[i][j]); 

    } 

    } 
fclose(fp); 

for(j=0; j<400; j++) 
    { 
    if(tauM[0][j]<=zz) 
    {jj=j;} 
} 

for(i=0; i<501; i++) 
{ 

    if(tauM[i][0]<=ee) 
    {ii=i;} 
} 


ta1=(zz-tauM[0][jj])*(tauM[ii][jj+1] -tauM[ii][jj])/(tauM[0][jj+1]-tauM[0] 
[jj]) + tauM[ii][jj]; //across zz 

    ta2=(zz-tauM[0][jj])*(tauM[ii+1][jj+1] - tauM[ii+1][jj])/(tauM[0][jj+1] 
- tauM[0][jj]) + tauM[ii+1][jj]; //across zz 

ta3= (ta2 - ta1)*(ee-tauM[ii][0]) /(tauM[ii+1][0] - tauM[ii][0]) + ta1; 
//across ee 

return ta3; 
} 



float t(float E) // Defining to carry out the integration (help needed in 
this part) 
{ 
float fo, spectralindex, tau1; 
return log10(fo * pow(E, -1*spectralindex) * exp(-1*tau1)); 
} 

int main() 
{ 
FILE *fp1, *fp2,*files; 
int j,i,k; 
float fo; 
char source; 
float a,spectralindex,flux,E1,E2,E3,E4,x,logE,E,z,red,tau1; 
double diffflux,correctedDiffflux; 
float v=0.1, w=10, N=100,sum=0, h, p; 

E1=0.1, E2=100; 
E3=0.01, E4=10; 
float minLogE=log10(E3), maxlogE=log10(E4); 

    int n=100; 


fp1=fopen("actualvalues.txt", "r"); // reading flux and spectral index values for 3 sources 




for(j=0; j<3; j++) 
{ 

char filename[300]; 
sprintf(filename,"source%d.txt",j); 


    files=fopen(filename,"w"); 


    fscanf(fp1, "%s %e %f %f\n", &source, &flux, &spectralindex,&red); 

    a=-1*(spectralindex)+1; 

    fo=(flux*a)/(pow(E2, a) - pow(E1, a)); 


    x=(log10(E4/E3))/n; 
    logE=minLogE; 
    for(i=0; i<n; i++) 

    { 


    logE=logE+x; 

    E=pow(10,logE); 



    diffflux=fo*(pow(E,-1*(spectralindex))); 

    tau1=ebl(red,E); 
    correctedDiffflux=diffflux*exp(-1*tau1); 

    h = (w-v)/N; 
    p = t(v); 

    for(k=1; k<N; k++) 
    { 
    p=p+2*t(v+k*h); 
    } 
    p = p+t(w); 
    p = p*(h/2); // p is the integration variable 

    fprintf(files,"%f %f %f  
     %f\n",log10(E),log10(diffflux),log10(correctedDiffflux),p); 

     } 
    } 
     fclose(fp1); 
     fclose(fp2); 
    fclose(files); 
     } 

答えて

0

float t(float E) // Defining to carry out the integration (help needed in this part) 
{ 
    float fo, spectralindex, tau1; 
    return log10(fo * pow(E, -1*spectralindex) * exp(-1*tau1)); 
} 

は、3つのローカル変数がに初期化されていないされています。それらは他の関数の中で同様の変数との関連はありません。

コンパイラの警告を有効にすると、これが通知されます。

また、floatの使用を中止することをお勧めします。非常に良い理由がない限り、doubleの方が有利です。 20世紀の教科書?

+0

実際、私はそれも同じ結果を試みました。統合部分のように 'double t(double E、double fo、double spectralindex、double tau1)は動作しません。 { return(fo * pow(E、-1 * spectralindex)* exp(-1 * tau1)) ; } ' –

関連する問題