- ベストアンサー
二分探索プログラムの添削願い
- 以下のプログラムは、方程式の解を求めるための二分探索プログラムです。
- プログラムでは、ユーザーに関数fのパラメーターを入力させ、その次数に応じて処理を分岐します。
- fが定数項が0でない三次式の場合は解の公式を用いて虚数解を含むすべての解を求め、それ以外の場合は二分法を用いて解を求めます。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
> 危険というのは、区間の境界値が実数解の十分な近似である場合に、==0の判定文ではそれを捉え損ねるという理解で間違いないでしょうか。 そういうことだ。 > whileをforに変えれば「n番目の下限値がn+1番目の上限値になってしまう」という問題も解決するのでしょうか。 そんなわけないでしょ。epsを小さい正数として 1区間の2分探索に与える上限uと下限lに関してfu*fl<-epsとなっていれば2分探索は簡単に書けるよね。この場合には必ずこの範囲に1個または3個の解が存在するのだけれど,あなたの与えられた課題では,3個の解がある場合でも1個だけ発見して残りの2個は見逃してもいいのだから簡単でしょ。 fu*fl>=epsであればこの範囲には解がないとして次の範囲に行く。 それ以外の場合にはuかlのどちらか,または両方が解になるけど,例えばuだけを判定するようにしても,lは次回で判定されるから見逃すことはないでしょう。 でも,もう一度言うけど,方程式の解を求めるのが目的ならこんな下手くそなアルゴリズムは捨てたほうがマシだと思うぞ。
その他の回答 (2)
- f272
- ベストアンサー率46% (8529/18254)
if(fl == 0){ とか if(fu == 0){ を==0で判定するのは危険でしょう。 判定したい数の絶対値<小さい数 で判定すべきです。 しかし,それ以前にどうして区間を1000等分するのか? それでは解が区間の1000分の1未満の差しかないときに対応できません。 ちゃんとそれぞれの解を挟むようにアルゴリズムを考えてください。
お礼
ありがとうございます。 危険というのは、区間の境界値が実数解の十分な近似である場合に、==0の判定文ではそれを捉え損ねるという理解で間違いないでしょうか。 今回作成するアルゴリズムの内容の問題点私も承知していますが、ひとまずそのようなプログラムを作る課題を与えられたということで、そこは問題にしないということでお願いします。
- kmee
- ベストアンサー率55% (1857/3366)
1つのwhileで全部やろうとして、こんがらがってるだけではないでしょうか? for(1000 区間分 ) { 1区間の2分探索 } と考えてコーディングしてみては? 構造化プログラミングといった、プログラミングの考え方を勉強していくとよいでしょう。
お礼
ありがとうございます。 構造化プログラミングというキーワードで自学します。 for文を使って二分法をせよとのことですが、 whileをforに変えれば「n番目の下限値がn+1番目の上限値になってしまう」という問題も解決するのでしょうか。
お礼
ありがとうございます、わかりやすかったです。 方程式の解を求めたいわけでなく、単に課題の内容がそうなっていただけなので、ひとまずこのまま進める予定です。