係数行列が三重対角 (Thomas アルゴリズムとして知られている) である一連の代数方程式を解く VBA コードを作成しました。方程式の形式は次のとおりです。
A(i)X(i-1)+B(i)X(i)+C(i)X(i+1)=R(i)
A、B、C、および R の値は、X の値を返す関数に渡されます。VBA コードは次のとおりです。
Option Base 1
Function TRIDI(ByVal Ac As Range, ByVal Bc As Range, ByVal Cc As Range, _
ByVal Rc As Range) As Variant
Dim BN As Single
Dim i As Integer
Dim II As Integer
Dim A() As Single, B() As Single, C() As Single, R() As Single, X() As Single
N = Ac.Rows.Count
ReDim A(N), B(N), C(N), R(N), X(N)
For i = 1 To N
A(i) = Ac.Parent.Cells(Ac.Row + i - 1, Ac.Column)
B(i) = Bc.Parent.Cells(Bc.Row + i - 1, Bc.Column)
C(i) = Cc.Parent.Cells(Cc.Row + i - 1, Cc.Column)
R(i) = Rc.Parent.Cells(Rc.Row + i - 1, Rc.Column)
Next i
A(N) = A(N) / B(N)
R(N) = R(N) / B(N)
For i = 2 To N
II = -i + N + 2
BN = 1 / (B(II - 1) - A(II) * C(II - 1))
A(II - 1) = A(II - 1) * BN
R(II - 1) = (R(II - 1) - C(II - 1) * R(II)) * BN
Next i
X(1) = R(1)
For i = 2 To N
X(i) = R(i) - A(i) * X(i - 1)
Next i
TRIDI = Application.WorksheetFunction.Transpose(X)
End Function
この関数は、線形方程式に対して適切に機能します。方程式が非線形の場合、たとえば以下の 3 つの方程式の場合
X(1)=1
X(1)-2X(2)+X(3)=3+ X(1)^2
X(1)+X(3)=2
ソリューションは、以下に示すように、Excel の反復機能を使用して反復的に取得されます。(これが私の最初の投稿なので、まだ画像を投稿できません。bumedoc@gmail.com までメールをいただければ、スプレッドシートもお送りできます)
A B C D E
1 A B C R X
2 0 1 0 =1 =TRIDI(A2:A4,B2:B4,C2:C4,D2:D4)
3 1 -2 1 =3+E2^2 =TRIDI(A2:A4,B2:B4,C2:C4,D2:D4)
4 1 1 0 =2 =TRIDI(A2:A4,B2:B4,C2:C4,D2:D4)
ただし、スプレッドシートを保存して再度開くと、#value が表示されます。E2:E4 および D3 のエラー。スプレッドシートを開くと、Excel は循環参照を持つセルを初期化しようとし、混乱すると思います。誰でもこの問題を解決できますか?