本日も、りけいのりからお届けします。
今回も,
解けない方程式を解く!
をテーマにしていきます.
まず,ニュートン法の復習です!
その方程式を以下のように変形します.
未知数をとした,方程式を以下のように変形します.
次に初期値を定め,以下の式で繰り返していきます.
以上です.
ここで,このニュートン法には繰り返しの処理が必ず必要です.場合によっては50回,100回繰り返す必要が出てきます.このため,コンピュータを使っていきます!
今回は,ニュートン法での方程式の解法を,C言語でコンピュータでの計算を詳しく行っていきます.
C言語のプログラムの実行などのついては,過去記事を参照してください!
問題設定
それでは,さっそくやっていきましょう.
\\\
\\
皆さん,以下の式を解いてみましょう!
中学校一年生の一次方程式の問題ですね.答えは次のようになりますね.
これは,線形方程式(linear equation)に分類されます.これに対して,非線形方程式(nonlinear equation)もあります.この,線形と非線形の言葉については別の機会に説明しますが,簡単に紹介すると,厳密には違いますが,なんとなく線形は「直線的」というイメージでいいと思います.話を戻します.非線形方程式の例は以下の通りです.
もちろん,非線形方程式のすべてが解くことができないわけではありません.解くことができる方程式もたくさんあります.しかし,これから,紹介する方法を使えば,だいたいの方程式を解くーその方程式を満たす未知数の値を導くーことができます.もちろん,場合によっては解けない場合がありますが,普通は解けます.
ニュートン法
それでは,解けない方程式を解いていく手順を紹介します.まず,今回はニュートン法の手順を説明しますが,ほかにも,反復法と呼ばれる手順もあります.
まず,未知数を[tex:\displaystyle{ x }]として,その方程式の項を左辺にまとめ,右辺をゼロにしたものを
と表現します.この方程式を満たす,[tex:\displaystyle{ x }]を近似的に求めていきます.
ここで,このニュートン法の理解のコツとして,図を用いて説明していきます.この[tex:\displaystyle{ f(x) }]を関数として,
と考えると,求める解は以下の図の[tex:\displaystyle{ y = f(x) = 0}]を満たす点,つまり,軸との交点ということがわかります.
では,具体的な手順を見ていきます.
ソースコード
- 初期値[tex:\displaystyle{ x^{(0)} }]の点で垂線を引きます.この[tex:\displaystyle{ x^{(k)} }]は,微分や累乗を表しているのでなく,k回目の計算で求めた解という意味で,第k次近似解とか言われます.この初期値[tex:\displaystyle{ x^{(0)} }]は,適当に決めます.大体の場合は,どんな値にしても最終的にはうまくいきます.
- 曲線[tex:\displaystyle{ f(x) }]との交点をAとします.
- A点での接線の方程式を立てます.
[tex:\displaystyle{ y - f(x^{(0)} )= f'(x^{(0)}) ( x - x^{(0)}) }]
より
[tex:\displaystyle{ y = f'(x^{(0)}) ( x - x^{(0)}) + f(x^{(0)} ) }] - その接線と水平軸との交点をBとし,座標値[tex:\displaystyle{ x^{(1)} }]とおきます
上の接線の式より次のように求まります.
[tex:\displaystyle{ 0 = f'(x^{(0)}) ( x - x^{(0)}) + f(x^{(0)} ) }]
線の方程式を立てます.[tex:\displaystyle{ x^{(1)} = x^{(0)} - \frac{f(x^{(0)})}{f'(x^{(0)})} }] - この操作を繰り返す.
一般に,[tex:\displaystyle{ x^{(k+1)} }]は次のように表せます.[tex:\displaystyle{ x^{(k+1)} = x^{(k)} - \frac{f(x^{(k)})}{f'(x^{(k)})} }] - 操作を繰り返すにつれて,[tex:\displaystyle{ x^{(k+1)} }]は限りなく[tex:\displaystyle{ f(x) = 0}]の解に近づいていきます.
以上です!こんな手順です!
計算例
手順はわかったけど,まだなんかしっくりこないなあ,,,って人が多いと思います.
それは当然で,実際にこれを利用した具体例がないとイメージがわかないと思います.
今回は,次の具体例を,計算してみましょう.
[tex:\displaystyle{ x^{2} = 3 }]をニュートン法で解け.
この問題は,別に数値解析でなくても解けますね.この解は,
ですね!だいたい,1.7320508・・・(ひとなみにおごれや)ですね.
では,これを,ニュートン法を用いて解いたとき,どうなるか見ていきましょう.
まず,次のように変形します.
この時,以下のように計算できます.
これらを用いて,以下のようにニュートン法の計算を行います.
となります.ちなみにですが,私の場合以下のように変形します.計算ミスを減らすためです.累乗の計算をしなくて済みます.
では,さっそく計算してみましょう.ここでは,初期値を[tex:\displaystyle{ x^{(0)} = 2.0 }]とします.
\begin{eqnarray} x^{(1)} &=& \frac{ 1 }{ 2 } ( x^{(0)} + \frac{ 3 }{ x^{(0)} } ) \\ &=& \frac{ 1 }{ 2 } ( 2 + \frac{ 3 }{ 2 } ) \\ &=& 1.75 \end{eqnarray}
次も行きます!
\begin{eqnarray} x^{(2)} &=& \frac{ 1 }{ 2 } ( x^{(1)} + \frac{ 3 }{ x^{(1)} } ) \\ &=& \frac{ 1 }{ 2 } ( 1.75 + \frac{ 3 }{ 1.75 } ) \\ &=& 1.732142857 \end{eqnarray}
\begin{eqnarray} x^{(3)} &=& \frac{ 1 }{ 2 } ( x^{(2)} + \frac{ 3 }{ x^{(2)} } ) \\ &=& \frac{ 1 }{ 2 } ( 1.732142857 + \frac{ 3 }{ 1.732142857 } ) \\ &=& 1.73205081\end{eqnarray}
以上です!だいぶ,[tex:\displaystyle{ \sqrt{3} }]に近い値が計算で求まってきましたね!これをずっと繰り返すと,さらに精度が高まってきます!
ですが,ここで,気づいてほしい問題が2つあります.
1つ目は,もう一つの解の[tex:\displaystyle{ - \sqrt{3} }]の結果が得られなかったこと.ちなみに今回も含め,大体の場合,初期値の与え方で,ほかの解も得られます.
2つ目は,初期値を[tex:\displaystyle{ x^{(0)} = 0.0 }]とすると,分母がゼロとなり,計算ができないこと.
今回はそこまで詳しい考察はしませんが,ニュートン法を利用される際は,正解が複数個あるときの初期値の与え方や,初期値の与え方による計算の変化,について検討が必要です.
おわりに
いかがでしたか?
もし,どうしても解けない方程式があなたの目の前に現れても,あっても今日の方法を使えば,何とか太刀打ちできます.
しかし,このニュートン法には繰り返しの処理が必ず必要です.今回の計算例では,すぐに大体の値に答えが収束しましたが,場合によっては50回,100回繰り返す必要が出てきます.このため,コンピュータを使っていきます!
次回は,ニュートン法での方程式の解法を,本格的にC言語でコンピュータでの計算を詳しく行っていきましょう!
本日も、りけいのりがお届けしました。
参考文献
1)高橋麻奈『やさしいC 第4版』 風工舎
2)安田仁彦 『数値解析基礎』 コロナ社