プロが教えるわが家の防犯対策術!

C言語での二分法の解法になやんでいます。

f(x)=X2乗-2でf(x)=0の解を2分法により求める場合のプログラムを教えて下さい。
収束条件|ak-bk|<10^-6と|f(ck+1)|<10^-6のいずれかを満足。また、解を求める過程として、k,ak,bk,|ak-bk|, ck+1, f(ck+1) (k=0,1,2,3...)も示してくれないでしょうか。よろしくお願いします。

注:
a,b,cに付属するk,k+1はa,b,cの下側に付く小文字です。(a1,a2... ak, ak+1. b1 b2... bk, bk+1)

A 回答 (2件)

#include <stdio.h>


#include <math.h>

#define DISP_PROCESS

double f(double x) {return x * x - 2;}

double solve(double a, double b, double (*func)(double v))
{
// a と b の間にある、func(c) == 0 となる、c を算出する。
// ただし、a < b であり、かつ、func(a) < 0, func(b) >0 かつ、[a, b] で、func() は、
// 単調に増加するものと仮定している。

const double err = 1.0e-6;
static int k = 0;

double c = (a + b) /2 ;
k++;

#if defined(DISP_PROCESS)
printf("k = %d\na = %f, b = %f , abs(a - b) = %f\nc = %f, func(c) = %f\n\n", k, a, b, fabs(a - b), c, func(c));
#endif

if (fabs(a - b) < err) return c;
if (fabs(func(c)) < err) return c ;

if (f(c) > 0) return solve(a, c, func);
else return solve(c, b, func);
}

int main()
{
printf("ANS = %f", solve(0, 2, f));
return 0;
}
---------------------------------------------------------
solve() をわずかに一般化して、
・a < b
・func(a) と func(b) が異符号
・[a, b] で func() は単調
の条件で、対応可能とした例。

int sign(double v)
{
if (v > 0) return 1;
if (v < 0) return -1;
return 0;
}

double solve(double a, double b, double (*func)(double v))
{
const double err = 1.0e-6;
static int k = 0;

double c = (a + b) /2 ;
k++;

#if defined(DISP_PROCESS)
printf("k = %d\na = %f, b = %f , abs(a - b) = %f\nc = %f, func(c) = %f\n\n", k, a, b, fabs(a - b), c, func(c));
#endif

if (fabs(a - b) < err) return c;
if (fabs(func(c)) < err) return c ;

if (sign(func(a)) == sign(func(c))) return solve(c, b, func);
if (sign(func(b)) == sign(func(c))) return solve(a, c, func);
return c;
}

再帰って美しい。
    • good
    • 2

> C言語での二分法の解法になやんでいます。



C言語じゃない解法には悩んでないのですね?
それをC言語に「翻訳」するだけですが、どこで悩んでいるのでしょう?

繰り返し方、とか、収束条件の判定と成立/不成立での処理方法、とか、途中の表示、とかがわからないなら、C言語の基本なので、最初から復習してください。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!