6. 代数方程式

注 – 例題ワークシートをダウンロードすることができます. 1. 例題ワークシートの入手と使用方法 をご覧ください.


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

例題

次の方程式を解く.

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

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

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

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

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

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

ワークシートの適当な場所に代数方程式の係数 ai を入力します(オレンジ色のセル). 次に, 解(x(r), x(i)) および 誤差限界 s(i)) を入れるためのセルを (n + 1) x 3 セル選択してワークシート関数 WRpzero2 を入力します(緑色のセル).

WRpzero2 の必要なパラメータは N および A です. N は方程式の次数(この例では 5), A は方程式の係数のセル範囲です. ここで, 方程式を a0 xn + a1 xn-1 + … + an-1 x + an = 0 とすると, 係数は実数 a0, a1, …, an で表されます.

入力が終了したら 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(5 + I, 1)
    Next
    '--- Compute roots of equation
    IFlag = 0
    Call Rpzero2(N, A(), XR(), XI(), IFlag, S(), Info, Iter)
    Cells(10, 2) = Info
    Cells(10, 3) = Iter
    '--- Output roots
    For I = 0 To N - 1
        Cells(5 + I, 2) = XR(I)
        Cells(5 + I, 3) = XI(I)
        Cells(5 + I, 4) = S(I)
    Next
End Sub

所定の位置(下のオレンジ色のセル)に係数データを入力し, マクロ Start を実行すると次の結果が得られます. ワークシート関数を使用したときと異なり, 係数データを入力しただけでは結果が得られず, VBA プログラムを実行してやる必要があります.