수치 미분 및 유한 차이 계수 : Fornberg 방법의 업데이트?


11

하나는 숫자 파생 상품을 계산 할 때, 방법은 벤 구토 Fornberg 제시 여기에 (그리고보고 여기에 ) 매우 편리 (구현이 정확하고 간단한 모두)입니다. 1988 년의 최초 논문 일자로서, 오늘날 더 나은 대안이 있는지 (또는 거의 간단하고 정확하게) 알고 싶습니까?


1
차별화 할 대상을 모른 채 말하기가 어렵습니다. 자동 미분 을 고려 했습니까 ?
Biswajit Banerjee

@BiswajitBanerjee : 유한 차분 계수의 경우 자동 미분이 적용되지 않습니다.
Geoff Oxberry

@GeoffOxberry : 실제 물리 문제, 즉 "계산 과학"의 과학 부분을 언급하고있었습니다.
Biswajit Banerjee

@Vincent : 함수 또는 테이블을 차별화하려고합니까? 테이블 데이터 인 경우 테이블 데이터에 노이즈가 있습니까? PDE를 개별화하려고합니까?
user14717

답변:


9

개요

좋은 질문. R. Baltensperger의 "임의 배열 포인트에 대한 행렬 미분법의 정확도 향상"이라는 제목의 논문이 있습니다. 내 의견으로는 큰 문제는 아니지만 2000 년에 등장하기 전에 이미 알려진 요점이 있습니다. 정수 함수 의 미분이 사실 이어야 한다는 사실을 정확하게 표현하는 것이 중요하다는 점을 강조 합니다. 0이어야합니다 (수학적 의미로 정확하게 유지되지만 반드시 숫자로 표시되는 것은 아님).f(x)=1

이것은 n 번째 도함수 행렬 의 행 합 이 0이어야한다는 것을 쉽게 알 수 있습니다. 대각선 입력을 조정하여, 즉 을 설정하여 이러한 제약 조건을 적용하는 것이 일반적입니다부동 소수점 계산의 반올림 오류로 인해 컴퓨터에서 작업 할 때이 기능이 정확하게 유지되지 않는 것은 분명합니다. 더 놀라운 것은 미분 행렬 (예 : Gauss-Lobatto와 같은 많은 기존 배열 지점에서 사용 가능)에 대한 분석 공식을 사용할 때 이러한 오류가 훨씬 더 심각하다는 것입니다.()

(1)제이제이(): =나는=1나는제이나는제이.

이제, 논문 (및 그 참조)은 도함수의 오차가 행 합계의 편차의 순서가 0에서 나온다고 명시하고있다. 따라서 목표는 가능한 한 숫자를 작게 만드는 것입니다.

수치 테스트

좋은 점은 Fornberg 절차가 이와 관련하여 상당히 좋은 것 같습니다. 아래 그림에서 나는 다양한 수의 Chebyshev-Lobatto 배열 위치에 대해 정확한, 즉 1 차 미분 행렬과 Fornberg 알고리즘에 의해 도출 된 행동을 비교했습니다.

다시 인용 된 논문의 진술을 믿으면 이것은 Fornberg 알고리즘이 미분에 대해 더 정확한 결과를 산출 할 것임을 암시합니다.

이를 증명하기 위해 논문에서와 동일한 기능인 오류 평가이는 (i) 분석적으로 얻어진 유도체 매트릭스, (ii) Fornberg 유도체 매트릭스, 및 (iii) Fornberg 매트릭스의 조정 된 버전에 대해 수행되며, 여기서 상기 식은 (1) 를 통해 매우 간단하게 시행됩니다.다음은 내가 얻는 것입니다 (Gauss-Lobatto abscissas의 예).

(2)에프(엑스)=11+엑스2.
(삼)이자형=최대나는{0,,}|에프'(엑스나는)제이=1나는제이에프(엑스제이)|.
(4)~제이제이=제이제이(나는=1제이나는),모든 제이.

결론

결론적으로, Fornberg의 방법은 분석 공식의 결과보다 약 3 배 정도 더 정확한 경우 경우에 상당히 정확한 것으로 보입니다 . 대부분의 응용 프로그램에 충분히 정확해야합니다. 더욱이 Fornberg는이 사실을 그의 방법에 명시 적으로 포함시키지 않는 것 같습니다 (적어도 두 Fornberg 논문에는 언급이 없습니다).=512

이 예에서 식 (4)을 간단하게 포함함으로써 다른 크기의 자릿수를 얻을 수있다. 이것은 매우 간단한 접근 방식이며 각 파생 상품에 대해 한 번만 적용되므로 사용하지 않을 이유가 없습니다.

반올림 오차를 줄이기 위해 식 (1)의 합계를 평가하기 위해보다 정교한 접근 방식을 사용하는 Baltensperger 논문의 방법은 오차와 거의 동일한 크기를 산출합니다. 따라서이 예에서는 위의 "Adjusted Fornberg"방법과 거의 같습니다.


4

연속 함수의 숫자 구현을 차별화하려고한다고 가정하면 많은 방법이 있습니다.

1) 자동 분화. 가장 정확하고 일반적인 방법입니다. 코드가 고통스럽기 때문에 연산자 오버로드와 인수 의존 조회가 필요합니다. 이러한 개념을 이해하기 위해 사용자에게 부담을줍니다. 또한 에서 sinc를 차별화하는 것과 같은 제거 가능한 특이점으로 어려움을 겪습니다 .엑스=0

2) 체비 쇼프 변환. 함수를 체비 쇼프 다항식 범위에 투영하고 세 항의 재발을 구별하십시오. 매우 빠르고 정확합니다. 그러나 귀하는 관심 분야가 간결하게 지원되어야합니다. 선택된 도메인 외부에서 , 3 개의 용어 재발이 불안정하다.[,]

3) 유한 차분. 1D로 과소 평가됨; 수치 계산에 관한 Nick Higham의 팁과 요령을 참조하십시오 . 잘림 오류와 반올림 오류의 균형을 맞추면 단계별 크기를 선택할 필요가 없습니다. 자동으로 선택할 수 있습니다. Boost 에서이 아이디어는 유형에 대한 올바른 자릿수의 6/7을 기본적으로 복구하는 데 사용됩니다. (Higham은 정확한 자릿수 1/2의 간단한 경우에 대한 아이디어 만 보여 주지만 아이디어는 쉽게 확장됩니다.) 계수는 Fornberg의 등거리 테이블에서 얻은 것이지만 함수가 1ULP로 평가 될 수 있다는 가정하에 단계 화가 선택됩니다. 정확성. 단점은 유형의 자릿수 절반을 복구하기 위해 2 개의 함수 평가가 필요하고, 자릿수는 3/4를 복구하기 위해 4가된다는 것입니다. 1D에서는 나쁜 거래가 아닙니다. 더 높은 차원에서는 치명적입니다.

4) 복소수 단계 미분. 사용 . 가지고 단위 반올림을 할이 능력은 거의 모든 올바른 비트 복구합니다. 그러나 실제 파생물을 직접 코딩하는 것보다 복잡한 평면에서 함수를 구현하는 것이 일반적으로 어렵 기 때문에 다소 부정적입니다. 여전히 멋진 아이디어이며 특정 상황에서 유용합니다.에프'(엑스)(에프(엑스+나는h))h


1

나는 Fornberg의 알고리즘을 개선 한 사람을 알지 못합니다 (그의 최신 논문 참조 ). 옆으로, 수치 미분을 계산하는 방법으로 그의 알고리즘을 보는 것이 옳지 않은 것 같습니다. 그가 한 일은 유한 차분 법에 대한 가중치 를 계산하는 효율적인 알고리즘을 도출하는 것입니다 . 그의 방법의 장점은 한 번에 원하는 파생물까지 모든 파생물에 대한 가중치를 제공한다는 것입니다.


나는 "숫자 미분을 계산하는 방법으로 그의 알고리즘을 보는 것이 옳지 않다"는 진술에 동의하지 않을 것이다. 점 대해 가중치 평가 되면 를 통해 함수 의 수치 미분을 직접 계산할 수 있습니다 . z f ( x ) f ( z ) = i w i f ( x i )나는에프(엑스)에프'()=나는나는에프(엑스나는)
davidhigh

@davidhigh : Fornberg의 논문을 읽으면 근사 자체를 계산하는 것이 아니라 유한 차분 근사에 대한 가중치 계산에 대해 이야기합니다. 물론 알고리즘을 사용하여 도함수를 계산할 수도 있지만 가중치를 계산하고 저장 한 다음 반복적으로 사용하여 근사 도함수를 계산하는 것이 더 합리적입니다. 그렇지 않으면 필요가 없을 때 가중치를 반복적으로 계산합니다.
Brian Zatapatique

1

더 간단한 계획

Fornberg 방법의 확장에 대한 다른 답변 외에도 여기에 더 간단한 대안에 대한 질문을 드리겠습니다.

이를 위해 Lagrangian 보간법의 미분 계수를 더 직접 생성하는 대체 체계를 스케치합니다. 구현에는 몇 줄의 코드 만 필요하고 임의의 그리드에서 작동하며 첫 번째 실험에 따르면 Fornberg만큼 정확합니다.

구현의 기초는 허수 미분 여기서 기계 정밀 순서의 변수입니다. 허수 단계 미분은 미분 값을 안정적으로 생성하는 것으로 알려져 있으며 으로 유한 차분 구현의 수치 적 불안정성을 겪지 않습니다 .

에프'(엑스) = 1h(에프(엑스+나는h)),
hh0

두 번째 성분은 격자 의 라그랑주 보간 다항식 입니다. 중심 한 형태 중 하나로 평가됩니다. 예 : 여기서 복소수 미분을 사용하려면 이러한 수식이 복소수에 대해서도 작동해야합니다. 인수 . 또한 주어진 함수 f (x) 및 계수 벡터 에 대해 를 통한 보간 다항식을 나타냅니다나는(엑스){엑스1,,엑스}

나는() = {1만약 =엑스나는 μ나는엑스케이케이μ케이엑스케이그렇지 않으면.
μ나는=1케이나는(엑스나는엑스케이)에프나는=에프(엑스나는)(엑스1,에프나는)
(엑스;에프)=나는=1에프나는나는(엑스).


연산

알고리즘은 다음과 같습니다. Fornberg와 동일한 입력 및 출력 매개 변수를 갖지만 훨씬 더 쉬운 것은 아닙니다.

입력:

  • 엑스 : N 개의 개별 그리드 포인트가있는 그리드
  • 영형아르 자형 : 파생 순서
  • z : 미분이 평가되는 지점
  • 아마도 : 그리드 포인트에서 함수 또는 기능 값 (출력 변형 2에만 필요)에프(엑스)에프나는

초기화

  • Barycentric 보간을 통해 Lagrange 다항식 을 초기화합니다 .
  • 대해 행렬 의 배열을 초기화합니다.×(영형)영형=0,,영형아르 자형
  • 집합 , 즉 차원의 단위 행렬(0): =나는×
  • 설정영형: =0

연산

반면 :영형<영형아르 자형

  • 계산 복잡한 단계 유도체 의해 위한 모든 와 . 여기서 는 의 번째 행을 나타냅니다 .나는케이(영형+1)=에스((엑스케이;나는(영형)))에스나는케이
    나는(영형)나는(영형)

  • o = o + 1로 설정;

무엇을 출력 할지 결정하십시오 .

  1. 벡터 점에서 유한 차이 계수 , . 이것이 Fornberg가하는 일입니다.(영형아르 자형)나는=(;나는(영형아르 자형))

  2. 보간 함수 을 미분 주문 . 이를 위해 함수 resp를 입력해야합니다. 에서 함수 값 를 알고리즘에 적용합니다.(영형아르 자형)(엑스)=나는=1에프(엑스나는)(엑스;나는(영형아르 자형))에프(영형아르 자형)(엑스)영형아르 자형에프나는엑스나는

  3. 변형 2의 보간 함수를 반환 하는 메타 함수 . 그러나 그리드 포인트에서 보간 할 임의의 함수 대해.차이(int 영형아르 자형,함수 )

개인적으로 변형 3이 가장 좋습니다.


알고리즘 분석

Fornberg의 경우이 알고리즘은 입니다. 시간을 찾으면 정확성, 안정성 등과 관련하여 더 경험적인 결과를 게시 할 것입니다.영형(영형아르 자형2)


0

수치 미분의 정밀도를 높이려면 다음을 수행하십시오.

1) 단계 크기 h 에 따라 선호하는 고정밀 "표준"방법을 선택하십시오 .

2) 다르지만 합리적인 단계 크기 h로 여러 번 1)에서 선택한 방법으로 미분 값을 계산합니다 . 매번 h 를 구간 (0.5 * H / 10, 1.5 * H / 10)에서 난수로 선택할 수 있습니다. 여기서 H는 사용하는 방법에 적합한 단계 크기입니다.

3) 결과 평균.

결과는 절대 오차 wrt에서 2-3 배의 크기를 얻을 수 있습니다. 평균화되지 않은 결과.

https://arxiv.org/abs/1706.10219


3
SciComp.SE에 오신 것을 환영합니다! 방법을 간단히 요약하면이 대답이 더 좋습니다.
Christian Clason

2
또한 사용자 이름은 해당 논문을 작성했음을 나타냅니다. 읽어주십시오 자기 홍보에 대한 가이드 라인을 그리고 편집 그에 따라 게시물을.
Wrzlprmft

본인의 답변이 실제로 올바른 답변을 가리키면 부정적인 투표가 불공평하다고 생각합니다.
F. Jatpil

1
나도 ... 그래서 내 +1을 가지고 ... :-)
davidhigh
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.