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ランキング
-
float型とdouble型の変数の違い...
-
プログラムでの数字につく”f”の...
-
doubleの変数にintとintの割り...
-
C言語を実行すると-infが出てき...
-
上三角行列の解を出力するプロ...
-
関数におけるif文とreturn文に...
-
至急です! マクロ定義で #defi...
-
C++で外積
-
C言語 関数プロトタイプ宣言の...
-
c言語で、繰り返し文の中で、0....
-
C言語で台形公式を使った二重積...
-
MATLAB:多数の画像を取り込み...
-
C 開放してるのにエラー(doubl...
-
C言語(プログラミング)関連の質...
-
マチンの公式による円周率のプ...
-
C言語の型による処理速度の違い
-
doubleは常に%lfとするべきなのか
-
斜辺と角度て底辺と高さを出したい
-
-1.#IND00と出てしまうのですが...
-
浮動小数点の定数
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
float型とdouble型の変数の違い...
-
doubleの変数にintとintの割り...
-
C言語を実行すると-infが出てき...
-
C 開放してるのにエラー(doubl...
-
至急です! マクロ定義で #defi...
-
c言語で、繰り返し文の中で、0....
-
関数におけるif文とreturn文に...
-
C言語 関数プロトタイプ宣言の...
-
C言語初心者 構造体 課題について
-
C言語の型による処理速度の違い
-
Cで3乗根を求める方法
-
C言語で-23乗を取り扱うには
-
2分法で方程式の複数の解を自...
-
doubleは常に%lfとするべきなのか
-
c言語のコンパイルエラー canno...
-
C言語で直角三角形の斜辺を求め...
-
C言語のプログラムで#include<m...
-
int とdoubleの比較
-
C++で外積
おすすめ情報