- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我对自定义函数pTgh_y(q,g,h)
关于q的一阶数值导数感兴趣。对于特殊情况,pTgh_y(q,0,0) = pnorm(q)。换句话说,当 g=h=0 时,pTgh_y(q,g,h)
被简化为标准法线的 CDF(见下图)。
这意味着 d pTgh_y(0,0,0)/dq 应等于以下内容
dnorm(0)
0.3989423
grad(pnorm,0)
0.3989423
以下是我对 {pracma} 库中的 grad 函数的一些尝试。
library(pracma)
# load pTgh and all relevant functions
grad(function(x){pTgh_y(x,0,0)},0)
0
grad(function(x){pTgh_y(x,0,0)},0,heps=1e-10)
0
以下是我对 {numDeriv} 库中的 grad 函数的一些尝试。
library(numDeriv)
# load pTgh and all relevant functions
grad(function(x){pTgh_y(x,0,0)},0,method='simple')
0.3274016
grad(function(x){pTgh_y(x,0,0)},0,method='Richardson')
-0.02505431
grad(function(x){pTgh_y(x,0,0)},0,method='complex')
Error in pmin(x, .Machine$double.xmax) : invalid input type Error in grad.default(function(x) { : function does not accept complex argument as required by method 'complex'.
这些函数都没有给出正确的结果。
我的pTgh_y(q,g,h)
函数定义如下
qTgh_y = function(p,g,h){
zp = qnorm(p)
if(g==0) q = zp
else q = (exp(g*zp)-1)*exp(0.5*h*zp^2)/g
q[p==0] = -Inf
q[p==1] = Inf
return(q)
}
pTgh_y = function(q,g,h){
if (q==-Inf) return(0)
else if (q==Inf) return(1)
else {
p = uniroot(function(t){qTgh_y(t,g,h)-q},interval=c(0,1))
return(p$root)
}
}
最佳答案
你的函数在 0 附近平坦,因此计算 0 的导数是正确的:
f = function(x){pTgh_y(x,0,0)}
h = 0.00001; f(0+h); f(0-h)
# [1] 0.5
# [1] 0.5
library(pracma)
grad(f, 0, heps=1e-02); grad(f, 0, heps=1e-03);
grad(f, 0, heps=1e-04); grad(f, 0, heps=1e-05)
# [1] 0.3989059
# [1] 0.399012
# [1] 0.4688766
# [1] 0
您需要提高函数pTgh_y
的准确性:
pTgh_y = function(q,g,h){
if (q==-Inf) return(0)
else if (q==Inf) return(1)
else {
p = uniroot(function(t){qTgh_y(t,g,h)-q},interval=c(0,1),
tol = .Machine$double.eps)
return(p$root)
}
}
现在你得到了你想要的结果:
f = function(x){pTgh_y(x,0,0)}
grad(f, 0)
[1] 0.3989423
关于r - R 的 {pracma} 和 {numDeriv} 库中的 grad 函数给出了错误的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35615311/
我在 pramca R 包(v. 2.1.1 ).我正在使用 R 3.4.3 x64 窗口。 我想要识别可能有两个重复值的峰值的函数,我相信选项 peakpat 是我可以做到这一点的方法。 这个问题已
我正在使用 pracma 包,特别是 Brent-Dekker 寻根算法,来搜索一个函数的根,该函数将观测值的变异系数 (CV obs) 设置为等于模拟值 (CV模拟)。 虽然在个人基础上我可以为算法
我对自定义函数pTgh_y(q,g,h)关于q的一阶数值导数感兴趣。对于特殊情况,pTgh_y(q,0,0) = pnorm(q)。换句话说,当 g=h=0 时,pTgh_y(q,g,h) 被简化为标
我是一名优秀的程序员,十分优秀!