在Excel中查找偏导数

时间:2015-09-08 01:19:33

标签: excel-vba user-defined-functions partial derivative vba

我想做什么:

我试图在Excel中编写一个用户定义的函数来计算函数的偏导数,即f(x,y,... n),相对于x。我最初的方法是让函数将x的值改变±0.01%,并将响应记录在f中。那么斜率就是偏导数。

我的功能应该像这样:

    =PARTIAL(A2, A1)

其中,单元格A1是依赖于单元格A2,A3,A(n)的某种功能。我的函数将返回A1相对于A2的偏导数。

完整的非工作代码如下所示:

Function PARTIAL(x As Range, f As Range) As Double
    Dim e As Double
    e = 0.0001 * x

    Dim y2 As Double
    Dim y1 As Double

    x = x + e
    y2 = f

    x = x - (2 * e)
    y1 = f

    x = x + e

    PARTIAL = (y2 - y1) / (2 * e)
End Function

为什么我不能这样做:

问题是我的功能依赖于修改A2的能力,并在A1中记录响应。不幸的是,Excel对于不允许函数修改它们正在运行的工作表非常严格,并且下面的调用将引发错误:

    Function myFunction(x as Range) as Double
        x.Cells(1, 1).Value = 5
    End Function

我想知道的事情:

这个问题有解决方法吗?有人有更好的方法来方便地计算Excel中的偏导数。我正在尝试构建一个更大的函数,最终通过一系列分析计算传播错误,并且这种传播依赖于偏导数。

谢谢,

迈克尔

1 个答案:

答案 0 :(得分:0)

您可以使用 Sub 而不是 UDF 。说 A1 包含函数:

=3*A2^3-12*A2^2+7*A2-11+1/A3

A2 包含 -2 A3 包含 1

我们想要计算部分并将其值存储在 B1

Sub MAIN()
  Call partiall(Range("A2"), Range("A1"))
End Sub

Sub partiall(x As Range, f As Range)
  Dim e As Double

  e = 0.0001 * x.Value
  x.Value = x.Value + e
  DoEvents
  y2 = f.Value

  x.Value = x.Value - (2 * e)
  DoEvents
  y1 = f.Value

  x.Value = x.Value + e

  partial = (y2 - y1) / (2 * e)
  Range("B2").Value = partial
End Sub

修改#1:

如果从工作表中获取公式,则可以使用 UDF(),但计算 UDF()<中的Δy/Δx /强>:

Public Function PartialDerivative(x1 As Range, x2 As Range, f As Range) As Double
  Dim sFormula As String, addy1 As String, v1 As Double
  Dim e As Double

  sFormula = f.Formula
  addy1 = x1.Address(0, 0)
  v1 = x1.Value
  e = 0.0001 * v1

  y2 = Evaluate(Replace(sFormula, addy1, "(" & v1 + e & ")"))
  y1 = Evaluate(Replace(sFormula, addy1, "(" & v1 - e & ")"))
  PartialDerivative = (y2 - y1) / (2 * e)

End Function

enter image description here

修改#2:

为了测试 UDF()的准确性,我们可以将它与一阶导数公式进行比较

所以在 C2 中输入:

=9*A2^2-24*A2+7

结果几乎相同:

enter image description here