
No.2ベストアンサー
- 回答日時:
初心者向けにご説明します。
2分探索法は、与えられた範囲を2つに分けて、求める解がどちらにあるか範囲を絞り、
絞った範囲をまた2つに分けてどちらかに絞り・・・
と繰り返して行って、求める解の範囲を絞っていくやり方です。
方程式を求めるには、解を含む範囲(複数個あってはいけない)と、許される誤差を
指定する必要があります。
もう少し具体的に話すと、範囲の下限、上限をそれぞれ x_min, x_max として、
f(x_min) < 0, f(x_max) > 0
つまり、与えられた範囲内ではグラフは右上がりで、1点だけx軸と交わる(これが解)場合、
x_mid = (x_min + x_max) / 2.0
として、
f(x_mid) < 0
であれば、求める解はx_midよりも大きい側にあるので、次はx_minにx_midを代入して
同じ処理を繰り返せばOK。
f(x_mid) > 0
の場合は、求める解はx_midよりも小さい側にあるので、次はx_maxにx_midを代入して
同じ処理を繰り返すことになります。
メインループのみ未コーディングのプログラムを以下に挙げます。
上記を参考に、仕上げてみて下さい。
余裕があれば、範囲の上下限がたまたま0になった場合の終わらせ方も考えてみて下さい。
---(全角スペースは全て半角スペースに置き換えて下さい)-----
#include <stdio.h>
#include <math.h>
/**************************
条件
***************************/
double x_min = -1.5; /* 範囲最小値(初期値) */
double x_max = -1.0; /* 範囲最大値(初期値) */
double delta_x = 0.000001; /* 許容誤差 */
/**************************
方程式
***************************/
double f(double x)
{
double ret;
ret = 2 * (1 - 2 * x) / (33 * (1 - 2 * x) - pow(x * (2 * x), 5)) - (1 - pow((1 - x), 1 / 4));
return(ret);
}
/**************************
main関数
***************************/
int main(void)
{
double x_mid; /* 範囲の中央 */
double fx_min, fx_max; /* 範囲の境界 */
double dir; /* グラフの傾き(方向) */
/* 条件を検査 */
fx_min = f(x_min);
fx_max = f(x_max);
if((fx_min < 0) && (fx_max > 0))
dir = 1.0; /* グラフが右上がりの場合 */
else if((fx_min > 0) && (fx_max < 0))
dir = -1.0; /* グラフが右下がりの場合 */
else
return(-1); /* 範囲の設定が悪い */
/* メインループ */
while(x_max - x_min > 2 * delta_x)
{
/* x_mid を算出する */
/* f(x_mid) を計算し、求める解がx_midのどちら側か判断する */
/* x_max, x_minを更新する */
}
/* 最終的な範囲の中央値を求める解とする */
x_mid = (x_min + x_max) / 2.0;
printf("x = %lf\n", x_mid);
return(0);
}
大変わかりやすく、丁寧な解説をありがとうございます。
なんとかプログラムも形にすることができました。
また機会がありましたら是非、よろしくお願いします。
No.1
- 回答日時:
参考URLのところに、「二分法による方程式の解法」として、原理が載っていましたよ。
丁度 C言語のサンプルプログラムもありましたので、それを参考にすればプログラミングできるでしょう。参考URL:http://www.edu.cc.uec.ac.jp/mce/c1-3m/equation/
ありがとうございます。是非参考にさせていただきます。
自分のレベルだとプログラムの内容を理解するのに時間がかかりそうですが、頑張ってみます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 数学 2次方程式の「(x-3)^2=4」を解くとき、 そのまま解くことも可能ですが A=x-3と置いて、A 3 2023/01/27 18:20
- 数学 2階微分方程式の特性方程式いつ使う? 1 2022/06/26 22:11
- 数学 数学 二次関数 3 2023/06/04 21:58
- 数学 微分方程式 二階非線形 の問題で質問です。 ① y''-4y'+5y=e^(2x)/sinx ②y" 2 2022/11/07 23:57
- 物理学 至急お願いします。高1力学です。 添付写真の問題で、(d)まで解きすすめたのですが最後方程式を解くだ 1 2022/08/01 23:07
- 数学 球面と接する直線の軌跡が表す領域 4 2023/07/30 12:37
- 宇宙科学・天文学・天気 AIが答えた方程式 1 2023/02/20 00:12
- 数学 分数方程式を解く際にグラフを描く必要はあるのですか? 2x-1/(x-1)=x+1 のような分数方程 2 2022/12/17 16:05
- 高校 対数方程式につきまして 4 2022/05/05 07:55
- 数学 (x-1)(x-2)=0のような因数分解された形でも二次方程式であることには変わりないのでしょうか? 6 2022/08/25 20:11
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
.NET 小数点以下の切り捨てにつ...
-
get_sqr()という関数について
-
doubleの変数にintとintの割り...
-
C 開放してるのにエラー(doubl...
-
C言語で内積、、、わかりません。
-
c言語 プログラム
-
このプログラムを添削してください
-
プログラムでの数字につく”f”の...
-
fgets()による繰り返し入力(c言語)
-
C言語を実行すると-infが出てき...
-
floating point not loadedとは?
-
float型とdouble型の変数の違い...
-
C#、太らせた多角形を塗りつぶ...
-
c言語で、繰り返し文の中で、0....
-
実数型の変数に値を入力した計...
-
複利の利率を求めるプログラム...
-
int とdoubleの比較
-
c言語でDFTのプログラムを作成...
-
C言語のプログラムで#include<m...
-
C言語で-23乗を取り扱うには
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
float型とdouble型の変数の違い...
-
C言語を実行すると-infが出てき...
-
C 開放してるのにエラー(doubl...
-
c言語で、繰り返し文の中で、0....
-
doubleの変数にintとintの割り...
-
至急です! マクロ定義で #defi...
-
C言語の型による処理速度の違い
-
C言語 関数プロトタイプ宣言の...
-
2次方程式の解を求めるプログ...
-
関数におけるif文とreturn文に...
-
doubleは常に%lfとするべきなのか
-
int とdoubleの比較
-
C言語のプログラムで#include<m...
-
C言語で-23乗を取り扱うには
-
データ数の多い構造体配列
-
指数の表示
-
C言語のpow関数の不具合
-
c言語のプログラミングについて...
-
c言語のコンパイルエラー canno...
おすすめ情報