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 プログラムを実行してやる必要があります.