ここから本文です

C言語プログラム、シンプソンの公式、マチンの公式について 友達に教えてもら...

ijitaku13さん

2013/3/222:40:28

C言語プログラム、シンプソンの公式、マチンの公式について


友達に教えてもらいながら以下のプログラムを作って実装してみたのですが
イマイチどのように動いているのかがわからないのですが

各行の実行部分にコメントを打って下さると嬉しいです!!

1、シンプソンの公式を扱い、桁数を入力しその桁数分の円周率を出力する

#include<stdio.h>
#include<math.h>

double f(double x);
double ab(doube a);

main(){
double pi=0.0,x,h,r;
int k;
scanf("%d",&k);
h=(1/(double)k)/2;
r=(1/(double)k);
for(x=0.0;x<1.0;x+=r){
pi+=(f(x)+4.0*f(x+h)+f(x+h+h));
}
printf("%.9lf\n",h/3.0*4*pi);
return(0) ;

}

double f(double x){
return sqrt(ab(1.0-x*x));
}

double ab(double a){
return(a>0)?a:-a;
}





次のプログラムはマチンの公式を用いて有効桁数15桁までの円周率を出力するプログラムです



#include<stdio.h>
#include<math.h>

#define EPS (1e-15)



main(){

double pai;

pai=(4*at(1/5)-at(1/239.0));

printf("%.20lf\n",4.0*pai);
return(0);
}

double at(double x){
double ret=0.0,u=x,d=1.0;
int n=0;

while(EPS<(u/d)){
if(n&1) ret+= -(u/d);
else ret+=(u/d);
u*=(x*x);
d+=2.0;
n++;
}
return ret;
}





お願いします!!

補足実行は出来ました‼

閲覧数:
700
回答数:
2
お礼:
100枚

違反報告

ベストアンサーに選ばれた回答

2013/3/312:37:58

/*
0302 224028
ijitaku13さん

>>1.シンプソンの公式を扱い、桁数を入力しその桁数分の円周率を出力する
__要求桁数受け入れ,許容誤差設定,許容誤差による打ち切り
__を考慮した倍々分割複合シンプソン3点公式の制御を実装化
__細かくコメントを挿入したので,C言語と合わせて考察して
__ください.
__実用,もしくは課題提出においては,これほど細かいコメント
__は非常識です.処理の大きなブロックでまとめて各1行の
__抽象的な表題で済ませます.
__送付時に行頭の空白が削除され,インデントが無視されるので
__半角空白2ケタを全角_に置き変えてあります.必要なら
__エディタ上で逆に置き換えてください
*/
#define _CRT_SECURE_NO_WARNINGS // これは、無くてすむ環境なら削除可
#include <stdio.h>
#include <math.h>

// マクロ定数
#define_ R_ 1.0_ // 円の半径

double f(double x); // 第1象限の4分円周の高さ×4

main(){
_int__ k;_// 精度桁数:キイ入力
_double_er; // 許容差:指定桁数相当
_int__ n;_// 分割数:倍々増
_double_d;_// 分割幅
_double_h;_// シンプソン3点公式のh
_int__ i;_// 分割点カウンタ
_double_x;_// 積分点
_double_p;_// 円周率:現分割での値
_double_dp; // 円周率:倍分割での精度改善差分
_double_pi; // 円周率:繰り返し保存値

_// 入力指示つきで精度桁数を受け取る
_printf("精度桁数 > ");scanf("%d",&k);
_// 指定桁数相当の許容誤差を計算し,表示
_er = 1/pow(10.,k);
_printf("相当誤差 = %.9f\n",er);
_// 繰り返し計算経過表の見出し
_printf(" 分割数_ 分割巾___積分値×4_ 保存値___改善値\n");
_// 繰り返し保存値を初期化後,倍々分割での繰り返しを開始
_pi = 0;
_for(n=1;n<100000000;n=2*n){
__// 分割幅,シンプソン幅設定,積分結果を0に初期化
__d = R/n;_h = d/2;
__p = 0;
__// 複合シンプソン積分ループ開始
__for(i=0;i<n;i++){
___// 3点中央位置設定と3点公式計算
___x = d*i+h;
___p = p+(f(x-h)+4*f(x)+f(x+h))*h/3;
__}
__// 円半径にろる正準化:半径1の場合に換算
__p /= R*R;
__// 精度改善差分(絶対値)算定
__dp = fabs(p-pi);
__// 現在の分割での経過表示
__printf("%7d: %.9f %.9f %.9f %.9f\n",n,d,p,pi,dp);
__// 精度充分なら倍々分割ループ停止
__if(dp<er/10) break;
__// 今回計算値を保存し,ループ継続
__pi = p;
_}
_// 正常終了:確認メッセージ発行
_printf("\n-normal end-\n");
_return(0) ;
}

// 4*第1象限4分円高さ
double f(double x){
_return 4*sqrt(1.0-x*x);
}

/* 実行出力
精度桁数 > 7
相当誤差 = 0.000000100
分割数_ 分割巾___積分値×4_ 保存値___改善値
___1: 1.000000000 2.976067743 0.000000000 2.976067743
___2: 0.500000000 3.083595155 2.976067743 0.107527412
___4: 0.250000000 3.121189170 3.083595155 0.037594015
___8: 0.125000000 3.134397669 3.121189170 0.013208499
__ 16: 0.062500000 3.139052218 3.134397669 0.004654549
__ 32: 0.031250000 3.140695076 3.139052218 0.001642858
__ 64: 0.015625000 3.141275419 3.140695076 0.000580343
__128: 0.007812500 3.141480513 3.141275419 0.000205094
__256: 0.003906250 3.141553009 3.141480513 0.000072496
__512: 0.001953125 3.141578638 3.141553009 0.000025629
_ 1024: 0.000976563 3.141587698 3.141578638 0.000009061
_ 2048: 0.000488281 3.141590902 3.141587698 0.000003203
_ 4096: 0.000244141 3.141592034 3.141590902 0.000001133
_ 8192: 0.000122070 3.141592435 3.141592034 0.000000400
_16384: 0.000061035 3.141592576 3.141592435 0.000000142
_32768: 0.000030518 3.141592626 3.141592576 0.000000050
_65536: 0.000015259 3.141592644 3.141592626 0.000000018
131072: 0.000007629 3.141592650 3.141592644 0.000000006

-normal end-
*/

この質問は投票によってベストアンサーに選ばれました!

ちょい足しを取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

このQ&Aで解決しましたか?質問する

閉じる

ベストアンサー以外の回答

1〜1件/1件中

グレード

カテゴリマスター

k032yfさん

2013/3/223:22:38

ijitaku13さん

ところで、実行結果は無事ですか?

ちょい足しを取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

ID/ニックネームを選択し、「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問や知恵ノートは選択されたID/ニックネームのMy知恵袋で確認できます。

ほかのID/ニックネームで利用登録する