[PR]当サイトはアフィリエイト広告を利用しています。
はじめに
前回は三次方程式をニュートン法で近似的にとりあえず解きました。
しかしニュートン法では導関数が求まらないと計算が進みません。
導関数を求めずに、元の方程式の左辺だけで方程式を解くことはできないかというと、割線法という方法を用いれば求めることができます。
今回は割線法で前回の三次方程式を解いてみようという回です。
割線法
漸化式
\[
x_{k+2} = x_{k+1} – \frac{f(x_{k+1})(x_{k+1}-x_{k})}{f(x_{k+1})-f(x_{k})}
\]
によって生成される数列がある値αに収束すれば、αは方程式\(f(x)=0\)の解である。
参考:栗原 正仁,『[第2版]わかりやすい数値計算入門』,ムイスリ出版株式会社, 2011.
注意としては初期点が二つ必要というところです。
今回の例題
ある立方体を底面の縦を2cm、横を3cm伸ばし、高さを1cm縮めた直方体を作ったら、体積が4/3倍になった。
もとの立方体の一辺の長さを求めよ。
途中までの式
次の方程式が成り立つ。
\[
4/3x^{3}=(x+2)(x+3)(x-1)
\]
これを展開して整理すると
\[
-1/3x^{3}+4x^{2}+x-6=0
\]
今回は割線法で解きます。
エクセル関数で求める場合
\[
f(x)= -1/3x^{3}+4x^{2}+x-6
\]
とします。
次のように入力します。
B3:100
B4:99
C3: =-1/3*B3^3+4*B3*B3+B3-6
C4: =-1/3*B4^3+4*B4*B4+B4-6
B5: =B4-(C4*(B4-B3))/(C4-C3)
C5: =-1/3*B5^3+4*B5*B5+B5-6
オートフィルでB5とC5を一つ下に引っ張ります。
xの値が変化しなくなっていたら、それが解です。
画像のもっと下まで引っ張れば今回も
x=12.12499
が求まりました。
VBAで求める場合
次のコードを入力します。
Sub secant()
Dim x1 As Double
Dim x2 As Double
Dim temp As Double
Dim i As Integer
x2 = 100
x1 = 99
For i = 1 To 1000
temp = x1
x1 = x2
x2 = x1 - (f(x1) * (x1 - temp)) / (f(x1) - f(temp))
If (Abs(x2 - x1) < 0.0001) Then
MsgBox (i)
Exit For
End If
Next i
Range("E3").Value = x2
End Sub
Function f(x As Double)
f = (-1 / 3) * (x ^ 3) + 4 * (x ^ 2) + x - 6
End Function
ここで
temp = x1
x1 = x2
x2 = x1 - (f(x1) * (x1 - temp)) / (f(x1) - f(temp))
の部分は
割線法の漸化式を計算しています。
tempにx1を入れてからx1にx2を入れないと、つまりx1にx2を入れてからtempにx1を入れると、どちらもx2になってしまうので順番に気をつけましょう。
また
Function f(x As Double)
f = (-1 / 3) * (x ^ 3) + 4 * (x ^ 2) + x - 6
End Function
この部分は関数を何度も呼び出すのでユーザー定義関数で省力化しています。
関数の書き方は「VBAで関数を使ってみる」もご覧ください。
Exit Forの使い方は前回の「三次方程式を悩まずにとりあえず解く方法」もご覧ください。
計算結果は
i=14
x= 12.12499
エクセル関数で求めたときと同じになりました。
まとめ
今回は割線法で三次方程式の解を求めました。
複雑な方程式では導関数を手計算で求めるのが困難なときもあります。
そんなときの解決策の一つとして割線法の解説をしてみました。