2
我寫了一個VBA代碼,它解決了一系列代數方程,其係數矩陣是Tridiagonal(稱爲Thomas算法)。方程具有如下形式初始化電子表格,計算順序
A(ⅰ)X(I-1)+ B(ⅰ)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
該函數適用於線性方程式。如果方程是非線性的,例如用於下面的三個方程
X(1)= 1
X(1)-2X(2)+ X(3)= 3 + X(1)^ 2
X(1)+ X(3)= 2
獲得迭代地使用Excel的迭代功能的溶液,如下所示。 (我還不能發表圖片,因爲這是我的第一篇文章。如果你給我發電子郵件,[email protected],我也可以給你的電子表格)
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)
然而,保存電子表格,開盤後它再次,我得到#值! E2中的錯誤:E4和D3。我假設在打開電子表格時,Excel會嘗試初始化具有循環引用的單元格,並且會感到困惑。有沒有人有解決這個問題?
感謝您的回覆。它在這種情況下處理這個問題。是否有更通用的方法在TRIDI中的父表單中執行相同的功能(或添加另一個函數),從而避免將IFERROR添加到包含A,B,C和R值的所有單元格的必要性? – bumedoc
添加一個錯誤處理程序強制UDF在發生錯誤時拋出0。看來,寫UDF可能會很棘手..我在這裏找到了一些信息:http://www.decisionmodels.com/calcsecretsj.htm – Ioannis
我試過這個,沒有成功對於i = 1到N A(i)= Ac。 Parent.Cells(Ac.Row + i - 1,Ac.Column) If(IsError(A(i)))Then A(i)= 1 – bumedoc