我想做什么:
我试图在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中的偏导数。我正在尝试构建一个更大的函数,最终通过一系列分析计算传播错误,并且这种传播依赖于偏导数。
谢谢,
迈克尔
答案 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
修改#2:强>
为了测试 UDF()的准确性,我们可以将它与一阶导数公式进行比较
所以在 C2 中输入:
=9*A2^2-24*A2+7
结果几乎相同: