VBA - 尝试获取函数的根
VBA - Trying to get the root of a function
我在 VBA 中求解了这个方程:
Energy = y + (0.5) ^ 2 / ( 2 * 9.81 * y ^ 2 )
但我得到了 Energy
值并想求解 y
值。
在 R 中很简单:uniroot
。有这样的吗?
考虑使用代数:
Energy = y + (0.5)^2 / ( 2 * 9.81 * y^2 )
Energy = y + .25 / ( 19.62 * y^2 )
Energy * ( 19.62 * y^2 ) = y * ( 19.62 * y^2 ) + .25
Energy * 19.62 * y^2 = 19.62 * y^3 + .25
0 = 19.62 * y^3 - Energy * 19.62 * y^2 + .25
并应用标准技术:
Previous Post
该方程是一个具有两个正根和一个负根的三次多项式。我们可以消除负根,并考虑在 Module.
中使用以下 VBA 代码直接评估两个正根
Global Const g As Double = 9.81
Global Const PI As Double = 3.14159265358979
Public Function CalcE(ByVal y As Double) As Double
CalcE = y + (0.5) ^ 2 / (2# * g * y ^ 2)
End Function
Public Function SolveForY(ByVal E As Double, Optional ByVal second As Boolean = False) As Double
' Solve "E = y + (0.5) ^ 2 / ( 2 * g * y ^ 2 )" for "y"
If Not second Then
SolveForY = E / 3# - 2# * E * Sin(Asin((16# * E ^ 3# * g - 27#) / (16# * E ^ 3# * g)) / 3#) / 3#
Else
SolveForY = E / 3# + 2# * E * Sin(Asin((16# * E ^ 3 * g - 27#) / (16# * E ^ 3 * g)) / 3# + PI / 3#) / 3#
End If
End Function
和根据 Atn()
.
定义的支持 Asin()
函数
Public Function Asin(ByVal x) As Double
If Abs(x) < 1# Then
Asin = Atn(x / Sqr(1# - x * x))
Else
Asin = 2 * Atn(1) * Sgn(x)
End If
End Function
一些示例结果是
? SolveForY(1#)
0.12035578724076
? SolveForY(1#, True)
0.986917853921696
并检查解决方案
? CalcE(0.12035578724076)
0.999999999999997
? CalcE(0.986917853921696)
1
这是 John Alexiou 从 VBA 到 Excel 公式的答案的翻译。如果单元格 B2
中有能量,则三个解由下式给出:
=B2/3-2*B2*SIN((ASIN((16*B2^3*9.81-27)/(16*B2^3*9.81))+0*PI())/3)/3
=B2/3-2*B2*SIN((ASIN((16*B2^3*9.81-27)/(16*B2^3*9.81))+4*PI())/3)/3
=B2/3-2*B2*SIN((ASIN((16*B2^3*9.81-27)/(16*B2^3*9.81))+2*PI())/3)/3
第三个方程给出负数y
。
我在 VBA 中求解了这个方程:
Energy = y + (0.5) ^ 2 / ( 2 * 9.81 * y ^ 2 )
但我得到了 Energy
值并想求解 y
值。
在 R 中很简单:uniroot
。有这样的吗?
考虑使用代数:
Energy = y + (0.5)^2 / ( 2 * 9.81 * y^2 )
Energy = y + .25 / ( 19.62 * y^2 )
Energy * ( 19.62 * y^2 ) = y * ( 19.62 * y^2 ) + .25
Energy * 19.62 * y^2 = 19.62 * y^3 + .25
0 = 19.62 * y^3 - Energy * 19.62 * y^2 + .25
并应用标准技术:
Previous Post
该方程是一个具有两个正根和一个负根的三次多项式。我们可以消除负根,并考虑在 Module.
中使用以下 VBA 代码直接评估两个正根Global Const g As Double = 9.81
Global Const PI As Double = 3.14159265358979
Public Function CalcE(ByVal y As Double) As Double
CalcE = y + (0.5) ^ 2 / (2# * g * y ^ 2)
End Function
Public Function SolveForY(ByVal E As Double, Optional ByVal second As Boolean = False) As Double
' Solve "E = y + (0.5) ^ 2 / ( 2 * g * y ^ 2 )" for "y"
If Not second Then
SolveForY = E / 3# - 2# * E * Sin(Asin((16# * E ^ 3# * g - 27#) / (16# * E ^ 3# * g)) / 3#) / 3#
Else
SolveForY = E / 3# + 2# * E * Sin(Asin((16# * E ^ 3 * g - 27#) / (16# * E ^ 3 * g)) / 3# + PI / 3#) / 3#
End If
End Function
和根据 Atn()
.
Asin()
函数
Public Function Asin(ByVal x) As Double
If Abs(x) < 1# Then
Asin = Atn(x / Sqr(1# - x * x))
Else
Asin = 2 * Atn(1) * Sgn(x)
End If
End Function
一些示例结果是
? SolveForY(1#) 0.12035578724076 ? SolveForY(1#, True) 0.986917853921696
并检查解决方案
? CalcE(0.12035578724076) 0.999999999999997 ? CalcE(0.986917853921696) 1
这是 John Alexiou 从 VBA 到 Excel 公式的答案的翻译。如果单元格 B2
中有能量,则三个解由下式给出:
=B2/3-2*B2*SIN((ASIN((16*B2^3*9.81-27)/(16*B2^3*9.81))+0*PI())/3)/3
=B2/3-2*B2*SIN((ASIN((16*B2^3*9.81-27)/(16*B2^3*9.81))+4*PI())/3)/3
=B2/3-2*B2*SIN((ASIN((16*B2^3*9.81-27)/(16*B2^3*9.81))+2*PI())/3)/3
第三个方程给出负数y
。