![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
2分法を授業で習い、アルゴリズムは理解できました。
そして、2分法で方程式の解を求めるプログラムも完成したのですが、
3次方程式などの全ての解を2分法で求める場合、本来ならば、
グラフなどを描き、適切な初期値を自分で変更していく必要があると思います。
しかし、方程式の複数の解を自動的に求めたいのです。
もし、2分法で方程式の複数の解を自動的に求めるアルゴリズムがあれば教えていただけないでしょうか。
よろしくお願いします。
※ 私が作成したプログラム(C言語)も載せておきます。
#include <stdio.h>
#include <math.h>
double f(double x)
{
return ((x-1.0)*(x-2.0)*(x-3.0));
}
int main ()
{
int i;
double a,b,x;
double gosa = 1.0e-14;
printf("aの値を入力してください。\n");
scanf("%lf",&a);
printf("bの値を入力してください。\n");
scanf("%lf",&b);
if(f(a)*f(b) >0) printf("aとbの範囲の中に適切な解が存在しません。\n");
while(1){
x = (a+b)/2.0;
printf("%.14f\n",x);
if(fabs(b-a)<gosa) break;
if(f(a)*f(x)<=0){
b = x;
}
else{
a = x;
}
}
return(0);
}
No.2ベストアンサー
- 回答日時:
#1 では「一般論的には不可能」と書きましたが, 解くべき方程式が「重解を持たない」実係数代数方程式 (つまり「実係数多項式 = 0」の形) で, かつ「係数を与えている」場合にはすべての実解を見つけることが可能です.
これは二分法では「それぞれの解に対し, その解を (そしてその解だけを) 含む区間を決定する」ことができればよいわけですが, そのためには「与えられた区間にどれだけの解を持つか」がわかれば十分です. もちろんこれ自体が一般には無理ですが, 上の条件を満たせば「Strum列」というものを考えることで可能となります.
詳細は参照URL を見てほしいわけですが, ここで「数式として微分する」という操作が必要なので「係数を与える」ことが条件に入ってきます.
参考URL:http://www.math.meiji.ac.jp/~mk/labo/text/eigen- …
なるほど!
一部の方程式には,Strum列というものを用いることで解を求めることが出来るのですね!
ありがとうございました。
Strum列を用いたアルゴリズムを考えてみます!
No.3
- 回答日時:
重箱の隅ですが…
>if(f(a)*f(b) >0) printf("aとbの範囲の中に適切な解が存在しません。\n");
>while(1){
解が存在しない、というエラーメッセージを出しておきながら
計算を続ける、というのは本当に適切かどうかというと、
必ずしもそうとは言いきれないような気がしないでもありません。
プログラムを終わらせてしまうか、aとbの再入力を求めるようにする方が
より適切ではないかと思ったりしないわけではありません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
- C言語・C++・C# LU分解法のピボッティングについて(C言語/gcc-9) 3 2022/07/11 23:10
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# LU分解法のピボット選択機能実装について(C言語・gcc-9) 1 2022/07/22 15:20
- C言語・C++・C# c言語でユーザ関数を利用して複素数のべき乗と絶対値の数列を計算するプログラムが作りたいです。 3 2023/01/29 22:13
- C言語・C++・C# C言語 3 2022/10/04 15:07
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# C言語階乗の総和を求める 2 2023/03/04 23:31
- C言語・C++・C# C言語(構造体) 3 2022/07/05 20:08
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語を実行すると-infが出てき...
-
doubleの変数にintとintの割り...
-
c言語で、繰り返し文の中で、0....
-
float型とdouble型の変数の違い...
-
プログラムでの数字につく”f”の...
-
C言語の型による処理速度の違い
-
C 開放してるのにエラー(doubl...
-
c言語 標準体重計算のプログラ...
-
C言語 関数プロトタイプ宣言の...
-
方程式を2分法を用いて解くプロ...
-
至急です! マクロ定義で #defi...
-
C言語でポインタを用いた平均,...
-
浮動小数点の定数
-
関数プロトタイプ無しで、引数...
-
C言語で
-
遺伝的アルゴリズムのプログラム
-
C言語の構造体の問題が分かりま...
-
C言語のデバック 領域の二重解...
-
C言語で台形公式を使った二重積...
-
指数の表示
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
C言語を実行すると-infが出てき...
-
float型とdouble型の変数の違い...
-
doubleの変数にintとintの割り...
-
c言語で、繰り返し文の中で、0....
-
C言語 関数プロトタイプ宣言の...
-
関数におけるif文とreturn文に...
-
C 開放してるのにエラー(doubl...
-
C言語の型による処理速度の違い
-
至急です! マクロ定義で #defi...
-
doubleは常に%lfとするべきなのか
-
Cで3乗根を求める方法
-
-1.#IND00と出てしまうのですが...
-
C言語で-23乗を取り扱うには
-
C++で外積
-
2次方程式の解を求めるプログ...
-
方程式を2分法を用いて解くプロ...
-
ニュートン法
-
c言語のコンパイルエラー canno...
-
difftime()について
おすすめ情報