• ベストアンサー

台形則による結果の数値の相違

こんにちは<_ _> 台形則による定積分の問題についての質問です 台形則という言葉を今日始めて目にし、なんとかプログラム を作ってみましたが 「a~b間の分割数=n=50で求める  実行結果:  積分区間 A,B?:0 2 /2.000000 | sqrt(4-x*x)=3.138269 /0.000000 」 としなければなりませんが以下のプログラムでは sqrt(4-x*x)=3.956836と出てしまいます・・・ 色々いじってみましたが期待通りの結果が出ません・・・ どこを変えれば良いのでしょうか? 教えてください。お願いします<_ _> #include<stdio.h> #include<math.h> #define f(x) (sqrt(4-(x)*(x))) /*被積分関数*/ int main(void) { int k; double a,b,n,h,x,s,sum; printf("積分区間 A,B?:"); scanf("%lf %lf",&a,&b); n=50; x=a; s=f(x); h=(b-a)/n; for(k=1;k<n;k++){ x=a+f(x)*h; sum=sum+2*f(x); } x=a+f(x)*h; sum=sum+f(x); sum=h*sum/2.0; printf(" /%f\n",b); printf(" | sqrt(4-x*x)=%f\n",sum); printf(" /%f\n",a); }

質問者が選んだベストアンサー

  • ベストアンサー
  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.3

No.2の者です。 例えば、積分区間が[0, 2]で、分割数が50だとします。 このとき、積分区間を細かく短冊状に区切ったときの幅は (2-0)/50=0.04です。これが、台形の高さに相当します。 さて、1個目の短冊の面積は、 上底:f(0) 下底:f(0.04) 高さ:0.04 から求めます。 2個目の短冊の面積は、台形の高さの分だけずれて、 上底:f(0.04) 下底:f(0.08) 高さ:0.04 から求めます。 これを積分区間の最後まで繰り返します。最後は、 上底:f(1.96) 下底:f(2) 高さ:0.04 となります。 同じパターンを、値を変えて繰り返していますので、 for文によるループで書けるはずです。 これらの短冊状の面積の総和が、求める解となります。

hisetu_001
質問者

お礼

詳しい解説ありがとうございます!<_ _> 再度作ってみましたが・・・ for(k=1;k<n-1;k++){ sum += (f(a)+f(a+h))*h/2; } 「積分区間 A,B?:0 2 /2.000000 | sqrt(4-x*x)=3.839616 /0.000000       」 ・・・aの値が変化していないのがいけないのでしょうか?

その他の回答 (3)

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.4

No.3の者です。 aは積分区間全体の開始位置ですよね。 for文のループの中で、各々の短冊の面積を求めるのに、 f(a)が固定であるのは正しくないです。 短冊の幅(h)の分だけずらしながら、 各々の短冊の面積を求めてください。

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.2

台形の面積を求める公式:(上底+下底)×高さ÷2 積分区間を細かく区切った状態での、xがx1~(x1+h)であるような領域に着目する。このとき、 上底:f(x1) 下底:f(x1+h) 高さ:h 台形の面積:(f(x1)+f(x1+h))*h/2 この計算を、分割数の分だけ繰り返す。

hisetu_001
質問者

お礼

解答ありがとうございます<_ _> 面積分繰り返すということで考えてみましたが、 以下のようになってしまいました。 値は96.040000・・・ もう何がんだか;; --------------の間は自分が組んだ部分で それ以外は与えられたものです。 どこが高さとか・・・わからない状態で・・・ #include<stdio.h> #include<math.h> #define f(x) (sqrt(4-(x)*(x))) /*被積分関数*/ int main(void) { int k; double a,b,n,h,x,s,sum; printf("積分区間 A,B?:"); scanf("%lf %lf",&a,&b); /*積分区間*/ ----------------------------------- sum=0; n=50;  /*分割数*/ x=a; s=f(x); h=(b-a)/n; /*微小区間*/ for(k=1;k<n;k++){ sum += (a+(n-1)*h)*f(x)/2; } ------------------------ printf(" /%f\n",b); printf(" | sqrt(4-x*x)=%f\n",sum); printf(" /%f\n",a); }

  • foobar
  • ベストアンサー率44% (1423/3185)
回答No.1

2点疑問があります. sumの初期値は何でしょうか? x=a+f(x)*h; の文は何を計算しようとしているのでしょうか?

関連するQ&A