こんばんは。C言語は超初心者です。以下の文は二分法の部分をサブ化したつもりの文です。がうまくいきません。修正箇所が山ほどあると思いますがよろしくお願いします。
int main (void)
{
double solution, x;
double bisec(double x);
solution=bisec(x);
cout<<solution<<endl;
return 0;
}
//bisec sub
double bisec(double x)
{
double x, x0, x1, x2, y, y0, y1;
int i=0, k=0, j=0;
x=0.1;
y1=f(x);
for(;;)
{
for(;;)
{
x+=0.1;
if(x>=10.0)
{
exit(0);
}
y=f(x);
if(y*y1>0)
{
y1=y;
}
else
{
x1=x-0.1;
x2=x;
x0=x;
y0=y;
break;
}
}
for(;;)
{
x=(x1+x2)/2.0;
i++;
if(fabs((x-x1)/x)>1.0e-14)
{
y=f(x);
if(y*y1>0)
{
x1=x;
y1=y;
}
else
{
x2=x;
}
}
else
{
return x;
x=x0;
y1=y0;
break;
}
}
}
}
includeと関数f(x)の定義は省略しました。二分法のサブの部分は複数の解を得ることが出来るようになっています。次のことをご教授お願いします。
一つ目は、上の文のbisec(double x)をdouble()にするとエラーが出ないのですが根本的にその理由が分かりません。
二つ目は、解を複数表示する方法が分かりません。上の文では一回returnしちるため1つしか表示されないということは分かるのですが。。
なるべく原文を崩さないで修正お願いします。あまり変わってしまうと理解できないので。。お願いします。
No.2ベストアンサー
- 回答日時:
数値解析では誤差を含んだ1つの解しか見つけることができません。
その解が妥当であるかどうかは人間が検証する必要があります。逐次二分法では、通常、解の探索区間(x1,x2)を変更しながら複数回繰り返して探索します。しかし、f(x1),f(x2)の符号が同じであれば、その中に偶数個の解が含まれている可能性は否定できません。今回のプログラムでは区間を指定できるように改造しておくといいでしょう。
No.1
- 回答日時:
#include <iostream.h>
#include <math.h>
int main (void)
{
//double solution, x;
double solution, x=0;
//double bisec(double x);
double bisec(double);
solution=bisec(x);
cout<<solution<<endl;
return 0;
}
// double f(double x){ return 2*x-5;}
//bisec sub
double bisec(double x)
{
//double x, x0, x1, x2, y, y0, y1;
double x0, x1, x2, y, y0, y1;
X<10でしか答えが出ませんがそれはいいのですか。
double bisec(double);
はプロトタイプ宣言ですから変数xを記入してはいけません。新たにxが宣言しようとしてしまい、前のxの宣言と重複します。
同様にsubのところも宣言が先に行われていますので、内部での宣言は不要です。
この回答への補足
ご回答ありがとうございます。大変よく理解できました。
二分法の解を複数得る方法は何かないでしょうか?よろしければお願いいたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# ある線が円の範囲に入っているかの計算 1 2022/12/07 16:14
- その他(プログラミング・Web制作) Pythonにおける物理のシミュレーションでの単位変換について 2 2023/06/02 17:11
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- Visual Basic(VBA) VBAプログラミング 2 2022/11/27 12:07
- C言語・C++・C# LU分解法のピボッティングについて(C言語/gcc-9) 3 2022/07/11 23:10
- その他(プログラミング・Web制作) Pythonでのかんたんな物理シミュレーションについての書籍 5 2023/06/02 07:37
- C言語・C++・C# C言語のマクローリン展開ローラン展開のコードについて 3 2022/12/15 14:45
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- Visual Basic(VBA) VBAプログラミング 2 2022/11/27 12:13
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
float型とdouble型の変数の違い...
-
doubleの変数にintとintの割り...
-
c言語で、繰り返し文の中で、0....
-
至急です! マクロ定義で #defi...
-
C言語で-23乗を取り扱うには
-
floating point not loadedとは?
-
C言語の型による処理速度の違い
-
数値を指数部と仮数部に分離したい
-
C 開放してるのにエラー(doubl...
-
int とdoubleの比較
-
関数におけるif文とreturn文に...
-
-1.#IND00 をデバッグしたい
-
C言語を実行すると-infが出てき...
-
doubleは常に%lfとするべきなのか
-
相互相関関数
-
C++で割り算の結果を昇順に出力...
-
C言語でポインタを用いた平均,...
-
配列を戻り値にして逆行列を求...
-
Cで3乗根を求める方法
マンスリーランキングこのカテゴリの人気マンスリー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と出てしまうのですが...
おすすめ情報