前提・実現したいこと
二分法というものを使って x - cos(x) = 0 の近似解を求めようとしています。
作ったプログラミングでエラーは発生していないのですが、出力される値が想定しているものではありません。
二分法の原理はとある値a, b と c = (a + b) / 2 を用いてf(a)とf(c)を計算し、f(a)とf(c)が異符号だったらaとcの間に解があるので新たにb = cとし、同符号だったらaとcの間に解はないので新たにa = cとする、というものを繰り返して設定した誤差の値より小さくなったら終わりという形になります。
発生している問題・エラーメッセージ
プログラムを実行すると実行結果が2.50をずっと繰り返しているだけになります。
誤差の設定がうまくいっていないのか、a,b,cそれぞれの値をうまく更新できないないのかのどちらかだと思われます。
該当のソースコード
c
1#include <stdio.h> 2#include <math.h> 3 4/*与えられた式の右辺を計算する関数*/ 5double func(double hensu) 6{ 7 double migi; 8 migi = hensu - cos(hensu); 9 10 return migi; 11} 12 13 14/*二分法を計算する関数*/ 15double bisec(double a, double b, double c) 16{ 17 double kekka, gosa; 18 19 c = (a + b) / 2; 20 kekka = func(a) * func(c); 21 22 23 if (kekka < 0){ 24 b = c; 25 } else { 26 a = c; 27 } 28 29 return kekka; 30} 31 32/*初期値はa = 0, b = 5 , gosa = 1.0*10^-8 */ 33int main(void) 34{ 35 double fx, kekka, seido, hensu, atai, gosa; 36 37 seido = pow(1.0, -8); 38 39 do { 40 double a = 0.0, b = 5.0, c = (a + b) / 2; 41 42 bisec(a, b, c); 43 44 if (a > b){ 45 gosa = a - b; 46 } else { 47 gosa = b - a; 48 } 49 50 printf("%lf\n", c); 51 52 } while (gosa > seido); 53 54 return 0; 55 56}
補足情報(FW/ツールのバージョンなど)
https://replit.com/languages/c
このサイトでコードを書いて実行しています。
回答2件
あなたの回答
tips
プレビュー