Excel中的SolvStat Macro如何计算偏导数?

Posted

技术标签:

【中文标题】Excel中的SolvStat Macro如何计算偏导数?【英文标题】:How does SolvStat Macro in Excel calculate partial derivatives? 【发布时间】:2019-06-27 23:24:18 【问题描述】:

我正在使用 E.J. 的 SolvStat 宏。 Billo 来自“Excel for Chemists”一书,我无法弄清楚偏导数如何计算为除 0 以外的任何值,因为我没有看到任何会改变 YCalc() 数组值的显式赋值值或 calc_ys 范围值。以下代码摘自宏:

Dim YObsd(), YCalc(), ParmValu(), PartialDeriv(), Product(), ProdArray()

Set calc_ys = Application.InputBox("Podaj zakres wartości Y obliczonych z modelu." & msg1, _
            "SOLVER STATISTICS - Krok 2 z 4", , , , , , 8)

ReDim YObsd(N), YCalc(N)
x = 1
For Each F In calc_ys
   YCalc(x) = F.Value
   x = x + 1
Next

Set Parms = Application.InputBox("Zaznacz komórki zawierające  współczynniki obliczone metodą najmniejszych kwadratów przez Solvera." & msg2, _
"SOLVER STATISTICS – Krok  3 z 4", , , , , , 8)
N3 = Parms.Count
x = 1
For Each cell In Parms
   ParmValu(x) = cell.Value
   x = x + 1
Next
RMSD = Sqr(SSresiduals / (N - N3))

'Calculate table of partial differentials
increment = 0.000001
'1E-6 seems to be optimum value for increment for numerical differentiation.
'1E-3 is too large, 1E-12 is too small.  1E-9 gives results almost identical to 1E-6.
y = 1
For Each parm In Parms
   parm.Value = parm * (1 + increment)     'Increase regression coeffs by a small increment.
   If parm = 0 Then parm.Value = 1E-100    'If cell contains zero exactly, replace it with very small value
   CheckErrorSum = 0
   x = 1
   For Each cell In calc_ys
      PartialDeriv(x, y) = (cell - YCalc(x)) / (parm * increment)      'Partial deriv = delta(function)/delta(parameter)
      CheckErrorSum = CheckErrorSum + PartialDeriv(x, y)   'This sum used only for error checking.
      x = x + 1
   Next cell
   parm.Value = ParmValu(y)    'Restore original parameter value
   If CheckErrorSum = 0 Then
      MsgBox "Błąd w obliczeniach macierzy." & Chr(13) & Chr(13) & 
      "Najpowszechniejsze błędy: " & Chr(13) & Chr(13) & _
         "1.  Niepoprawny wybór komórek Y(obl)." & Chr(13) & Chr(13) & _
         "2.  Niepoprawny wybór komórek zawierających współczynniki regresji 
         " & Chr(13) & Chr(13) & "Zatrzymanie programu.", 16, "UNKNOWN ERROR"
      Exit Sub
   End If
   y = y + 1
Next parm

YCalc(x) 值包含从 Excel 中的 Range 分配的值;然而,单元格(calc_ys 中的元素)是一个略有不同的值,但从代码来看,看起来应该没有任何区别。为了计算偏导数,应该有区别,但我不明白这段代码如何/为什么为这两个变量产生不同的值。

这里是完整代码的链接:http://ue.poznan.pl/data/upload/articles/20140213/330de4761384630218/solvstat.doc

【问题讨论】:

【参考方案1】:

由于 calc_ys 是一个单元格范围,它不包含电子表格中的显示值,而是计算显示值的公式。这些公式引用了参数,这些参数在偏导部分进行了修改;因此,Range 中的 calc_ys 单元格也被修改了。

【讨论】:

以上是关于Excel中的SolvStat Macro如何计算偏导数?的主要内容,如果未能解决你的问题,请参考以下文章

使用 ABAP 中的参数调用 excel 宏

xlwings: Write Excel macro using python instead of VBA

EXCEL VBA 求助

无法从 Twin.macro 中的 Prop 获取值

在 Basic 中计算自己的对数(LibreOffice Calc Macro)

EXCEL vba 合并相同单元格