エクセル

三次方程式を悩まずにとりあえず解く方法

エクセル

[PR]当サイトはアフィリエイト広告を利用しています。

そろそろパソコンを新調したいというときはマウスコンピューターのセールもチェックすると掘り出し物が見つかるかも。

PCスペックに不安があるときは、こちらの記事を参考にするとよいかもしれません。

2023年最新!【マウスコンピューター】プログラマーの国家資格を持つ筆者が選ぶプログラミング用ノートパソコン

はじめに

今回は三次方程式をニュートン法で近似的にとりあえず解くという回です。

三次方程式の解の公式は非常にややこしく、うまくいく解を一つ見つけないと手計算で解けません。

そこで今回はニュートン法という方法を用いて、三次方程式の解を一つ求めてみようという話をします。

複数の解を求める場合は、ニュートン法の初期値を色々変えれば求めることができるかもしれませんが、今回はとりあえず一つの解を求めるということをやります。

ITの領域では「数値計算」の部類に入る話です。

ニュートン法

漸化式

\[
x_{k+1} = x_{k} – f(x_{k})/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
\]

とすると

\[
f’(x) = -x^{2}+8x+1
\]

次のように入力します。

B3:100

C3: =-1/3*B3^3+4*B3*B3+B3-6

D3: =-B3*B3+8*B3+1

B4: =B3-C3/D3

オートフィルでC3とD3を一つ下に引っ張ると、C4、D4に値が入ります。

そこまでできたら、B4からD4まで選択して、適当な長さまでオートフィルで引っ張ります。

xの値が変化しなくなっていたら、それが解です。

今回は

x=12.12499

が求まりました。

検算してみると、最初に立てた方程式の

左辺=\(4/3x^{3}=2376.744793\)

右辺=\((x+2)(x+3)(x-1)=2376.744793\)

となって方程式が満たされているのが確認できます。

またこのx近辺で

シートのC列が0に近づいているのが確認できます。

つまりf(x)=0が成立しているということになるので、三次方程式の解が一つ求まったと言えます。

VBAで求める場合

次のコードを入力します。

Sub newton()
    Dim x As Double
    Dim xt As Double
    Dim f As Double
    Dim fd As Double
    Dim i As Integer
    x = 100
    For i = 1 To 1000
        xt = x
        f = -(1 / 3) * (x ^ 3) + 4 * (x ^ 2) + x - 6
        fd = -x ^ 2 + 8 * x + 1
        x = xt - f / fd
        If Abs(xt - x) < 0.0001 Then
            MsgBox (i)
            Exit For
        End If
    Next i
    Range("F3").Value = x
End Sub

ここで

        xt = x
        f = -(1 / 3) * (x ^ 3) + 4 * (x ^ 2) + x - 6
        fd = -x ^ 2 + 8 * x + 1
        x = xt - f / fd

の部分は

ニュートン法の漸化式を計算しています。

また

        If Abs(xt - x) < 0.0001 Then
            MsgBox (i)
            Exit For
        End If

この部分の条件式は

Abs(xt – x) < 0.0001

で漸化式の前後の値の差が十分小さくなれば(Absは絶対値を計算する関数)、その時の繰り返し回数iを表示して、For文を抜けます(Exit For)。

Exit Forは何回で答えが出るかわからないときに計算回数を削減できるので便利です。

計算結果は i=11

x= 12.12499

エクセル関数で求めたときと同じになりました。

まとめ

今回はニュートン法で三次方程式の解を求めました。

方程式を立てると、手計算では求解が困難な式が立ってしまうことがあります。

そういうときに数値計算の手法を取り入れると解が求まる可能性があります。

知っておくといいかもしれませんね。

変数が複数あれば数理最適化、微分方程式なら数値計算とかの領域につながっていきますが、とりあえずニュートン法一つだけでも、普通はなかなかできないこと(三次方程式の求解)ができるわけで、便利だと思います。

※「そろそろ新しいパソコンほしいなぁ」と思ったらマウスコンピューターのセールを見てみるといいかも。