###前提・実現したいこと
∫[0,a]dx/1+sin(x/2)-2=0が成立するaを計算せよ。
ただし、0<a<10とする。
###発生している問題・エラーメッセージ
aの答えは1.24994です。 おそらく本当の答えは円周率πと同じ3.1415...になると思われるが(手計算)、そうならなかった。
###該当のソースコード
C
1#include <stdio.h> 2#include <math.h> 3double Nibun(double a,double b); 4double Kansu(double x); 5double Sekibun(double b); 6double f(double x); 7 8int main(){ 9 10 double a,b,x; 11 12 a=0; 13 b=10.0; 14 15 x = Nibun(a,b); 16 17 printf("aの答えは%fです。",x); 18 19 return 0; 20} 21 22double Nibun(double a,double b){ 23 24 double c; 25 double e = 0.0001; //誤差 26 int flag = 1; 27 28 while(flag){ 29 30 c = (a+b)/2.0; 31 32 if(Kansu(a)*Kansu(b)<0){ b=c; } 33 else{ a=c; } 34 35 if( b-a < e){ flag = 0; } 36 37 } 38 39 return a; 40} 41 42double Kansu(double x){ 43 44 double y; 45 46 y = Sekibun(x) - 2.0; 47 48 return y; 49} 50 51double Sekibun(double b){ 52 53 double x,h,a,sum; 54 int i,num; 55 56 57 h = 0.0001; 58 a = 0.0; //積分区間。bがもう片方の積分区間になり、aは固定されている。 59 num = (b-a)/h; 60 sum = 0; 61 62 for(i=0; i<num; i=i+2){ 63 x=a + h*i; 64 sum = sum + (f(x)+4*(x+h)+f(x+2*h))/3*h; 65 } 66 67 return sum; 68} 69 70double f(double x){ 71 72 double y; 73 74 y = 1.0 / 1.0 + sin(x/2.0); 75 76 return y; 77}
###試したこと
プログラムの流れとしては、Nibunに引数を渡し、ここで二分法を行い方程式を解きます。
その時に、検査したい方程式をKansuに渡します。Kansuの中で積分が入った式があるので、これを別に計算してもらうSekibunに渡します。
どこがうまくいっていないのか、一日考えたのですがわかりません。
ご教授お願いします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/06/21 07:36
2016/06/21 08:00