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)
No.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;
}
再帰って美しい。
No.1
- 回答日時:
> C言語での二分法の解法になやんでいます。
C言語じゃない解法には悩んでないのですね?
それをC言語に「翻訳」するだけですが、どこで悩んでいるのでしょう?
繰り返し方、とか、収束条件の判定と成立/不成立での処理方法、とか、途中の表示、とかがわからないなら、C言語の基本なので、最初から復習してください。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 物理学 フーリエ変換の振幅について 1 2022/09/04 08:56
- 数学 高校数学で質問があります。 2 2023/02/13 16:40
- 数学 indicator func 2 2022/12/01 13:53
- 数学 関数のグラフ 5 2023/07/20 23:57
- 数学 大学数学の問題です。 条件 (x/a)^2+(y/b)^2+(z/c)^2=1 のもとで、f(x,y 3 2023/05/01 11:28
- その他(プログラミング・Web制作) このpythonコードの意味教えて下さい! 2 2022/08/26 00:52
- 数学 関数f(x)=x^3+ax^2+bx+cとする。このとき、y=f(x)は以下の条件を満たしている。 1 2023/02/11 14:40
- 数学 ラグランジュの未定乗数法を用いる問題 3 2023/05/15 14:48
- DIY・エクステリア MAXの塗装に特化したAK-L1270E2Pについて 2 2023/03/16 23:58
- 数学 曲線y= f(x)上の任意の点Pで引いた法線とx軸の交点をN、Pからx軸に下ろした垂線の足をHとする 3 2022/12/25 10:45
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
floating point not loadedとは?
-
64bit系でのmalloc
-
数値を指数部と仮数部に分離したい
-
C言語を実行すると-infが出てき...
-
関数におけるif文とreturn文に...
-
至急です! マクロ定義で #defi...
-
float型とdouble型の変数の違い...
-
C++で割り算の結果を昇順に出力...
-
C言語で直角三角形の斜辺を求め...
-
斜辺と角度て底辺と高さを出したい
-
C言語初心者 構造体 課題について
-
C言語の複素数についてです。
-
C言語で
-
listに構造体を格納
-
C言語で-23乗を取り扱うには
-
たくさんの数の平均を求める方...
-
C 開放してるのにエラー(doubl...
-
C言語の問題について
-
C++で外積
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
doubleの変数にintとintの割り...
-
C 開放してるのにエラー(doubl...
-
Cで3乗根を求める方法
-
float型とdouble型の変数の違い...
-
至急です! マクロ定義で #defi...
-
C言語の型による処理速度の違い
-
int とdoubleの比較
-
関数におけるif文とreturn文に...
-
C言語初心者 構造体 課題について
-
c言語のコンパイルエラー canno...
-
C言語 関数プロトタイプ宣言の...
-
C言語を実行すると-infが出てき...
-
float?数字の後にLがつくもの
-
数値を指数部と仮数部に分離したい
-
difftime()について
-
浮動小数点数が表示されないん...
-
たくさんの数の平均を求める方...
-
DWORDの警告
-
-1.#IND00と出てしまうのですが...
おすすめ情報