numDeriv
패키지를 사용하여 수치상 두 번 차별화 오류를 어떻게 설명 할 수 있습니까?numDeriv R 패키지로 두 번 차별화하지 못했습니다.
이하는 기능 Y
및 그 최초 유도체 dY
입니다.
Y <- function(x, A=1, B=1, a=1){
A*cos(a*x) + B*sin(a*x) - x/2/a*cos(a*x)
}
dY <- function(x, A=1, B=1, a=1){
-a*A*sin(a*x) + a*B*cos(a*x) - cos(a*x)/2/a + x/2/a*sin(a*x)
}
그리고 아래는 numDeriv
패키지의 grad
기능의 성공적인 그림 : 두 번-차별화 아래 미세 너무
library(numDeriv)
x <- c(0.2,0.4,0.6)
grad(Y, x)
## [1] 0.31123 0.14900 0.01742
dY(x)
## [1] 0.31123 0.14900 0.01742
작동
:dYnum <- function(x) grad(Y, x)
d2Ynum <- function(x) grad(dYnum, x)
d2Ynum(x)
## [1] -0.8820 -0.7368 -0.5777
grad(dY, x)
## [1] -0.8821 -0.7368 -0.5777
하지만를 로모그래퍼 Y
를 교체 할 때 날카로운 근사값, 두 번 - 차이점 실패 :
dYnum
를 교체 할 때 3,691,363,210
xx <- seq(0.01, 0.99, by=0.01)
Yapprox <- approxfun(xx, Y(xx))
dYnum <- function(x) grad(Yapprox, x)
dYnum(x) # first-order derivative is OK
## [1] 0.31124 0.14901 0.01743
d2Ynum <- function(x) grad(dYnum, x)
d2Ynum(x) # not the good result
## [1] -2698 -1127 -589
grad(dY, x) # this is the good result
## [1] -0.8821 -0.7368 -0.5777
그러나, 다시 작동합니다
xx <- seq(0.1, 0.9, by=0.01)
dYnumapprox <- approxfun(xx, dYnum(xx)) # approxfun(xx, grad(Yapprox, xx))
d2Ynum_ <- function(x) grad(dYnumapprox, x)
d2Ynum_(x)
## [1] -0.8820 -0.7368 -0.5777
파생 상품에서 오류를 지적 해 주셔서 감사합니다. 'a = 1' 때문에 여기서는 효과가 없습니다. –
'approxfun'이하는 일에 대해 자세히 설명해 줄 수 있습니까? – LutzL
발견 된 문서. 당신이하는 일은 근본적으로 잘못되어 잘못되었거나 다른 말로 결함이 있습니다. – LutzL