2013-04-14 24 views
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會嘗試初始化具有循環引用的單元格,並且會感到困惑。有沒有人有解決這個問題?

回答

1

替換=3+E2^2=IFERROR(3+E2^2,0)適合我。

+0

感謝您的回覆。它在這種情況下處理這個問題。是否有更通用的方法在TRIDI中的父表單中執行相同的功能(或添加另一個函數),從而避免將IFERROR添加到包含A,B,C和R值的所有單元格的必要性? – bumedoc

+0

添加一個錯誤處理程序強制UDF在發生錯誤時拋出0。看來,寫UDF可能會很棘手..我在這裏找到了一些信息:http://www.decisionmodels.com/calcsecretsj.htm – Ioannis

+0

我試過這個,沒有成功對於i = 1到N A(i)= Ac。 Parent.Cells(Ac.Row + i - 1,Ac.Column) If(IsError(A(i)))Then A(i)= 1 – bumedoc