6. 代数方程式

代数方程式のXLPackによる解き方の例を示します.

例題

次の方程式を解く.

  
  x5 + 2x3 + 2x2 - 15x + 10 = 0

 
これは, 因数分解できて,

  
  (x - 1)2(x + 2)(x2 + 5) = 0

 
となるので, 解は 1(重根), -2, ±√5i となります.

以下, ワークシート関数WRpzero2とVBAサブルーチンRpzero2を使った2種類の解き方を説明します.

ワークシート関数を使用した解き方

ワークシートの適当な場所に代数方程式の係数aiを入力します. 次に, WRpzero2関数を使用して解(図のx(r), x(i)およびs(i))を入れるためのセルを(n + 1) x 3セル選択します. 数式バーのfxをクリックしてWRpzero2を選択します.

必要なパラメータ(ここでは, N, A())の入力を要求されるので, それぞれに適切な値を入力します. Nは次数(この例では5), A()は係数が入っているセル範囲です.

入力が終了したらCtrl+Shift+Enterを押します.

これで, 5つの解が正しく求められました. なお, 一番右の列(s(i))は誤差限界を表します.

重根(1)については精度が半分程度に落ちているのがわかります. 代数方程式の計算においては, m重根を求める場合には解の有効桁数がおおよそ1/mになるとされているので注意が必要です.

VBAプログラムを使用した解き方

上と同じ例題をVBAプログラムにより解いてみます. VBAサブルーチンRpzero2を使ったプログラム例を示します.

Sub Start()
    Const NMax = 10
    Dim N As Long
    Dim A(NMax) As Double, XR(NMax) As Double, XI(NMax) As Double, S(NMax) As Double
    Dim IFlag As Long, Info As Long, Iter As Long, I As Long
    '--- Input data
    N = 5
    For I = 0 To N
        A(I) = Cells(4 + I, 1)
    Next
    '--- Compute roots of equation
    IFlag = 0
    Call Rpzero2(N, A(), XR(), XI(), IFlag, S(), Info, Iter)
    Cells(9, 2) = Info
    Cells(9, 3) = Iter
    '--- Output roots
    For I = 0 To N - 1
        Cells(4 + I, 2) = XR(I)
        Cells(4 + I, 3) = XI(I)
        Cells(4 + I, 4) = S(I)
    Next
End Sub

所定の位置にデータを入力し, マクロStartを実行すると次のように上と同じ結果が得られます.