質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Q&A

解決済

2回答

1864閲覧

f(x) = x^ 3 − 2 = 0 を二分法で解きたい

EUROPEAN

総合スコア17

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

0グッド

1クリップ

投稿2018/09/27 04:19

編集2018/09/27 04:45

前提・実現したいこと

現在プログラミング言語について学習しています。まだまだ初心者で分からないことが多すぎて困っています。そこで二分法を用いたプログラムの課題を与えられたのですがどうプログラムを変更していいのかわかりません、詳しいかたお力添えお願いいたします。

問題.方程式f(x) = x^ 3 − 2 = 0 を二分法で解きたい。

該当のソースコード

/* bisection.h */ #include <stdio.h> #include <math.h> #define EPS 1.0e-10 #define K_MAX 100 void input(double *pa, double *pb); double f(double x); double bisection(double a, double b); void show_each_step(double a, double b, double c, int i); int main(void) { double a, b, ans; input(&a,&b); ans = bisection(a,b); printf("f(%.16f) = %.16f\n",ans,f(ans)); return 0; } void input(double *pa, double *pb) { double tmp; do { printf("input a: "); scanf("%lf",pa); printf("input b: "); scanf("%lf",pb); } while (f(*pa) * f(*pb) > 0.0); if (*pa > *pb) { tmp = *pa; *pa = *pb; *pb = tmp; } } double f(double x) { return (x * x - 2); } double bisection(double a, double b) { double c; int i; /*step3*/ /* to be provided */ for (i = 1; i <= K_MAX; i++) { c = (a + b) / 2.0; show_each_step(a,b,c,i); /*step4の後半,step5*/ /* to be provided */ } return c; } int dgtof(int m) { int ans = 1; while (m >= 10) { ans++; m = m / 10; } return ans; } void show_each_step(double a, double b, double c, int i) { int dgt = dgtof(K_MAX); printf("<%*d> [ %.16f, %.16f ], ",dgt,i,a,b); printf("f(%.16f) = % .16f\n",(a+b)/2.0,f(c)); }

補足情報(FW/ツールのバージョンなど)

/* to be provided */となっている部分を変更しなければなりません。

/step3/はもし |f(a)| < ε ならば a を解として終了.また,もし
|f(b)| < ε ならば b を解として終了.

/step4/はc = a+b/2 とし,もし |f(c)| < ε ならば c を解として終了.

step5はf(a)f(c) > 0 ならば a = c とし,そうでなければ b = c として
Step4 に戻る.

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

swordone

2018/09/27 04:50

そこまでわかっててなにを聞きたいのか不明ですが…あと関数違くないですか?
EUROPEAN

2018/09/27 05:05

/* to be provided */となっている部分のC言語での書き方についてです。
guest

回答2

0

C

1#include <stdio.h> 2#include <math.h> 3 4double f(double x); 5 6int main(void) 7{ 8 double a = 2,b = 1; 9 double c = (a + b) / 2.0; 10 11 while(fabs(f(c)) > pow(10,-15)){ 12 if(f(c) > 0){ 13 a = c; 14 } 15 else if(f(c) < 0){ 16 b = c; 17 } 18 else{ 19 break; 20 } 21 c = (a + b) / 2.0; 22 } 23 printf("%.15f",c); 24 return 0; 25 26} 27 28double f(double x) 29{ 30 return pow(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> 3 4#define EPS 1.0e-10 // 閾値 5#define K_MAX 100 // 最大反復回数 6 7void input(double *pa, double *pb); 8double f(double x); 9double bisection(double a, double b); 10void show_each_step(double a, double b, double c, int i); 11 12int main(void) 13{ 14 double a, b, ans; 15 16 input(&a, &b); // 初期値を得る。 17 ans = bisection(a, b); // 2分法を実行する。 18 printf("result: f(%.2f) = %.2f\n", ans, f(ans)); 19} 20 21// 次を満たす初期値 x1、x2 をとる。 22// (f(x1) と f(x2) の符号が異なり、かつ x1 < x2) 23void input(double *x1, double *x2) 24{ 25 do { 26 printf("input a: "); 27 scanf("%lf", x1); 28 printf("input b: "); 29 scanf("%lf", x2); 30 } while (f(*x1) * f(*x2) > 0.0); 31 // f(x1) と f(x2) の符号が異なるように初期値をとる。 32 33 // 初期値は x1 < x2 となるようにする。 34 if (*x1 > *x2) { 35 double tmp = *x1; 36 *x1 = *x2; 37 *x2 = tmp; 38 } 39} 40 41double f(double x) 42{ 43 return pow(x, 3) - 2; // x^3 - 2 44} 45 46double bisection(double a, double b) 47{ 48 double c; 49 for (int i = 0; i < K_MAX; i++) 50 { 51 c = (a + b) / 2.; 52 53 if (fabs(f(c)) < EPS) 54 break; // 解が見つかった 55 else if (f(a) * f(c) < 0) 56 b = c; // 解は c より右側にある 57 else 58 a = c; // 解は c より左側にある 59 60 show_each_step(a, b, c, i); 61 } 62 63 return c; 64} 65 66void show_each_step(double a, double b, double c, int i) 67{ 68 printf("%d: [%.2f, %.2f], ", i, a, b); 69 printf("f(%.2f) = %.2f\n", c, f(c)); 70}
input a: 0 input b: 2 0: [1.000000000000000, 2.000000000000000], f(1.000000000000000) = -1.000000000000000 1: [1.000000000000000, 1.500000000000000], f(1.500000000000000) = 1.375000000000000 2: [1.250000000000000, 1.500000000000000], f(1.250000000000000) = -0.046875000000000 3: [1.250000000000000, 1.375000000000000], f(1.375000000000000) = 0.599609375000000 4: [1.250000000000000, 1.312500000000000], f(1.312500000000000) = 0.260986328125000 5: [1.250000000000000, 1.281250000000000], f(1.281250000000000) = 0.103302001953125 6: [1.250000000000000, 1.265625000000000], f(1.265625000000000) = 0.027286529541016 7: [1.257812500000000, 1.265625000000000], f(1.257812500000000) = -0.010024547576904 8: [1.257812500000000, 1.261718750000000], f(1.261718750000000) = 0.008573234081268 9: [1.259765625000000, 1.261718750000000], f(1.259765625000000) = -0.000740073621273 10: [1.259765625000000, 1.260742187500000], f(1.260742187500000) = 0.003912973217666 11: [1.259765625000000, 1.260253906250000], f(1.260253906250000) = 0.001585548394360 12: [1.259765625000000, 1.260009765625000], f(1.260009765625000) = 0.000422512079240 13: [1.259887695312500, 1.260009765625000], f(1.259887695312500) = -0.000158837092386 14: [1.259887695312500, 1.259948730468750], f(1.259948730468750) = 0.000131823412403 15: [1.259918212890625, 1.259948730468750], f(1.259918212890625) = -0.000013510360162 16: [1.259918212890625, 1.259933471679688], f(1.259933471679688) = 0.000059155646067 17: [1.259918212890625, 1.259925842285156], f(1.259925842285156) = 0.000022822422940 18: [1.259918212890625, 1.259922027587891], f(1.259922027587891) = 0.000004655976386 19: [1.259920120239258, 1.259922027587891], f(1.259920120239258) = -0.000004427205639 20: [1.259920120239258, 1.259921073913574], f(1.259921073913574) = 0.000000114381936 21: [1.259920597076416, 1.259921073913574], f(1.259920597076416) = -0.000002156412711 22: [1.259920835494995, 1.259921073913574], f(1.259920835494995) = -0.000001021015602 23: [1.259920954704285, 1.259921073913574], f(1.259920954704285) = -0.000000453316887 24: [1.259921014308929, 1.259921073913574], f(1.259921014308929) = -0.000000169467489 25: [1.259921044111252, 1.259921073913574], f(1.259921044111252) = -0.000000027542780 26: [1.259921044111252, 1.259921059012413], f(1.259921059012413) = 0.000000043419577 27: [1.259921044111252, 1.259921051561832], f(1.259921051561832) = 0.000000007938399 28: [1.259921047836542, 1.259921051561832], f(1.259921047836542) = -0.000000009802191 29: [1.259921049699187, 1.259921051561832], f(1.259921049699187) = -0.000000000931896 30: [1.259921049699187, 1.259921050630510], f(1.259921050630510) = 0.000000003503251 31: [1.259921049699187, 1.259921050164849], f(1.259921050164849) = 0.000000001285678 32: [1.259921049699187, 1.259921049932018], f(1.259921049932018) = 0.000000000176891 33: [1.259921049815603, 1.259921049932018], f(1.259921049815603) = -0.000000000377502 34: [1.259921049873810, 1.259921049932018], f(1.259921049873810) = -0.000000000100306 result: f(1.259921049902914) = 0.000000000038292

投稿2018/09/27 09:41

tiitoi

総合スコア21954

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問