1#include<stdio.h>2#include<math.h>34doublef(double x);56intmain(void)7{8double a =2,b =1;9double c =(a + b)/2.0;1011while(fabs(f(c))>pow(10,-15)){12if(f(c)>0){13 a = c;14}15elseif(f(c)<0){16 b = c;17}18else{19break;20}21 c =(a + b)/2.0;22}23printf("%.15f",c);24return0;2526}2728doublef(double x)29{30returnpow(x,3)-2;31}
投稿2018/09/27 12:02
退会済みユーザー
総合スコア0
0
ベストアンサー
こんな感じでしょうか?
10桁精度で求まりました。
プログラムの答え 1.259921049902914
Wolframe Alpha の答え x = 2^(1/3) = 1.259921049894873164767210607278228350570251464701507980081
c
1#include<math.h>2#include<stdio.h>34#defineEPS1.0e-10// 閾値5#defineK_MAX100// 最大反復回数67voidinput(double*pa,double*pb);8doublef(double x);9doublebisection(double a,double b);10voidshow_each_step(double a,double b,double c,int i);1112intmain(void)13{14double a, b, ans;1516input(&a,&b);// 初期値を得る。17 ans =bisection(a, b);// 2分法を実行する。18printf("result: f(%.2f) = %.2f\n", ans,f(ans));19}2021// 次を満たす初期値 x1、x2 をとる。22// (f(x1) と f(x2) の符号が異なり、かつ x1 < x2)23voidinput(double*x1,double*x2)24{25do{26printf("input a: ");27scanf("%lf", x1);28printf("input b: ");29scanf("%lf", x2);30}while(f(*x1)*f(*x2)>0.0);31// f(x1) と f(x2) の符号が異なるように初期値をとる。3233// 初期値は x1 < x2 となるようにする。34if(*x1 >*x2){35double tmp =*x1;36*x1 =*x2;37*x2 = tmp;38}39}4041doublef(double x)42{43returnpow(x,3)-2;// x^3 - 244}4546doublebisection(double a,double b)47{48double c;49for(int i =0; i < K_MAX; i++)50{51 c =(a + b)/2.;5253if(fabs(f(c))< EPS)54break;// 解が見つかった55elseif(f(a)*f(c)<0)56 b = c;// 解は c より右側にある57else58 a = c;// 解は c より左側にある5960show_each_step(a, b, c, i);61}6263return c;64}6566voidshow_each_step(double a,double b,double c,int i)67{68printf("%d: [%.2f, %.2f], ", i, a, b);69printf("f(%.2f) = %.2f\n", c,f(c));70}