2

係数行列が三重対角 (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 は循環参照を持つセルを初期化しようとし、混乱すると思います。誰でもこの問題を解決できますか?

4

1 に答える 1

1

と交換=3+E2^2すると=IFERROR(3+E2^2,0)うまくいきます。

于 2013-04-14T21:23:17.357 に答える