excel - Excel中的SolvStat Macro如何计算偏导数?
问题描述
我正在使用 EJ Billo 的“化学家 Excel”一书中的 SolvStat 宏,我无法弄清楚偏导数是如何计算为除 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
解决方案
由于 calc_ys 是一个单元格范围,因此它不包含电子表格中的显示值,而是包含计算显示值的公式。这些公式引用了参数,这些参数在偏导部分进行了修改;因此, Range 中的 calc_ys 单元格也会被修改。
推荐阅读
- r - 可能与 MC 风格的 knitr bug 交互
- python - 如何获取显示列异常值的行?
- r - 有没有办法用“引号”快速包含一个单词列表
- c++ - QGraphicsTextItem 动态调整大小
- classification - SHAP 值 - 总结文本解释 - 自定义功能集
- ruby-on-rails - 模拟在 Rspec Capybara 中按下 Tab 键?
- python - 同时运行 tensorboard 和 python 脚本
- indexeddb - Dexie.js:通过动态 id 更新嵌套对象
- flutter - Vscode 不显示 chrome 作为设备
- c# - 我正在制作炮塔,但它不会射击