• 締切済み

二分法、定点法、ニュートン法の比較

数値解析で、二分法、定点法、ニュートン法(ニュートンラフソン法)でもっとも的確で効率がいいのはどれなのでしょうか。 ニュートン法が早いのはわかるのですが、微分した式を見つけられないこともあることを考えると、安易には決められないように思います。 多項式、三角方程式、指数方程式などタイプによってどの方法が効率的、というふうに決められるのでしょうか? まとまっていない質問ですみません。わかる方がいらっしゃいましたらよろしくお願いします。

みんなの回答

noname#221368
noname#221368
回答No.5

 $2です。質問内容から言って、大規模数値問題を解いているのでないと判断し、#2を書きましたが、確認すべきでした。問題が大規模な場合は、#3,#1さんを参考にして下さい。  以下、小規模を前提にして書きます。まず解が一個の区間への絞り込みですが、ここが一番苦労するところです。そしてどんな計算方法を使うにしろ、一番いいのはやはり、グラフを目で見て判断する事だと思います。昔はグラフを描くのもおおごとでしたが、今ではExcelなどで簡単に描けます。  ところでExcelなどでグラフを描けるなら、それも自動化できます。実用的には、ある方程式の全ての解でなく、使える解の範囲が最初から決まっているのが普通です。それをここでは、a≦x≦bとします。  基本的にはa≦x≦bを1000分割くらいしてサンプル点をとり、関数値を調べます。分割の細かさは、経験的に判断してます。このとき重要になるのが、#1さんも仰っていますが、関数に対する習熟度です。例えば関数の定性的性質から、次に述べる値調べを、まるごと省略できるかも知れませんし、細かさに対する指標にもなります。  サンプル関数値の正負が変化する区間を見つけたら、そこでは単調変化を仮定して、二分法を単純に適用します。解の位置とそこでの関数値を記録します。次にそれらの点を除き、サンプル値が0に近いと思える点を、全てリストします。「どの程度だったら近いのか?」の判断も経験です。  リスト内の点を含む最少区間をとり、差分を実行しながら二分法を使用します。今度の二分法は、極大・極小点の探索です。差分の幅は、二分法の精度程度にし、差分の正負から極大・極小点を確定して重解とします。そこでの関数値と、差分値を差分幅で割った微分値も記録します。  以上は、サンプル点の取り方に依存するので、得られた関数値と微分値が、所定の精度で0付近にあるかをチェックします。チェックで不可となった場合は、捨てるか(捨てる条件も考えます)、その区間だけを取り出して、上記と同じ方法を適用して解候補を絞り、全て可となるまで繰り返します。この時も関数の定性的性質から、事前に解の個数がわかっていれば、判定基準の決定打になります。  ・上記繰り返しは、無限ループに陥りやすいので、十分な安全対策が必要です。  ・安全対策の中には、「諦める」という選択肢もあり得ます。  ・事前に解の個数がわかっていない場合、上記方法で解を全て尽くしたという保証は得られません。  ニュートン法で微分が面倒という話しがありましたが、ある意味で全て数値的に行う方法もあります。大規模計算でない時には、逆にプログラムが面倒なので私は使った事がありませんが、次の本を参考にしてみて下さい。  ・数値計算法の数理,杉原正顕,室田一雄,岩波書店2007年6月  この本は、コンピューターの有効数字についても、ちゃんとした数学的議論が載っている数少ない本です。

全文を見る
すると、全ての回答が全文表示されます。
noname#221368
noname#221368
回答No.4

 #2です。  質問者様へ。  回答者どうしのやり取りは禁止されておりますが、一回だけ許して下さい。  #3さんへ。  仰るとおりです。私はせいぜい100回以内の計算量を前提にしていました。一万回ともなると、じゅうぶん初期値を検討したニュートン法を選ぶだろうと思います。  それと直接関係ないのですが、職業柄どうしても次の点が気になるので、書いてしまいます。Excelの一万個のCellを書き直すという事ですが、以下に述べる事を既に検討済みならば、お許し下さい。  (1)計算ルーティンをVBAで書いているなら、Applicationとして計算ルーティンを独立させ、ApplicationからExcelを操作する。  (2)Excelは非表示で起動させ、計算終了後に表示する。  (3)Excelから直接Dataを読まない。Sheetの該当範囲をExcelにBinary出力させ(これは速いです)、AppにはBinaryファイルを読ませ、Excel Sheetへの入出力は、結果書き込みにとどめる。  (4)Cellへの読み書きを、CellsやRangeで直接行わない。該当範囲を全部配列に読み込んで操作する。配列=Range(範囲),Range(範囲)=配列で出来ます。  (5)Excel Chartに頼らない。  これだけで、かなりのスピードアップが図れると思います。

全文を見る
すると、全ての回答が全文表示されます。
  • KappNets
  • ベストアンサー率27% (1557/5688)
回答No.3

<現在は、0.1秒が0.001秒に短縮されたとしても、「煙草一本吸えやしない」という気持ちです。現実には、もっと速いと思います。> 一つの問題を解くだけの時には確かに秒の速度は問題になりません。ところが例えば私のテーマはExcelの2次元的な表の一欄一欄を全部(1万欄?)計算し直して、さらに幾つかのX-Y図をプロットさせるというような仕事です。十指に余るパラメータ(の一つ)をいじるたびに下手をすると何分?か待たされます。パラメータの最適化などを試みる際にはこれを何十回と繰り返さなければなりません。収束計算だけが時間を食っているわけではおそらくないのですが、やはり収束計算の部分は精度や安定性を含めて気になります。 収束計算が遅い場合には近似計算の精度を上げる論文が出たりもします。どれほど問題意識がシリアスかで違ってくるのだろうと思います。

ryujin_aug
質問者

お礼

回答ありがとうございます。 数値計算のプログラムやソフトを使ってやるというよりも、 そのメカニズムについて学校で学んでいるだけなので、実際に多くの計算をやることはないのですが、やはりお仕事などで使うとなると差が出るのですね。参考になります。

全文を見る
すると、全ての回答が全文表示されます。
noname#221368
noname#221368
回答No.2

 #1さんの言うニュートン法の問題(?)から、私は二分法を多用しています(1次元に限る)。二分法の利点は、  (1)アリゴリズムが簡単  (2)精度コントロールが意のまま  (3)重解にも対応できる(関数値が0に近ければ、解とする)  (4)振動しない です。欠点は、  (1')解が一つの区間を選ぶ必要がある  (2')ニュートン法より遅い ですが、(1')は安全にニュートン法を実行するのであれば、ニュートン法でも必要と思います。(2')は現実的には問題にならない、というのが私の意見です。例えばニュートン法が二分法より100倍速いとします。 昔はPCが遅かったので、二分法で1時間かかる計算が、ニュートン法で0.6分=36秒で済むなら、意味がありました。現在は、0.1秒が0.001秒に短縮されたとしても、「煙草一本吸えやしない」という気持ちです。現実には、もっと速いと思います。

ryujin_aug
質問者

お礼

わかりやすい回答をありがとうございます。 (3)の重解にも対応できる、というところをもう少し説明していただけるでしょうか。分かり悪くてすみません;;よろしくお願いします。

全文を見る
すると、全ての回答が全文表示されます。
  • KappNets
  • ベストアンサー率27% (1557/5688)
回答No.1

私はしばしばこの手の計算で悩んだ経験があります。悩んだのは簡単なn次式と指数関数をたし合わせ、さらに全体のルートを取ったような関数です。xの途中で関数の傾きが大きく変化するのです。 ニュートン法の欠点は (1) 収束しないで振動することがある。 (2) 大体求まった後で最後の詰めのところでなかなか収束しない。 (3) 微分が面倒。 などでしょうか。どろくさい方法で逃げたりもしましたが、結局はうまくやればニュートン法は非常によい方法という結論でした。対策の主なものは (1) Excelのように出来るだけ有効数字の大きいソフトを用いる。Excelの場合有効数字は15桁ですね。 (2) 最初の出発(仮定)値をしっかり決める。場合によっては近似解をベースに最初の値を条件によって変える。 (3) 微分の解析式はMathematicaを使うと簡単に求まります。学校以外では高価なソフトですが。 (4) ルートを取るか取らないかでも計算時間・精度は変わる。f^0.5=0とf=0は等価ですから、ルートをとらないでも済むなら取らない。 (泥臭い方法:微分がどうしても面倒なときはとりあえず f'= (f(x+0.001)-f(x))/0.001 で計算する。0.001 のままでは精度が足りない時は適宜小さくする。) (もっと泥臭い方法:xとx+0.001でfを計算して、そこから次はどうするか比例計算で推定する。ただし決してxを大きく変化させない) ニュートン法ではどうもダメだという時は一時的に他の方法もよいかと思います。ただ論文の値打ちとしては計算速度も早い必要があり、私の場合ニュートン法で何とかn<10(?)で収束するよう出来るだけ粘りました。関数のクセに習熟すると何とかなるものです。

参考URL:
http://akita-nct.jp/yamamoto/lecture/2004/5E/test_2/summarize/html/node6.html
ryujin_aug
質問者

お礼

回答ありがとうございます。 ニュートン法はやはり速く収束するのですね。微分さえ手計算で早く出ればずいぶん楽なのですが・・・。 一つ加えて質問なのですが、複数解あるときには定点法、二分法、ニュートン法ともどの解に収束するか分からないと思うのですが、複数解を求める場合のコツ、あるいはどの方法がBestなどあるのでしょうか。 よろしくお願いします。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • ニュートンラフソン法について

    ニュートンラフソン法についての質問です。ニュートンラフソン法を利用するプログラム課題は理解できるのですが、別の問題の一つである次の問題をどう考えていけばよいのかわからないです。 「次の連立方程式f(x,y)=0、g(x,y)=0に対するニュートンラフソン法の反復公式を誘導せよ。」  参考書を調べますと一般のニュートンラフソン法はテーラー展開を用いて証明しているので、これも何らかの形でテーラー展開を利用するのではないかと思いますが、そこから先へ進めなくて困っています。よろしければどなたかコメントお願いいたします。

  • 多次元のニュートン・ラフソン法について

    質問させてもらいます。 二次元のニュートン・ラフソン法は理解したつもりなのですが。 f(x,y,z)=2x^2+y^2+z^2 の式が与えられた時、 この場合ニュートンラフソン法はどのように式として示し、証明にいたればいいのでしょうか? ニュートンラフソン法の考え方を踏襲するのであれば、 x成分、y成分、z成分の各成分について考えればいいのでしょうか? 多くの例題では二変数の連立方程式で…… とかかれてますが、 適用できない気がするのですが……?

  • ニュートン・ラプソン法?

    数値解析の授業で 平方根Aの近似式 r1=(A/r0+r0)/2.0 A=3,誤差0.0000001とする という数式を与えられました。 これをC言語でプログラムして実行結果を表示させて 理論をかかなきゃいけないのですが、 先生がちらっとこの式はニュートン・ラプソン法を応用したら出てくると言ったんです。 それで本を調べてみたのですがどういう風にしたらこの式が出てくるのかわかりません。 これはニュートン・ラプソン法をどのように応用したら出てくる式なのでしょうか?

  • ニュートン法に関して

    数値計算初心者です。数値計算で分からないことがあるので質問します。よろしくお願いします。 y=f(x,a)という関数があってパラメータaを非線形最小2乗法のニュートン法やマルカート法を使って求めたいのですが、計算過程でf(x)を各パラメータで偏微分してヤコビ行列を求める必要があると思われます。 例えばf(x)が複雑な関数で偏微分するのに困難な関数であった場合、 偏微分をしなくてΔxを決定するにはどのような方法があるのでしょうか?

  • ニュートン法について

    ニュートン法について 3次方程式x^3-30x^2+200x=0は0,10,20を根とする。 このことを使って、ニュートン法を1回用いることにより、x^3-30x^2+200x+1=0の根で10に近いものの近似値を求めよ。 ちなみにニュートン法は「aがf(a)=0の根に十分近ければ、a-f(a)/f’(a)は更に精密な近似値となる」です。 数学に詳しい方に答えていただけると幸いです。 宜しくお願いいたします。

  • ニュートン法

    ニュートン法の問題です。 全平面で正則な複素関数f(z)=u(x,y)+i*v(x,y)(z=x+iy) の零点を求めるニュートン法は z(k+1)=z(k)-f(z(k))/f'(z(k)) ですが、 これは2元連立方程式 u(x,y)=0 v(x,y)=0 を解くニュートン法と等価であることを示せ という問題です。 とっかかりからわからないのですが、複素関数の微分の表現の仕方がわからないのと、u(x,y)=0のように2変数でしかも、抽象的に書かれるとニュートン法がわかりにくくなっているという点で困っています。 分かる方、解説よろしくお願いします。

  • ニュートンラフソン法のプログラミングの問題……

    今年、工学基礎という新しくできた講義の中でC言語でのプログラミングを学ぶ事になったんですが… 普通高校出身の自分は専門の勉強についていけず落ちこぼれてます。 自学自習を重ねていますが毎回出される課題にギリギリついていける状態でした。 が、ついにきてしまいましたね………。 『それでは、今回の課題は……、実根をニュートンラフソン法で求めるプログラミングを作ってきてください。』 今までは、テキストに参考になるヒントが載っていたのですが、今回は天から見放された感が(涙) しかも明後日の朝一での課題提出。 自分でも必死に参考書かき集めて探してますが、全く参考書になる資料がなく困ってます。 そこでお手数ですがプログラミングを教えてくれませんか? あと、参考になるテキストとかも教えてもらえれば幸いです。 誠に勝手ながらお願いしますm(_ _)m       次のf(x)=0の実根をニュートン・ラフソン法で求めるCプログラムを作成せよ。 f(x)=x^3-x-6 初期値や収束判定に必要な定数などは#defineを使ってプログラム中で設定し、それらの値を答と共にわかりやすく出力すること。 したがって、プログラム中に入力用関数scanfなどを含めないこと。 なおf'(x)の値はf(x)を手で微分した導関数にxを代入して関数値として求める。 すなわち、当レポートでは数値微分を使う必要はない。

  • ごく限られた条件においてニュートン法で収束しません

    未知数が3つの非線形連立方程式をニュートン・ラフソン法で解いています。しかし、ごく限られた条件において、添付図の赤プロットように誤差が減っては増えるを繰り返し、収束しきい値に及びません。すぐ隣の条件では青プロットのように問題なく収束します。 本問題の解決策として、識者の方より、非線形方程式が不連続にならないように弱いばねを与えることを教わり、それによって収束しない範囲は激減しましたが、それでもごく一部残っている状況です。 なお、連立3元1次方程式の解法は掃き出し法で行っています(ピボット操作しています)。 解決策をご存じの方、また同様なご経験をお持ちの方がおられましたら、お知恵をお借りしたく、よろしくお願いいたします。

  • 差分法とオイラー法の違いについて

    最近微分方程式の数値解析について学びだした者です。 微分方程式の数値解法として差分法とオイラー法があると思うのですが、この2つの違いや互いの位置づけはどうなっているのでしょうか? また、差分法には風上法などがありますが、これらとオイラー法の位置づけについても教えていただきたいです。 できればこれら近辺の全体的な体系について教えていただけるとうれしいです。よろしくお願いします。

  • ニュートン法で解が収束しない

    こんにちは。 差分式で表した非線形方程式をニュートン法で解いています。が収束しな解あります。ニュートン法は初期値に依存しているため、初期値を可変的にしてみましたがダメでした。何かいい方法はないでしょうか? 参考になるか分かりませんが、使っているプログラムのニュートン法の計算の一部は以下のようです。 call g(x,f,df) h=f/df x=x-h if(dabs(h/x)<1.d-14) then  return endif