VBA - 试图获取函数的根

问题描述

我用 VBA 解决了这个方程:

Energy = y + (0.5) ^ 2 / ( 2 * 9.81 * y ^ 2 )

但我得到了 Energy 值并且想要求解 y 值。

在 R 中很简单:uniroot。有这样的吗?

解决方法

方程是一个三次多项式,有两个正根和一个负根。我们可以消除负根,并考虑在 模块 中使用以下 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

以及根据 Asin() 定义的支持 Atn() 函数。

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 
,

考虑使用代数

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

,

这是 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