2014-07-09 2 views
1

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 

답변

1

마지막 학기에 내부 파생물을 잊어 버렸습니다. 분모의 a는 내부 파생물로 취소됩니다. 그래서

-a*A*sin(a*x) + a*B*cos(a*x) - cos(a*x)/2/a + x/2*sin(a*x) 

오류에 관해서는, 나는 범인이 근사 것으로 의심 할 수 있어야합니다. 근사값의 유형에 따라 함수 값의 샘플 점 사이의 오차는 임의로 커질 수 있으며, 미분을 계산할 때만 확대됩니다. 당신은 6 대신 RTFM

99의, 훨씬 적은 샘플 포인트를 사용하여 더 나은 결과를 얻을 수 있습니다 R-manual approxfun 만 구분 상수 또는 선형 근사치를 제공 당. 둘 다 분별력이 없습니다. 이것은 조각 별 선형 근사치의 도함수가 점프가있는 상수 점 상수이고 두 번째 미분 값이 샘플 포인트에서 델타 피크가있는 조각 별 제로임을 의미합니다. 조각 별 선형 함수를 통해 1 차 미분을 다시 보간하면 가장 수학적인 절차는 아니지만 합리적인 결과를 얻을 수 있습니다.

R-manual splinefun을 사용하면 실제로 두 번째로 차이가 나는 보간 함수를 얻을 수 있습니다.

+0

파생 상품에서 오류를 지적 해 주셔서 감사합니다. 'a = 1' 때문에 여기서는 효과가 없습니다. –

+0

'approxfun'이하는 일에 대해 자세히 설명해 줄 수 있습니까? – LutzL

+0

발견 된 문서. 당신이하는 일은 근본적으로 잘못되어 잘못되었거나 다른 말로 결함이 있습니다. – LutzL

0

하지 당신이 무엇을 기대 :하지 아무것도 "오류 확대"라는 수치 차별화입니다. 귀하의 dYnum 값이 비 approxfun 값과 동일하지 않다는 사실은 두 번째 수치 차별화에 공급하는 데이터에 잡음이 있음을 경고하는 거대한 붉은 깃발이어야합니다. grad (또는 다른 수치 차별 자) 기능은 데이터의 노이즈로 인해 발생하는 고주파 성분을 충 분히 차별화합니다.

+0

이 예에서 "소음"은 무엇이라고합니까? –

+0

31123 대 31124, 14900 대 14901. –

+0

하지만 이것은 작은 "노이즈"이며 왜 2 차 미분에 영향을 미칩니 까? 덜 이상한 "dynumapprox"로 왜 작동합니까? –