同じ関数中の1つの数値だけを変えた複数個の結果の平均

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ずっと反省中

同じ関数中の1つの数値だけを変えた複数個の結果の平均

#1

投稿記事 by ずっと反省中 » 14年前

初めまして、ずっと反省中と申します。
この度初めて掲示板の皆様の御助力をお借りしたく書き込ませていただきました。
次のプログラム(非常に長いのでmain関数以外は省きました)はシリコン結晶上面に放射線を当てたとき、底面で回折した放射線の底面の各部ごとの放射線強度を計算するものでq,jはその座標を示しています。
このプログラムはあらかじめ設定してある入射角度のときの回折強度とプラスマイナス1/36000°ずれた(このずれた角度はプログラム中のdyで操作できます)回折強度を計算してそれぞれの角度ごとに3つのファイルに保存するように作られれています。

今回やりたいことはこの3つの数値データの平均を出力できるプログラムに変更したいということです。
しかしC言語初心者の私ではプログラム変更してもうまくコンパイルすらできない状況です。
どうか力を貸してください。
OSはLinux、コンパイラはgccです。
なおプログラム内のVMAX,HMAXは4090に,tateは200に定義しています。
変更前のプログラム(こちらはコンパイルと実行ができます。)は

コード:

main()

{

   FILE *f0, *f10, *f20;

    int j, q, warisu;

    double hachou, theta_d;        /* wave length of X-ray */

    complex y[VMAX][HMAX], z[VMAX][HMAX]; 

 

    complex Zero;

    double  wkaisetu, wtouka;

    double dy, dyr, dyst, dysp, dyh, plus,ddd,r;

    double mul_ref, reflect, delta, ddelta, rdelta;

    double hachoumin, hachoumax;

    double dystrmin, dystrmax;



    Zero.re = 0.0000001;

    Zero.im = 0;
    f0=fopen("./teimen.txt","w");
    f10=fopen("./1+.txt","w");
    f20=fopen("./1-.txt","w");
    

    hachou = w_length;                  /* wave length of X-ray(WB) */

    hachoumax = hachou + HachouMax;

    hachoumin = hachou - HachouMin;   



    

dy=0;                                                       

for (q = 1; q <= tate; ++q) { 

             for (j = 1; j <= q + haba - 1; ++j) {

 crystal(q, j, dy, hachou, y, z);

 }

}
q=tate;

             for (j = 1; j <= q + haba - 1; ++j) {   
fprintf(f0, "%2.15lf\n",comabs(z[q][j])*comabs(z[q][j]));
}
fclose (f0);
 
dy=1.388888889e-5;

for (q = 1; q <= tate; ++q) { 

             for (j = 1; j <= q + haba - 1; ++j) {

 crystal(q, j, dy, hachou, y, z);

 }

}
q=tate;

             for (j = 1; j <= q + haba - 1; ++j) {   
fprintf(f10, "%2.15lf\n", comabs(z[q][j])*comabs(z[q][j]));
}
fclose (f10); 
dy=-1.388888889e-5;

for (q = 1; q <= tate; ++q) { 

             for (j = 1; j <= q + haba - 1; ++j) {

 crystal(q, j, dy, hachou, y, z);

 }

}
q=tate;

             for (j = 1; j <= q + haba - 1; ++j) {   
fprintf(f20, "%2.15lf\n", comabs(z[q][j])*comabs(z[q][j]));
}
fclose (f20);


                                                                        

     printf("\n\n\n");

     printf("end :\n ");

     system("date");

}


変更後は

コード:

main()

   FILE *f0;

    int j, q, warisu;

    double hachou, theta_d;        /* wave length of X-ray */

    complex y[VMAX][HMAX], z[VMAX][HMAX]; 
    complex k0[VMAX][HMAX], k10[VMAX][HMAX], k20[VMAX][HMAX];

 

    complex Zero;

    double  wkaisetu, wtouka;

    double dy, dyr, dyst, dysp, dyh, plus,ddd,r;

    double mul_ref, reflect, delta, ddelta, rdelta;

    double hachoumin, hachoumax;

    double dystrmin, dystrmax;



    Zero.re = 0.0000001;

    Zero.im = 0;
    f0=fopen("./heikin.txt","w");
                 /* wave length of X-ray(WB) */
    hachou = w_length; 
    hachoumax = hachou + HachouMax;
    hachoumin = hachou - HachouMin;   


    

dy=0;
q=tate;                                                       

for (q = 1; q <= tate; ++q) { 

             for (j = 1; j <= q + haba - 1; ++j) {

 crystal(q, j, dy, hachou, y, z);

 }

}


             for (j = 1; j <= q + haba - 1; ++j) {   
comabs(z[q][j])*comabs(z[q][j])=k0[q][j];
}

 
dy=1.388888889e-5;

for (q = 1; q <= tate; ++q) { 

              for (j = 1; j <= q + haba - 1; ++j) {

 crystal(q, j, dy, hachou, y, z);

 }

}

             for (j = 1; j <= q + haba - 1; ++j) {   
comabs(z[q][j])*comabs(z[q][j])=k10[q][j];
}
dy=-1.388888889e-5;

for (q = 1; q <= tate; ++q) { 

             for (j = 1; j <= q + haba - 1; ++j) {

 crystal(q, j, dy, hachou, y, z);

 }

}

             for (j = 1; j <= q + haba - 1; ++j) {   
comabs(z[q][j])*comabs(z[q][j])=k20[q][j];
}


             for (j = 1; j <= q + haba - 1; ++j) {   
fprintf(f0, "%2.15lf\n", (k0[j]+k10[j]+k20[j])/3);
}
     
fclose (f0);



     printf("\n\n\n");

     printf("end :\n ");

     system("date");

}

アバター
h2so5
副管理人
記事: 2212
登録日時: 14年前
住所: 東京
連絡を取る:

Re: 同じ関数中の1つの数値だけを変えた複数個の結果の平均

#2

投稿記事 by h2so5 » 14年前

まずmain()関数の括弧が足りません。

そして、以下の定数、変数、関数の定義が書かれていません。
VMAX
HMAX
w_length
HachouMax
HachouMin
tate
haba
crystal()
comabs()

使用するヘッダファイルやプリプロセッサ命令も書いてください。
また、エラーメッセージの詳細も教えてください。


ずっと反省中

Re: 同じ関数中の1つの数値だけを変えた複数個の結果の平均

#4

投稿記事 by ずっと反省中 » 14年前

h2so5さん、返信ありがとうございます。
やっぱりmain関数だけだと難しいみたいですね。
申し訳ありません。

main以外だとこのようになっています。

コード:

#include<stdio.h>

#include<math.h>



#define D_index 4



/**********************************************************************************/



#define Image 1         /* if Image is '1', it is Image and '0', it is not Image. */

/**      D_index 4 -> 004, 6 -> 006, 2 -> 002 diffraction */





#define SQR(x) ((x)*(x))

#define pai 3.1415926535

#define tate 200

#define haba 800

#define yoko tate + haba -1

#define ba 3.703

#define VMAX 4090

#define HMAX 4090

#define elem 3.5e-6

#define Lattice_Const 5.43e-10

#define Chi_Const -5.6e12

#define HachouMax 0.03e-10     

#define HachouMin 0.03e-10     

#define LambdaStep 0.005e-10  

#define latticesp Lattice_Const/D_index 

#define fp 0.0153
#define fpp 0.0225

#define w_length 0.248e-10





/****************************************************************************/

/*  Thisis a simulation program of bragg case X-ray topograph              */

/****************************************************************************/ 

struct _complex {

               double re,im;

               };

typedef struct _complex complex ;

    complex add(complex x,complex y);

    complex sub(complex x,complex y);

    complex mul(complex x,complex y);

    complex div(complex x,complex y); 

    complex fnewmul(double y,complex x);

    complex conju(complex x);   

    double comabs(complex x);



complex add(complex x, complex y)

{   complex z;

  z.re = x.re + y.re;

    z.im = x.im + y.im;

    return(z);

}



complex sub(complex x, complex y)

{

    complex z;

    z.re = x.re - y.re;

    z.im = x.im - y.im;

    return(z);

}



complex mul(complex x, complex y)

{

    complex z;  

    z.re = x.re * y.re - x.im * y.im;

    z.im = x.re * y.im + x.im * y.re;

    return(z);

}



complex div(complex x, complex y)

{

    complex z; 

    double w; 

    w = SQR(y.re) + SQR(y.im);

    z.re = (x.re * y.re + x.im * y.im) / w;

    z.im = (x.im * y.re - x.re * y.im) / w;

    return (z);

}



complex fnewmul(double y, complex x)

{ 

    complex z;

    z.re = x.re * y;

    z.im = x.im * y;

    return(z);

}



complex conju(complex x)

{

    complex z;

    z.re = x.re;

    z.im = -x.im;

    return (z);

}



double comabs(complex x)

{

    double z;

    z = sqrt(x.re * x.re + x.im * x.im);

    return z;

}

double Chi_Re(double hachou)

{

    double f_0;

    double f_prime;

    



    f_0 = 8.5;

    f_prime = Chi_Const * 8 * hachou * hachou * (f_0 + fp);



    return (f_prime);

}



double Chi_Im(double hachou)

{

    double f_2prime;

    f_2prime = Chi_Const * 8 * hachou * hachou * fpp;



    return (f_2prime);

}



double F_0_Chi_Re(double hachou)

{

    double f_0_Re, Z_Si;



    Z_Si=14.000;

    f_0_Re = Chi_Const * 8 * hachou * hachou * (Z_Si + fp);



    return (f_0_Re);

}



double F_0_Chi_Im(double hachou)

{

    double f_0_Im;

     f_0_Im = Chi_Const * 8 * hachou * hachou * fpp;

   

    return (f_0_Im);

}  



double hizumi(int j, int q, double hachou, int so, int sq, int sj);

complex a(double dy, complex iinum, double hachou);

complex b(double dy, complex iinum, double hachou);

complex haiti(double dy, complex inum, double ss, double hachou);



double hizumi(int j, int q, double hachou, int so, int sq, int sj)

{

    double bb, bc;

    double rs, shu, c;

    int v;



    c = -9.0e-17;      

    bb = 80.65;

    bc = 80.65;

    v = 100;

    rs = pow(((q - (sq - 0.5)) * cos(bc * pai / 180)), 2);

    rs = rs + pow(((2 * (j - (sj - 0.5)) - (q-sq)) * sin(bc * pai / 180)), 2); 

    rs = rs + pow(((v - so) * 2 * sin(bc * pai / 180)), 2);

    rs = elem * sqrt(rs); 

    shu = (2 * (j - (sj - 0.5)) - (q - sq)) * pow(sin(bc * pai / 180), 2); 

    shu = 4 * pai * sin(bb * pai / 180) / hachou * c * elem * shu / pow(rs, 3); 

    return (shu);

}



complex a(double dy, complex iinum, double hachou)

{

    double bt;

    double chi_re, chi_im; 

    complex kaim,aaa;

    bt = ba; 

    chi_re = Chi_Re(hachou); 

    chi_im = Chi_Im(hachou); 

    kaim.re = chi_re / 2;    

    kaim.im = chi_im / 2; 

    aaa = mul(fnewmul(cos(pai * bt / 180-dy), iinum),  

             fnewmul(elem * pai / hachou, kaim));

    return (aaa);

}



complex b(double dy, complex iinum, double hachou)

{

    double bc;

    double chi_re, chi_im;

    complex kaip, bbb; 

    bc = - ba;

    chi_re = Chi_Re(hachou); 

    chi_im = Chi_Im(hachou);

    kaip.re = chi_re / 2; 

    kaip.im = chi_im / 2;

    bbb=mul(fnewmul(cos(pai * bc / 180 + dy), iinum), 

           fnewmul(elem * pai / hachou, kaip)); 

   return (bbb);

}



complex haiti(double dy, complex inum, double ss, double hachou)

{

    float bt,bk;

    double d_theta, chi_re, chi_im; 

    complex betah, kai_zero;

    complex w;

    complex w_1, w_2; 

    complex kakudo; 





    chi_re = F_0_Chi_Re(hachou); 

    chi_im = F_0_Chi_Im(hachou);



    kai_zero.re = chi_re;

    kai_zero.im = chi_im;

    bk = - ba;

    kakudo.re =dy*sin(2 * pai * ba / 180); 

    kakudo.im = 0.0;



    betah = kakudo;

    w_1 = fnewmul((pai * cos(pai * bk / 180 + dy)   

                       * elem * (1 / hachou)), mul(inum, betah));

    w_2 = fnewmul((ss * pai * cos(pai * bk / 180 + dy) * elem), inum); 

    w = sub(w_1, w_2); 

   return(w);

}



void crystal(int q, int j, double dy, double hachou,  

        complex y[VMAX][HMAX], complex z[VMAX][HMAX])



{ 

    int i, oku;

    double ss, sq, sj, so;

    complex aa, bb, ww, ab, l, k, h, m, g, r;

    complex c1, c2, c3, d;

    complex inum, iinum;



    inum.re = 0.0; 

    inum.im = 1.0; 

    iinum.re = 0.0;

    iinum.im = -inum.im;  



   

    sq = tate/1.1; 

    sj = (haba + tate / 1.1) / 2; 

    so = 100;



   // ss=hizumi(j,q,hachou,so,sq,sj);      



    ss = 0.0;                                /* i.e no strain */

    aa = a(dy, iinum, hachou);       

    bb = b(dy, iinum, hachou);       

    ww = haiti(dy, inum, ss, hachou) ;

    c1.re = 1.0 + ww.re;

    c1.im = ww.im;

    c2.re = 1.0 - ww.re;

    c2.im = -ww.im;

    c3 = mul(aa, bb);

    d.re = 1.0 - ww.re - c3.re; 

    d.im = -ww.im - c3.im;

    l = div(c2, d);

    k = mul(aa, l);

    g = div(bb, d);

    h = mul(aa, g);

    m = mul(aa, div(c1, d)); 

    r = div(c1, d);



/* y is a amplitude of transmission wave */

    y[1][1].re = 1.0;          

    y[1][1].im = 0.0;



/* z is a amplitude of difraction wave   */

    z[1][1].re = 0.0;         

    z[1][1].im = 0.0;   

    

    	if (q == 1 && j <= 300 ) { 

       y[q][j] = y[1][1];

       z[q][j] = z[1][1]; 

   } 
     
else if (q == 1 && j >= 301 && j <= 500) 
{ 

       y[q][j] = z[1][1];

       z[q][j] = z[1][1]; 

   } 
else if (q == 1 &&  j>=501 && j <= 800) { 

       y[q][j] = y[1][1];

       z[q][j] = z[1][1]; 


    }

  else if (j == 1){ 

       y[q][j] = add(mul(l, y[q-1][j]), mul(k, z[q-1][j]));

       z[q][j] = add(mul(g, y[q-1][j]), mul(h, z[q-1][j]));

   } else if(j != q + haba - 1) {

        y[q][j] = add(add(mul(l, y[q-1][j]), mul(k,z[q-1][j])),

                  add(mul(h, y[q-1][j-1]), mul(m, z[q-1][j-1])));

        z[q][j] = add(add(mul(g, y[q-1][j]), mul(h,z[q-1][j])),

                 add(mul(g, y[q-1][j-1]), mul(r, z[q-1][j-1])));

   } else {

        y[q][j] = add(mul(h, y[q-1][j-1]), mul(m, z[q-1][j-1]));

        z[q][j] = add(mul(g, y[q-1][j-1]), mul(r, z[q-1][j-1]));

   }

}
この下にmain関数があります。

アバター
h2so5
副管理人
記事: 2212
登録日時: 14年前
住所: 東京
連絡を取る:

Re: 同じ関数中の1つの数値だけを変えた複数個の結果の平均

#5

投稿記事 by h2so5 » 14年前

コード:

for (j = 1; j <= q + haba - 1; ++j) {   
comabs(z[q][j])*comabs(z[q][j])=k10[q][j];
このような式は書けないと思いますが、
何の処理をしているつもりですか?

初級者
記事: 200
登録日時: 14年前

Re: 同じ関数中の1つの数値だけを変えた複数個の結果の平均

#6

投稿記事 by 初級者 » 14年前

インデントのポリシーが全くないのと、
ムダな空白行があるせいで、ひじょうに読みづらいです。
なんとかならないでしょうか。

ずっと反省中

Re: 同じ関数中の1つの数値だけを変えた複数個の結果の平均

#7

投稿記事 by ずっと反省中 » 14年前

h2so5さん
これはdyだけを変えた
『comabs(z[q][j])*comabs(z[q][j])』
の値を平均したいがためにした苦肉の結果です。

初心者の私にはどうすればいいのかわからずにやりました。
すいません。

初級者さん
インデントのポリシーとは何なのでしょうか?
すいません、初心者で全く単語を知らなくて。

アバター
bitter_fox
記事: 607
登録日時: 14年前
住所: 大阪府

Re: 同じ関数中の1つの数値だけを変えた複数個の結果の平均

#8

投稿記事 by bitter_fox » 14年前

ずっと反省中 さんが書きました: インデントのポリシーとは何なのでしょうか?
すいません、初心者で全く単語を知らなくて。
インデントと言うのは、字下げと言う意味です。
で、そのポリシーがないというのは、字下げが揃ってないということです。

たとえば、main関数後半を見てみると、for文周りが汚くなっています。
ずっと反省中 さんが書きました:

コード:

main()
 
{
 
   FILE *f0, *f10, *f20;
 
    int j, q, warisu;
 
    double hachou, theta_d;        /* wave length of X-ray */
 
    complex y[VMAX][HMAX], z[VMAX][HMAX]; 
 
 
 
    complex Zero;
 
    double  wkaisetu, wtouka;
 
    double dy, dyr, dyst, dysp, dyh, plus,ddd,r;
 
    double mul_ref, reflect, delta, ddelta, rdelta;
 
    double hachoumin, hachoumax;
 
    double dystrmin, dystrmax;
 
 
 
    Zero.re = 0.0000001;
 
    Zero.im = 0;
    f0=fopen("./teimen.txt","w");
    f10=fopen("./1+.txt","w");
    f20=fopen("./1-.txt","w");
    
 
    hachou = w_length;                  /* wave length of X-ray(WB) */
 
    hachoumax = hachou + HachouMax;
 
    hachoumin = hachou - HachouMin;   
 
 
 
    
 
dy=0;                                                       
 
for (q = 1; q <= tate; ++q) { 
 
             for (j = 1; j <= q + haba - 1; ++j) {
 
 crystal(q, j, dy, hachou, y, z);
 
 }
 
}
これを、僕流にインデントすると、

コード:

main()
{
	FILE *f0, *f10, *f20;
	int j, q, warisu;
	double hachou, theta_d; /* wave length of X-ray */

	complex y[VMAX][HMAX], z[VMAX][HMAX];
	complex Zero;

	double wkaisetu, wtouka;
	double dy, dyr, dyst, dysp, dyh, plus,ddd,r;
	double mul_ref, reflect, delta, ddelta, rdelta;
	double hachoumin, hachoumax;
	double dystrmin, dystrmax;

	Zero.re = 0.0000001;
	Zero.im = 0;

	f0=fopen("./teimen.txt","w");
	f10=fopen("./1+.txt","w");
	f20=fopen("./1-.txt","w");

	hachou = w_length; /* wave length of X-ray(WB) */
	hachoumax = hachou + HachouMax;
	hachoumin = hachou - HachouMin;

	dy=0;
	for (q = 1; q <= tate; ++q)
	{
		for (j = 1; j <= q + haba - 1; ++j)
		{
			crystal(q, j, dy, hachou, y, z);
		}
	}
あくまで、僕流です。これじゃないとダメと言うことはないです。
ですので、色々やってみて、質問者さんご自身の統一された流儀を探してみてください。

アバター
h2so5
副管理人
記事: 2212
登録日時: 14年前
住所: 東京
連絡を取る:

Re: 同じ関数中の1つの数値だけを変えた複数個の結果の平均

#9

投稿記事 by h2so5 » 14年前

合っているかどうか分かりませんが、書くとしたら逆にして、

コード:

             for (j = 1; j <= q + haba - 1; ++j) {   
k0[q][j]=comabs(z[q][j])*comabs(z[q][j]);
これで左辺に右辺を代入します。

ずっと反省中

Re: 同じ関数中の1つの数値だけを変えた複数個の結果の平均

#10

投稿記事 by ずっと反省中 » 14年前

h2so5さん、アドバイスありがとうございます。
やってみたところ、残念ながらコンパイルできませんでした。

昨晩、勉強しなおしてmain関数を次のように変えたところ、コンパイルまではできるのですが、実行するとセグメンテーション違反になりました。
どうか助言をお願いします。

コード:

main()
{
   FILE *f0;
    int j, q, warisu, i;
    double hachou, theta_d;        /* wave length of X-ray */
    complex y[VMAX][HMAX], z[VMAX][HMAX]; 
    double I[1000][101],II[1000];
    complex Zero;
    double  wkaisetu, wtouka;
    double dy, dyr, dyst, dysp, dyh, plus,ddd,r;
    double mul_ref, reflect, delta, ddelta, rdelta;
    double hachoumin, hachoumax;
    double dystrmin, dystrmax;

    II[j]=0;
    I[j][i]=0;
    dyr = 0.1*pai/180;
    dy=-0.1*pai/180+i*dyr;
    Zero.re = 0.0000001;
    Zero.im = 0;

    f0=fopen("./heikin.txt","w");

                 /* wave length of X-ray(WB) */
    hachoumax = hachou + HachouMax;
    hachoumin = hachou - HachouMin;   

for (i = 0; i <= 2; ++i) {                                           
	for (q = 1; q <= tate; ++q) { 
		for (j = 1; j <= q + haba - 1; ++j) {
                                crystal(q, j, dy, hachou, y, z);
}}}
q=tate;
for (i = 0; i <= 2; ++i) {
	for (j = 1; j <= q + haba - 1; ++j) {
I[j][i]=comabs(z[q][j])*comabs(z[q][j]);
}}
for (j = 1; j <= 999; ++j) {
             for (i = 0; i <= 100; ++i) { 
II[j]=I[j][i]+II[j];
}
}
fprintf(f0, "%2.15lf\n", II[j]/3);   
fclose (f0);
                                                                       
     printf("\n\n\n");
     printf("end :\n ");
     system("date");
}

non
記事: 1097
登録日時: 14年前

Re: 同じ関数中の1つの数値だけを変えた複数個の結果の平均

#11

投稿記事 by non » 14年前

15 行目の II[j]=0;
ですが、何をやりたいのでしょうか?jに初期値がないと、どこに0を入れているかわからないので、そのような実行エラーになっているのではないでしょうか?

これは、卒業研究なのでしょうか?期日に余裕があるなら、1からC言語を勉強した方が良いと思われます。他人が作成したプログラムを改造して使うレベルにありません。このようなプログラムを作成されようというのですから、理工系を専攻されている方だと思います。足下から、固めていくべきでしょう。

どうしても今すぐに何とかしなければいけないのなら、あなたが手を加えていない完動するプログラムを載せて、これからどうしたいのかを説明してもらった方が早いです。そのときは、テスト用のデータファイルも添付してください。
non

閉鎖

“C言語何でも質問掲示板” へ戻る