我正在尋找一種解決方案來在Excel中查找立方根。我在這個網站找到了下面的代碼。使用vba的立方根
http://www.mrexcel.com/forum/excel-questions/88804-solving-equations-excel.html
不幸的是,它並沒有爲我工作 - 我得到#VALUE!當我運行它並由於我只學習VBA時,我沒有運氣調試它。
Sub QUBIC(P As Double, Q As Double, R As Double, ROOT() As Double)
' Q U B I C - Solves a cubic equation of the form:
' y^3 + Py^2 + Qy + R = 0 for real roots.
' Inputs:
' P,Q,R Coefficients of polynomial.
' Outputs:
' ROOT 3-vector containing only real roots.
' NROOTS The number of roots found. The real roots
' found will be in the first elements of ROOT.
' Method: Closed form employing trigonometric and Cardan
' methods as appropriate.
' Note: To translate and equation of the form:
' O'y^3 + P'y^2 + Q'y + R' = 0 into the form above,
' simply divide thru by O', i.e. P = P'/O', Q = Q'/O',
' etc.
Dim Z(3) As Double
Dim p2 As Double
Dim RMS As Double
Dim A As Double
Dim B As Double
Dim nRoots As Integer
Dim DISCR As Double
Dim t1 As Double
Dim t2 As Double
Dim RATIO As Double
Dim SUM As Double
Dim DIF As Double
Dim AD3 As Double
Dim E0 As Double
Dim CPhi As Double
Dim PhiD3 As Double
Dim PD3 As Double
Const DEG120 = 2.09439510239319
Const Tolerance = 0.00001
Const Tol2 = 1E-20
' ... Translate equation into the form Z^3 + aZ + b = 0
p2 = P^2
A = Q - p2/3
B = P * (2 * p2 - 9 * Q)/27 + R
RMS = Sqr(A^2 + B^2)
If RMS < Tol2 Then
' ... Three equal roots
nRoots = 3
ReDim ROOT(0 To nRoots)
For i = 1 To 3
ROOT(i) = -P/3
Next i
Exit Sub
End If
DISCR = (A/3)^3 + (B/2)^2
If DISCR > 0 Then
t1 = -B/2
t2 = Sqr(DISCR)
If t1 = 0 Then
RATIO = 1
Else
RATIO = t2/t1
End If
If Abs(RATIO) < Tolerance Then
' ... Three real roots, two (2 and 3) equal.
nRoots = 3
Z(1) = 2 * QBRT(t1)
Z(2) = QBRT(-t1)
Z(3) = Z(2)
Else
' ... One real root, two complex. Solve using Cardan formula.
nRoots = 1
SUM = t1 + t2
DIF = t1 - t2
Z(1) = QBRT(SUM) + QBRT(DIF)
End If
Else
' ... Three real unequal roots. Solve using trigonometric method.
nRoots = 3
AD3 = A/3#
E0 = 2# * Sqr(-AD3)
CPhi = -B/(2# * Sqr(-AD3^3))
PhiD3 = Acos(CPhi)/3#
Z(1) = E0 * Cos(PhiD3)
Z(2) = E0 * Cos(PhiD3 + DEG120)
Z(3) = E0 * Cos(PhiD3 - DEG120)
End If
' ... Now translate back to roots of original equation
PD3 = P/3
ReDim ROOT(0 To nRoots)
For i = 1 To nRoots
ROOT(i) = Z(i) - PD3
Next i
End Sub
Function QBRT(X As Double) As Double
' Signed cube root function. Used by Qubic procedure.
QBRT = Abs(X)^(1/3) * Sgn(X)
End Function
任何人都可以請指導我如何解決它,所以我可以運行它。謝謝。
編輯:這是我如何在Excel中運行它(I改變Qubic是一個函數,而不是子) 單元格A1:A3分別含有P,Q,R 細胞B1:B3包含羅茨() 細胞C1:C3包含陣列Qubic
的輸出A1:1 A2:1 A3:1
B1:0.1 B2:0.1 B3:0.1
C1: C2: C3: {= QUBIC(A1,A2,A3,B1:B3)}
ADD:現在它與從@assylias修復,我試圖從另一個片以下:
Function ParamAlpha(p,q,r) as Double
Dim p as Double
Dim q as Double
Dim r as Double
p=-5
q=-2
r=24
Dim Alpha as Double
Dim AlphaVector() as Double
AlphaVector=QubicFunction(p,q,r)
Alpha=FindMinPositiveValue(AlphaVector)
End Function
Function FindMinPositiveValue(AlphaVector) As Double
Dim N As Integer, i As Integer
N = AlphaVector.Cells.Count
Dim Alpha() As Double
ReDim Alpha(N) As Double
For i = 1 To N
If AlphaVector(i) > 0 Then
Alpha(i) = AlphaVector(i)
Else
Alpha(i) = 100000000000#
End If
Next i
FindMinPositiveValue = Application.Min(Alpha)
End Function
在Excel中,我稱之爲= ParamAlpha(-5,-2,24),並將其返回#VALUE!
感謝您的代碼。我添加了它,但沒有顯示任何消息。我也改變QUBIC功能從Sub(應該有所作爲?),並沒有奏效。我正在更新我的文章,以及如何在Excel中運行它。如果我錯誤地運行,請告訴我。謝謝! – user1155299
@ user1155299打開一個新的工作簿,打開VBA編輯器(ALT + F11),右鍵單擊新工作簿的項目>插入>新建模塊並將代碼(和我的)粘貼到該新模塊中。 – assylias
做到了,我仍然獲得#VALUE !.我更新了我的文章,並在Excel中運行它。我是如何做到這一點的? – user1155299