\documentclass[12pt]{jarticle} \usepackage{graphicx} \textwidth=16cm \oddsidemargin=0cm \newcommand \Br [1] {\left( #1 \right)} \renewcommand \[ {\begin{eqnarray}} \renewcommand \] {\end{eqnarray}} \begin{document} \title{工学基礎実験実習 レポート文書作成技術1 \\ | ニュートン法に関する実験 |} \date{\today} \author{右田剛史} \maketitle \section{はじめに} 方程式の求解は,科学技術計算において頻繁に現れる.解の公式が存在する方 程式では,有限回の四則演算と初等関数によって解を計算できるが,一般の方 程式の解を解析的に表す公式は存在しない.このような場合は,解の近似値を 計算する{\em 数値解法}が有用である. ニュートン法\cite{numeric,mathwld}は代表的な数値解法である.多くの場 合,ニュートン法は2次の収束を示すため,効率良く解を得ることができる.た だし,ニュートン法は初期値として解の粗い近似値を与える必要があり,初期 値が適切でない場合,収束までに多くの反復を要したり,収束しない場合もあ る.また,計算しようとしている解が重解である場合は,収束が遅くな る.ニュートン法の使用に際しては,このような欠点に留意する必要がある. 以下では, ニュートン法の挙動を理論的に解析し,$f(x)=(x-1)(x+1)^2=0$を 対象として,ニュートン法の性質を調べる実験を行う. \section{ニュートン法の原理} \label{sec:bas} 方程式$f(x)=0$の{\em 解}とは,関数$f(x^*)=0$を満たす$x^*$のことを言う. 図\ref{fig:fig1}では,曲線$y=f(x)$と$x$軸が交わっており,この交点の$x$座標が$x^*$である. いま,解$x^*$の近似値$x_k$が与えられているとする. 点$(x_k,f(x_k))$における曲線$y=f(x)$の接線(図中の斜めの線) の方程式は$y=f(x_k)+(x-x_k)\cdot f'(x_k)$である.ここで,$f'(x)$は$f(x)$の導関数である. この接線と$x$軸の交点($x_{k+1}$)は次の式で表される\cite{clo05,mathwld}. \[ x_{k+1}=x_k-\frac{f(x_k)}{f'(x_k)} \label{eq:newton-iter} \] 図\ref{fig:fig1}の場合,$x_{k+1}$が$x_k$よりも解$x^*$に近い.このため, 適当な初期値$x_0$を与え,式(\ref{eq:newton-iter})によって数列$(x_k)$を 定義すると,この数列は$k\rightarrow\infty$で$x^*$に{\em 収束}することが 期待される. \begin{figure}[t] \begin{minipage}{7.95cm} \center \includegraphics[scale=.6]{newton-abst.eps} \caption{ニュートン法の幾何学的解釈} \label{fig:fig1} \end{minipage} \begin{minipage}{7.95cm} \center \small \begin{verbatim} $ bc -l x=1.1 x=x-(x-1)*(x+1)*(x+1)/(3*x*x+2*x-1);x 1.00869565217391304348 x=x-(x-1)*(x+1)*(x+1)/(3*x*x+2*x-1);x 1.00007464079119238665 x=x-(x-1)*(x+1)*(x+1)/(3*x*x+2*x-1);x 1.00000000557062401616 x=x-(x-1)*(x+1)*(x+1)/(3*x*x+2*x-1);x 1.00000000000000003104 x=x-(x-1)*(x+1)*(x+1)/(3*x*x+2*x-1);x 1.00000000000000000001 \end{verbatim} \caption{実験結果1} \label{fig:fig2} \end{minipage} \end{figure} 収束性の議論を厳密にするために,極限値$x^*$との誤差$r_k$を次のように定 義する. \[ \label{eq:deferr} r_k := x_k - x^* \] 式(\ref{eq:newton-iter})の関数$f(x)$を$x^*$の近傍でテイラー展開して,整 理すると次式が得られる\cite{numeric}. \[ \nonumber r_{k+1} &=& r_k - \left. \frac{r_k f'+ r_k^2 f''/2 + \cdots}{f'+ r_k f'' + \cdots} \right|_{x=x^*} \label{eq:quadra} \\ &=& \left. \Br{r_k^2/2} \Br{f''/f'} \right|_{x=x^*} + O(r_k^3) \] ただし,$f'(x_k)\ne0$と仮定した.上の式は$r_{k+1}$が$r_k^2$に比例するこ とを示している.これを2次収束という.これは,$r_k$が十分に小さければ, 式(\ref{eq:newton-iter})の適用によって,正しい桁数がほぼ2倍になることを 示している.逆に,$r_k$が大きいときや$f'(x_k)$が0に近いときには発散する 場合がある.また,$f'(x_k)=0$のときは$x_{k+1}$が計算できない. なお,重解の場合($f'(x^*)=0$の場合)は 1 次収束である. また,解付近で2次導関数が 0 になる場合には 3次の収束を示す. \section{実験} \label{sec:exp} ここでは,次の方程式(図\ref{fig:func})にニュートン法を適用して,挙動を 調べる. \[ f(x)=(x-1)(x+1)^2 \] 解は,$1,-1,-1$である. 導関数は$3x^2+2x-1$であるから,ニュートン法の反復式は次のようになる. \[ \label{eq:iter} x_{k+1}=x_k-(x_k-1)(x_k+1)^2/(3x_k^2+2x_k-1) \] \begin{figure}[t] \begin{minipage}{7.95cm} \center \includegraphics[scale=.44]{cubic.eps} \caption{$(x-1)(x+1)^2$のグラフ} \label{fig:func} \end{minipage} \begin{minipage}{7.95cm} \center \includegraphics[scale=.44]{ntn.eps} \caption{反復回数と誤差の関係} \label{fig:fig4} \end{minipage} \end{figure} 初期値を1.1とし,\verb+bc+コマンドを用いてニュートン法の反復を行った結 果を図\ref{fig:fig2}に示す.5回の反復で約20桁まで正しく得られていること がわかる.初期値が10の場合には11回の反復を要した. 初期値を$-2$とすると重解の$-1$に近づく.しかし,10反復後の$x_{10}$が $-1.0014\cdots$であり,2桁程度しか正しくない.20桁程度の精度に達するに は数十解の反復を要すると考えられる.しかし,実際には30数回目以降は桁落 ちのため正しく計算されなかった. 表\ref{tab:表1}に,様々な初期値からニュートン法の反復を10回行った後の値 を示す.$f'(x)=0$となるのは$x=-1,1/3$であるため.$x_k$が$-1$または $1/3$となってはならない.概ね,初期値が$1/3$を越える場合は1に収束すると 考えられる.また,この場合は2次収束なので,10回以内の反復で収束してい る.一方,初期値が$1/3$より小さい場合には,重解$-1$に向かうが,1次収束 であるため10回の反復では2桁程度の精度しか得られない.初期値が0の場合は 次に$x_1=-1$となり,それ以上計算できないため N/A (not available) と表示 している. 図\ref{fig:fig4}に,様々な初期値に対する誤差$r_k$の絶対値の推移を対数目 盛で示す.各折れ線付近の数字は初期値を表す. bcの性質上,最後の値は常に $10^{-20}$の誤差を含むため,折れ線の一番右側が正しくない形に曲がってい るが,初期値が0.4以上の場合(解1に2次収束する場合)は,ほぼ同じ形状で急速 に誤差が減少していることがわかる.一方,初期値が0.2の場合(解$-1$に1次収 束する場合)は,直線を描いており,この直線が$10^{-20}$に達するには非常に 時間が掛かることが容易に予想できる. 上記の初期値では誤差は単調に減少しているが,一般には誤差が増加すること もあり得る. $x_k$が$1/3$付近または$-1$付近の値を値をとる場合に は,$f'(x_k)$が0に近いため$x_{k+1}$が非常に大きな値となり,誤差が増大す る.このため,ニュートン法の初期値は$x_k$がこのような際どい領域を通過し ないように選ぶ必要がある. \begin{table} \caption{様々な初期値からのニュートン法の反復結果} \label{tab:表1} \center \begin{tabular}{c|c} \hline 初期値 & 10回の反復後の値 \\ \hline $-0.2$ & $-0.99964988198316793008$ \\ 0 & N/A \\ 0.2 & $-1.00357177068625731955$ \\ 0.4 & 1.00000000000000000001 \\ 0.6 & 1.00000000000000000001 \\ 0.8 & 1.00000000000000000001 \\ \hline \end{tabular} \end{table} \section{まとめ} ここでは,簡単な方程式にニュートン法を適用し,解と極限値の関係を調べ た.また,挙動の理論的解析を行った. 実際の応用では,解のわからない難しい方程式を解く必要がある.このような 問題については,今後の更なる検討を要する. \thebibliography{99} \bibitem{numeric} 著者1, 著者2,数値計算の基礎,某出版社,2005. \bibitem{clo05} Cox D.A., Little J. and O'Shea D., {\em Using Algebraic Geometry}, Springer, 2005. \bibitem{mathwld} \verb|http://mathworld.wolfram.com/NewtonsMethod.html| \end{document}