

調べたりしながら私なりに書いてみたのですが上手くいきません。
「ans=1.048404」とならなければいけないのに
「nan」で返ってきてしまうのです。
どこをどの様に変えたら良いのでしょうか・・・?
※課題の締め切りが近いので,早急にご回答宜しくお願い致します!
以下、はさみうちのプログラム↓
#include<stdio.h>
#include<math.h>
/*初期値x0,*/
/*f(x)を定義*/
double f(double x){
return sqrt(x*x+10.0) - 10.0*exp(-x*x);
}
/*はさみうち法の関数*/
double hasamiuchi(double x0,double x1,double eps,double imax){
double x2; /*x軸との交点*/
int i; /*繰り返しの回数*/
if(f(x0)*f(x1)>0){/*x0とx1が同符号の場合x1をx0とする*/
x0=x1;
}
for(i=0;i<imax;i++){
x2=(x1*f(x0)-x0*f(x1))/(f(x0)-f(x1)); /*x0とx1で出来る直線とx軸の交点x2を求める*/
x1=x2; /*x2の値を次のループにおけるx1とする*/
}
if(fabs(x1-x0)<eps) return x2; /*収束したら解x2を返す*/
return 0.0/0.0; /*収束しなかったらnanを返す*/
}
int main(void){
printf("ans = %f\n", hasamiuchi(2.0,1.0,1e-6,20));/*値を代入してはさみうちの実行*/
return 0;
}
No.5ベストアンサー
- 回答日時:
問題の箇所を質問文のプログラムでズバリ言うと
if(fabs(x1-x0)<eps) return x2; /*収束したら解x2を返す*/
この行だ。
はさみうち法は2つ方法があって、それぞれ何が何に収束していくかが違う。
両方が移動する方法と片方が移動する方法で、前者は2点の距離が0に、後者は移動する方の点x'におけるf(x')が0に収束する。で、あなたのプログラムは計算ロジックは後者なのに収束判定に前者のものを使っている。
~~~~~~
余談ではあるけど、移動するのは片方だけでいいんだけど、どっちを移動させるかは自動でより適切な方が選ばれるようにした方が良いだろう。あなたのプログラムは、x1が移動する方だと20回では1e-6以内に収まらない。x0の方だと5回目で0.000000に収束する。
No.4
- 回答日時:
これのリスト26 falseposition.cでは
if ( fx*f0 > 0 ) x0 = xp;
と書いてあるよね。
また収束の判定についても
if ( fabs(x-xp) < DBL_EPSILON || fabs(fx) < DBL_EPSILON ) break;
となってるよね。
No.3
- 回答日時:
求める点はどこだかわからないけど決まっている。
その点を二人の人がいて一人は上から下へ、もう一人の人が下から上へ追い込んで行って、二人の距離が十分小さくなったときに挟み込めたと判断するのが挟み込みだと思うが、プログラムを見ると片方の人(x1)しか移動していない。これだとx0が移動していないからいつになっても挟み込めない。と思う。
No.2
- 回答日時:
初期値 : x0, x1 (x0 < x1) の範囲で f(x) == 0 となるxを求める
[1] xm = (x0 + x1) /2
[2.0] x1-x0 が十分小さければ xm が解である → おわり
[2.1] 解が x0 と xm の間にあるならば x1 = xm
[2.2] 解が xm と x1 の間にあるならば x0 = xm
[2.3] どちらでもなければ失敗 → おわり
[3] [1]に戻る
この回答への補足
ご回答ありがとうございます
ですが,[1]の式を使って方程式の解を求めるのは,二分法の時だけでなく,
はさみうちもなのでしょうか・・・?
No.1
- 回答日時:
「はさみうち法」の原理は理解できていますか?
この回答への補足
http://www-it.sci.waseda.ac.jp/teachers/w405201/ …
http://shiotani.cn/shiotanicnb4a/20111212cpptwo. …
以上の2つのページを基に
(1)x0を基準点として既定のx1とx0を通る直線を考える
(2)(1)の直線とx軸とが交わる点を次のx1とする
(3)|x1-x0|<εとなるまで(1)(2)を繰り返す
|x1-x0|<εとなる時,x1が解
と考えるのかなと思っていました。
解釈が違っているのかもしれません・・・
どの様に考えれば良いのか教えていただけませんか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# ある線が円の範囲に入っているかの計算 1 2022/12/07 16:14
- Visual Basic(VBA) VBAプログラミング 2 2022/11/27 12:07
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- Visual Basic(VBA) VBAプログラミング 2 2022/11/27 12:13
- C言語・C++・C# c言語でユーザ関数を利用して複素数のべき乗と絶対値の数列を計算するプログラムが作りたいです。 3 2023/01/29 22:13
- C言語・C++・C# C言語のマクローリン展開ローラン展開のコードについて 3 2022/12/15 14:45
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
物体が往復する動きを作りたい
-
3次元の最短距離計測 MFC...
-
プログラムでの数字につく”f”の...
-
浮動小数点数が表示されないん...
-
C言語を実行すると-infが出てき...
-
至急です! マクロ定義で #defi...
-
C言語で-23乗を取り扱うには
-
float型とdouble型の変数の違い...
-
正規分布の乱数生成
-
doubleの変数にintとintの割り...
-
C言語で関数を使う課題でわかり...
-
はさみうち法のプログラム(C言...
-
C 開放してるのにエラー(doubl...
-
複素変数に値が正しく代入されない
-
C言語でポインタを用いた平均,...
-
c言語で、繰り返し文の中で、0....
-
c言語の構造体エラーについて
-
c言語について
-
C言語のデバック 領域の二重解...
-
C++で等差数列の和に関する問題...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
C 開放してるのにエラー(doubl...
-
float型とdouble型の変数の違い...
-
至急です! マクロ定義で #defi...
-
doubleの変数にintとintの割り...
-
C言語を実行すると-infが出てき...
-
C言語の型による処理速度の違い
-
C言語 関数プロトタイプ宣言の...
-
浮動小数点の定数
-
C言語でdouble型の小数点の引き...
-
difftime()について
-
doubleは常に%lfとするべきなのか
-
C#イベント中の戻り値の設定の...
-
c言語で、繰り返し文の中で、0....
-
int とdoubleの比較
-
C言語のプログラムで#include<m...
-
c言語のプログラミングについて...
-
バイナリから実数を取得したい...
-
c言語のコンパイルエラー canno...
-
関数におけるif文とreturn文に...
おすすめ情報