No.4ベストアンサー
- 回答日時:
これでどうでしょう。
if文判定、及びwhile文判定を修正しました。
#include <stdio.h>
#include <math.h>
#define f(x)(x*x-2.0)
int main(void)
{
int i=0;
double m,x1=2.0,x2=1.0,eps=1.0e-5;
do{
++i;
m=(x1+x2)/2;
if (f(m)>0)
{
x1 = m;
}
else
{
x2 = m;
}
}
while (fabs(x1-x2)>eps);
printf("%f,%d\n",m,i);
return 0;
}
No.3
- 回答日時:
手抜きですが、こんな感じですか…
#include <stdio.h>
/*
sqrt(2.0) を二分探索法で求める
left 探索範囲左限界
right 探索範囲右限界
conv_cond 収束条件
*/
void solve(double left , double right , double conv_cond)
{
int count; /*試行回数*/
double center; /*中間値*/
for(count=0 ; ; count++)
{
center = (left + right) / 2.0;
/*収束条件を満たしたか*/
if((center - left < conv_cond) &&
(right - center < conv_cond)) break;
/*解は中間値よりも大きいか小さいか*/
if(center*center - 2 < 0)
{
left = center;
}
else
{
right = center;
}
}
printf("%d %f\n" , count , center);
}
int main(void)
{
solve(0 , 2 , 1.0e-5);
return 0;
}
ありがとうございました。
実行するとうまくいきました。
ちなみに、自力で作ってみました。
#include <stdio.h>
#include <math.h>
#define f(x)(x*x-2.0)
main()
{
int i=0;
double m,x1=2.0,x2=1.0,eps=1e-5;
do{
++i;
m=(x1+x2)/2;
if (f(m)*x1>0){
m=x1;
}
else
m=x2;
}
while (fabs(x1-x2)<eps);
printf("%f,%d\n",m,i);
}
これを実行すると、2.000000,1と出ます。
私はこの程度のプログラムしか習ってません。
つまり、ANo.3の方のプログラムだと、解読できないです。
もしよろしければ、自力でやったプログラムに訂正箇所があればお願いします。
ANO.1の方とお礼がかぶってしまい、申し訳ございません。
No.2
- 回答日時:
★リンクの紹介。
>二分法によりルート2の近似値を求めるプログラム、ってどうやって作ったらいいんですか?
↑
次のリンクの『32ビットの整数の場合でループを展開したもの』をご覧下さい。
http://ayusya.hp.infoseek.co.jp/ProgramAlgorithm …
これがアルゴリズムです。
実際に組むときはループ処理をさせれば良いです。
なお、この考え方は数値表現に2進数が使われている事に着目して 8192、4096、2048、1024…と
二分法で平方根を求めているのです。
>ちなみに初期値は2で、収束条件は10^-5です。
↑
double 型を使うなら初期値の 2、4、8、16、32、…と徐々に大きくしていきチェックします。
次のリンクも参考にしてみて下さい。
http://kyutechzemi.hp.infoseek.co.jp/0013/jp0000 …→『平方根を二分法で計算する。』
ソースもダウンロードできるようです。
このソースでは10^(-4)乗が収束条件のようです。
・以上。
参考URL:http://kyutechzemi.hp.infoseek.co.jp/0013/jp0000 …
ありがとうございました。
そうですか。。。
ちなみに、自力で作ってみました。
#include <stdio.h>
#include <math.h>
#define f(x)(x*x-2.0)
main()
{
int i=0;
double m,x1=2.0,x2=1.0,eps=1e-5;
do{
++i;
m=(x1+x2)/2;
if (f(m)*x1>0){
m=x1;
}
else
m=x2;
}
while (fabs(x1-x2)<eps);
printf("%f,%d\n",m,i);
}
これを実行すると、2.000000,1と出ます。
訂正箇所があればお願いします。
ANO.1の方とお礼がかぶってしまい申し訳ありません。
No.1
- 回答日時:
>関数とかif else文とかwhile文とかfor文とか、そういう簡単なのしか習ってないので
その程度の範囲で書けるはずです。ニュートン法より易しいと思うのですが。
そうですか。。。
ちなみに、自力で作ってみました。
#include <stdio.h>
#include <math.h>
#define f(x)(x*x-2.0)
main()
{
int i=0;
double m,x1=2.0,x2=1.0,eps=1e-5;
do{
++i;
m=(x1+x2)/2;
if (f(m)*x1>0){
m=x1;
}
else
m=x2;
}
while (fabs(x1-x2)<eps);
printf("%f,%d\n",m,i);
}
これを実行すると、2.000000,1と出ます。
訂正箇所があればお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
初めて見た映画を教えてください!
初めて見た映画を覚えていますか?
-
歳とったな〜〜と思ったことは?
歳とったな〜〜〜、老いたな〜〜と思った具体的な瞬間はありますか?
-
あなたの「プチ贅沢」はなんですか?
お仕事や勉強などを頑張った自分へのご褒美としてやっている「プチ贅沢」があったら教えてください。
-
あなたの人生で一番ピンチに陥った瞬間は?
これまでの人生で今振り返ると「あの時、1番ピンチだったなぁ...」という瞬間はありますか?
-
【お題】斜め上を行くスキー場にありがちなこと
運営も客も一流を通り越して斜め上を行くスキー場にありがちなことを教えて下さい。
-
方程式を2分法を用いて解くプログラム
C言語・C++・C#
-
C言語 二分法 プログラム
その他(プログラミング・Web制作)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・あなたの人生で一番ピンチに陥った瞬間は?
- ・初めて見た映画を教えてください!
- ・今の日本に期待することはなんですか?
- ・【大喜利】【投稿~1/31】『寿司』がテーマの本のタイトル
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・【お題】大変な警告
- ・【大喜利】【投稿~1/20】 追い込まれた犯人が咄嗟に言った一言とは?
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・最強の防寒、あったか術を教えてください!
- ・【大喜利】【投稿~1/9】 忍者がやってるYouTubeが炎上してしまった理由
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
for文の中にswitch文はいれられ...
-
構文エラー";"が型の前にあり...
-
販売金額の合計などを求める問題
-
#if 1 #elseの意味について
-
getcの改行判定
-
C言語階乗の総和を求める
-
c言語のwhile文を使った計算で...
-
配列を関数に渡す方法
-
C言語
-
VHDLで、case文とwhen文のどち...
-
C言語 入力した数値の平均値の...
-
全角文字の判定
-
行列をべき乗させるプログラム
-
C言語です
-
Aの値からBの値を除するとは??
-
20'(角度)の計算がわかりま...
-
「Aに対するBの割合」と「Aに対...
-
信頼区間の1.96や1.65ってどこ...
-
「指定されたキャストは有効で...
-
「{ } で囲むだけ」は正しい?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
構文エラー";"が型の前にあり...
-
for文の中にswitch文はいれられ...
-
#if 1 #elseの意味について
-
プログラミングで二番目に大き...
-
getcの改行判定
-
配列を関数に渡す方法
-
配列を使って魔方陣
-
10進数からN進数に変換するプロ...
-
scanf関数を用いての加減乗除%...
-
while文について、c言語...
-
初心者です。for文、if文を使っ...
-
C言語階乗の総和を求める
-
行列をべき乗させるプログラム
-
プログラム
-
C言語のwhile文を使った素数判...
-
C言語プログラムが理解できなくて…
-
scanfが実行されません
-
C言語。どうしてコンパイルでき...
-
while文を使った問題なのですが...
-
C言語 入力した数値の平均値の...
おすすめ情報