ここから本文です

Cのプログラミングで複合台形公式と複合シンプソン公式を用いて面積を計算するもの...

ao_********さん

2009/11/418:53:05

Cのプログラミングで複合台形公式と複合シンプソン公式を用いて面積を計算するものを作りたいのですがわかりません。どなたか教えていただけないでしょうか?

半径を0.5mの円と仮定します。
必要なデータが他にある場合は教えてください

閲覧数:
2,009
回答数:
2
お礼:
25枚

違反報告

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

pcq********さん

編集あり2009/11/422:32:36

PC-QuIC です。

> 必要なデータが他にある場合は教えてください

どこまで分かって、どういうことが分からないのか、また、あなたが特に知りたいことがどんなことなのかの情報が必要です。そのためにも、少なくとも、あなたが考えたプログラムコード (未完成でも) が必要です。

そうでなくては、ピンからキリまで全部教える必要があります。

(1) 台形公式とは何か分かりますか?それを言葉で説明することはできますか?
(2) シンプソンの公式とは何か分かりますか?それを言葉で説明することはできますか?
(3) プログラムではなく、紙と鉛筆と電卓で、この問題を解くことはできますか? また、それをどのような手順で行うかを言葉で説明できますか?
(4) 数式をC言語で記述する方法はわかりますか?C言語で面積を求める計算式を書くことはできますか?
(5) C言語で変数とはどんなものか分かりますか?変数の宣言の仕方は分かりますか?変数に値を代入する方法は分かりますか?
(6) C言語でプログラム書くとき、最低限どんなコードを書く必要があるか分かりますか?
(7) for文の使い方は分かりますか?for文で数値を少しずつ変化させながら、一定の手順を繰り返させるコードを書けますか?
(8) for文の中で、数値 (この場合は面積) を少しずつ累積していく方法は分かりますか?
(9) 数値を出力 (画面に表示) する方法は分かりますか?
(10) 設問の意味を理解できていますか?

どんな点が分からないのか要点を絞らないと、上述のようなことを全て解説する必要が出てきます。そのためにも、要点を絞ってもらえると、回答しやすくなると思いますよ。あなたが作ったプログラムのコードがあれば、どこまで理解しているのかが分かり、回答しやすくなるわけです。

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

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

1〜1件/1件中

rhi********さん

2009/11/506:06:41

/*
複合積分は複合公式になる直前の形式でプログラム化
しました。また充分な近似が得られる程度までの分割を
行い、実行時間を気にせず愚直な表現で分かり易く
書いてみました。この位しないと、計算に時間を掛けて
いる実感が出ません。随分時間の無駄をしたプログラム
です。(trapezdは台形trapezoidの略記です)
普通シンプソンは台形に比べてずっと少ない分割ですむ
のですが、この例では殆ど拮抗しています。この原因は
4分円の右端の近くで勾配が急になり無限大に接近する
ことにあります。この近くで誤差が大きくなり、分割を
細かくしないと克服できないのです。必要な部分では
細かく自動分割するプログラムはもうすこし込み入った
作りになりますが、シンプソン公式の特徴を活かして
旨く作ることが出来ます。
このプログラムは半径1で計算しています。半径0.5の
結果が欲しければb=0.5とするだけです。結果だけ問題
にするなら、積分値に0.5^2=0.25を掛ければすみます。
*/
#include_<stdio.h>
#include_<math.h>

double_circle_(double_b,double_x);
double_simpson(double_a,double_b,int_n);
double_trapezd(double_a,double_b,int_n);

int_main(){
double a=0.0; //_積分の始点
double b=1.0; //_積分の終点
double ss; //_積分:シンプソン
double st; //_積分:台形
int n; //_積分区間等分割数
double sc; //_比較真値=pi*b^2/4
double pi; //_円周率の近似値

pi_=_acos(-1.0);
sc_=_pi*b*b/4;
printf("分割数___台形積分___(_誤差_)_");
printf("シンプソン_(_誤差_)\n");
for(n=2;n<1000000;n*=2){
ss=_simpson(a,b,n);
st=_trapezd(a,b,n);
printf("n=%6d_st=%f(%.0e)_ss=%f(%.0e)\n",
n,st,fabs(st-sc),ss,fabs(ss-sc));
}
return_0;
}
//_円周の高さy
double_circle_(double_b,double_x){
return_sqrt(b*b-x*x);
}
//_シンプソン複合積分
double_simpson(double_a,double_b,int_n){
double_ h,s=0;
double xi,xj,xk;
double yi,yj,yk;
int j;
h_=_(b-a)/n;
for(j=1;j<n;j+=2){
xi=h*(j-1);_xj=h*j;_xk=h*(j+1);
yi=circle(b,xi);
yj=circle(b,xj);
yk=circle(b,xk);
s_+=_(yi+4*yj+yk)*h/3;
}
return_s;
}
//_台形複合積分
double_trapezd(double_a,double_b,int_n){
double h,s=0;
double xi,xj;
double yi,yj;
int i,j;
h_=_(b-a)/n;
for(i=0;i<n;i++)_{
j__=_i+1;
xi_=_h*i; xj_=_h*j;
yi_=_circle(b,xi);
yj_=_circle(b,xj);
s_+=_(yi+yj)*h/2;
}
return_s;
}
/*_出力:
分割数___台形積分___(_誤差_)_シンプソン_(_誤差_)
n=_____2_st=0.683013(1e-001)_ss=0.744017(4e-002)
n=_____4_st=0.748927(4e-002)_ss=0.770899(1e-002)
n=_____8_st=0.772455(1e-002)_ss=0.780297(5e-003)
n=____16_st=0.780813(5e-003)_ss=0.783599(2e-003)
n=____32_st=0.783776(2e-003)_ss=0.784763(6e-004)
n=____64_st=0.784824(6e-004)_ss=0.785174(2e-004)
n=___128_st=0.785195(2e-004)_ss=0.785319(8e-005)
n=___256_st=0.785326(7e-005)_ss=0.785370(3e-005)
n=___512_st=0.785373(3e-005)_ss=0.785388(1e-005)
n=__1024_st=0.785389(9e-006)_ss=0.785395(4e-006)
n=__2048_st=0.785395(3e-006)_ss=0.785397(1e-006)
n=__4096_st=0.785397(1e-006)_ss=0.785398(4e-007)
n=__8192_st=0.785398(4e-007)_ss=0.785398(2e-007)
n=_16384_st=0.785398(1e-007)_ss=0.785398(5e-008)
n=_32768_st=0.785398(5e-008)_ss=0.785398(2e-008)
n=_65536_st=0.785398(2e-008)_ss=0.785398(7e-009)
n=131072_st=0.785398(6e-009)_ss=0.785398(2e-009)
n=262144_st=0.785398(2e-009)_ss=0.785398(9e-010)
n=524288_st=0.785398(8e-010)_ss=0.785398(3e-010)
*/

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

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

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

「追加する」ボタンを押してください。

閉じる

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

不適切な投稿でないことを報告しました。

閉じる