fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. #define DIV_NUM 120 // 積分範囲の分割数
  5. #define PI 3.14159265
  6. #define exp 2.7182818
  7.  
  8. // 積分対象関数
  9. float function (float x)
  10. {
  11. float result;
  12. result = pow(2.0*PI , -0.5) * pow(exp , -0.5*(x*x)) ; // 正規分布
  13. return result;
  14. }
  15.  
  16. double sekibun(double X_MIN , double X_MAX);
  17.  
  18. int main(){
  19. int i,k;
  20. int N;
  21. double wa;
  22. double num;
  23. int a_max;
  24. int a_min;
  25. int rangenum=10;
  26. int f[100]={};
  27. double e[100];
  28. double z[100]={};
  29. double p[100]={};
  30. double range;
  31. double E;
  32. double s;
  33. double s2;
  34. double X;
  35. int a[1000];
  36. FILE *fpi;
  37.  
  38. if((fpi=fopen("tesuu.txt","r"))==NULL)
  39. {
  40. fprintf(stderr,"ファイルを開けません\n");
  41. exit(1);
  42. }
  43. num=0;
  44. wa=0;
  45. for (N = 0; N < 1000; N++){
  46. k=fscanf(fpi,"%d",&a[N]); //ファイルデータの読み込み
  47. if(k != 1)
  48. {
  49. fclose(fpi);
  50. break;
  51. }
  52. num++;//全度数
  53. wa += a[N];
  54. //printf("a[%d]:%d\n",N,a[N]);
  55. }
  56. a_max=a[0];
  57. a_min=a[0];
  58.  
  59. //最大値と最小値を求める
  60. for(N=1;N<num;N++){
  61. if(a_max<a[N])a_max=a[N];
  62. if(a_min>a[N])a_min=a[N];
  63. }
  64. range = (a_max - a_min) /rangenum;//階級の範囲をきめる
  65.  
  66. //各階級にデータの度数を与える
  67. for(N=0;N<num;N++){
  68. if(a[N]<a_min + range)f[0]++;
  69. if(a[N]>a_max - range)f[rangenum-1]++;
  70. for(i=1; i<rangenum-1; i++){
  71. if(a_min + range*i <a[N] && a[N]<a_min + range*(i+1)) f[i]++;
  72. }
  73. }
  74. //平均Eと分散s2をもとめる
  75. E=wa/num;
  76. s2=0;
  77. for(N=0;N<num;N++){
  78. s2 += (E-a[N])*(E-a[N])/num;
  79. }
  80. s = sqrt(s2);
  81. printf("E=%f\n",E);
  82. printf("s2=%f\n",s2);
  83. printf("s=%f\n",s);
  84.  
  85. //各階級の上限値を標準化する
  86. for(i=0; i<rangenum; i++){
  87. z[i]= ((a_min + range*(i+1)) - E )/s;
  88. printf("f[%d]=%d\n",i,f[i]);
  89. }
  90.  
  91.  
  92. //各階級の期待比率pを求める
  93. p[0]=0.5 - sekibun(z[0] , 0);//最下位階級の期待比率
  94. p[rangenum-1]=0.5 - sekibun( 0 , z[rangenum-2]);//最上位階級の期待比率
  95. for(i=1; i<rangenum-1; i++){
  96. p[i]=sekibun(z[i] , z[i+1]);
  97. }
  98.  
  99. //期待度数eを求める
  100. for(i=0; i<rangenum; i++){
  101. e[i] = num * p[i];
  102. printf("e[%d]=%f\n",i,e[i]);
  103. }
  104.  
  105. //X^2の実現値
  106. X=0;
  107. for(i=0; i<rangenum; i++){
  108. X += (f[i]-e[i])*(f[i]-e[i])/e[i];
  109. }
  110. printf("実現値X^2=%f\n",X);
  111.  
  112. //for(i=0; i<rangenum; i++){
  113. //printf("p[%d]=%f\n",i,p[i]);
  114. //printf("e[%d]=%f\n",i,e[i]);
  115. //}
  116.  
  117. fclose(fpi);
  118. return 0;
  119. }
  120.  
  121. double sekibun(double X_MIN , double X_MAX)
  122. {
  123. double integral; // 積分結果
  124. double h; // 積分範囲を n 個に分割したときの幅
  125. double x, dA;
  126. int i;
  127.  
  128. //printf ("積分範囲=[%f,%f] 分割数=%d\n", X_MIN, X_MAX, DIV_NUM);
  129.  
  130. // === Simpson 法による積分 (開始) ===
  131. h = (X_MAX - X_MIN) / (2.0*DIV_NUM); // 分割幅
  132. x = X_MIN; // 積分範囲の変数を初期化
  133. integral = function(x); // 積分結果の変数の初期値
  134.  
  135. for (i=1; i<DIV_NUM; i++) {
  136. dA = 4.0*function(x+h) + 2.0*function(x+2.0*h);
  137. integral += dA; // Σ
  138. x += 2.0*h;
  139. }
  140.  
  141. integral += ( 4.0*function(x+h) + function(x+2.0*h) );
  142. integral *= h/3.0;
  143. // === Simpson 法による積分 (終了) ===
  144. //printf ("積分結果= %lf\n", integral);
  145. //printf ("解析的に求めた結果 (底辺 100,高さ 100 の直角三角形)=%lf\n",
  146. //(X_MAX-X_MIN)*function(X_MAX)/2.0);
  147.  
  148. return integral;
  149. }
  150.  
Runtime error #stdin #stdout #stderr 0s 10320KB
stdin
Standard input is empty
stdout
Standard output is empty
stderr
ファイルを開けません