二分法

二分法


サイト全体の目次

稿


稿

二分法

(untitled)

関数 f(x) について区間 [a,b] で次のような条件が分かっていたとします。

.ここで、[a,b] の中間点を c とし、もし
f(c)>0

ならば c を新たな b とします。.逆に、
f(c)<0

ならば c を新たな a とします。.この操作を繰り返して行き、区間 [a,b] の幅が十分に小さくなったら、そのいずれかの値を f(x)=0 を満たす x の近似値とするというのが二分法です。

サンプルプログラム

二分法関数

区間 [a,b] で f(a) と f(b) が同符号である場合、永久ループとなってしまうことに気をつけてください。

// ver.041107
#ifndef __BISECTION_H
#define __BISECTION_H

// Function: y=0 を求めたい関数
// left: 計算開始の左端
// right: 計算開始の右端
// e: 終了基準 left right の間隔
double Bisection(double (*Function)(double), double left, double right, double e)
{
	bool rev = false;
	if(Function(left) > 0) rev = true;

	double c;
	for(int i = 0; ; i++){
		c = (left + right) / 2;
		double f = Function(c);
		if(rev) f = -f;
		if(f < 0)
			left = c;
		else
			right = c;
		if(right - left < e) break;
	}
	c = (left + right) / 2;

	return c;
}

#endif

メインプログラム

#include <iostream>
#include <cmath>
using namespace std;
#include "Bisection.h"

double F(double x);

main()
{
	cout << Bisection(F, 0, 3.00, pow(10.0, -10.0)) << endl;

	return 0;
}

double F(double x)
{
	return cos(x);
}


読み込み中・・・
10秒待っても表示が変わらない場合、次の理由が考えられます。
・Javascript が無効になっています。
・検索エンジンのキャッシュを見ています。
サイトホームへ / 上位ページへ / ページトップへ / PAROFトレンドショッピングへ
Copyright (C) 2010 totobon all right reserved.