• 締切済み

テント写像のプログラムについて質問です

テント写像のプログラムについて質問です。 下記のプログラムにて 「テント写像の頂点位置を順次変えていき、その頂点のx座標値より大きいなら「1」小さいなら「0」をカウントし、最終的に、各x、yの値に置ける1と0の個数を表示する」 というプログラムを作ったのですが、明らかに計算回数(#define Nの値です)よりも多い値が出力されてしまい困っています。 皆様のお力で解決してもらえないでしょうか? --------以下問題のプログラム---------- #include <stdio.h> #include <math.h> #define x0 0.10 #define N 100 main() { FILE *pt; /* ファイルポインタ */ double i,j; double x,u=0; double data; int k; int data1,data0; data1=0;data0=0; if((pt = fopen("tent_kosu2.dat","wt")) !=NULL){ /* ファイルオープン*/ for(i=0.1;i<=1;i+=0.1){ //xの刻み for(j=0.9;j<=1;j+=0.01){ //yの刻み for(k = 0, x=x0; k <= N; k++){ u = (j/ i); x = 1.0-fabs(1.0-u*x); /* テント写像 */ data=x-i; if(data>0){data1++;} else if(data<0){data0++;} if(k%N==0){/*計算回数が100回1セットなので1セット終了毎の個数を表示させる*/ fprintf(pt,"0は%d個 1は%d個¥t x=%5.2f y=%5.2f¥n",data0,data1,i,j);}/* ファイル書き込み */ } } } } } fclose(pt); /* ファイルクローズ*/ } ---------ここまで------- よろしくお願いします。

みんなの回答

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.3

> main() ちゃんと、型とか宣言するようにしましょう。 > for(i=0.1;i<=1;i+=0.1){ //xの刻み > for(j=0.9;j<=1;j+=0.01){ //yの刻み 0.1,0.01等は誤差を含んでいます。 0.1+0.1+0.1+.... とすることで、誤差が大きくなります。下手すると、ループ回数が変わってしまいます(この例程度なら大丈夫だと思いますが) 精度を上げるためには、整数でループ→計算で実数に が推奨されます /* 例:10倍して整数でループ→使用する値は0.1倍して実数に */ int i0; for(i0=1;i0<=10;i0++){ i=i0 * 0.1; 質問の答えは、たぶん、data0,data1のリセットのタイミングの問題だと思いますが、#1にあるようにどうとでも取れる文章なのでわかりません

  • myuki1232
  • ベストアンサー率57% (97/170)
回答No.2

k%N==0 は k が 0 でも N でも成り立ちます。 普通は for(k = 0, x=x0; k < N; k++){ (略) } fprintf(pt,"0は%d個 1は%d個\t x=%5.2f y=%5.2f\n",data0,data1,i,j); と書きます。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

「計算回数よりも多い値が出力される」とはどういう意味でしょうか? 「出力される値が計算回数より大きい」 (たとえば「最大でも 100 までしか出力されない」はずなのに 176 のような数値が出力される) ということ? それとも, 「出力される値の個数が計算回数より多い」 (たとえば「100個しか出力されない」はずなのに 193個出力される) ということ?

関連するQ&A

専門家に質問してみよう