하나는 숫자 파생 상품을 계산 할 때, 방법은 벤 구토 Fornberg 제시 여기에 (그리고보고 여기에 ) 매우 편리 (구현이 정확하고 간단한 모두)입니다. 1988 년의 최초 논문 일자로서, 오늘날 더 나은 대안이 있는지 (또는 거의 간단하고 정확하게) 알고 싶습니까?
하나는 숫자 파생 상품을 계산 할 때, 방법은 벤 구토 Fornberg 제시 여기에 (그리고보고 여기에 ) 매우 편리 (구현이 정확하고 간단한 모두)입니다. 1988 년의 최초 논문 일자로서, 오늘날 더 나은 대안이 있는지 (또는 거의 간단하고 정확하게) 알고 싶습니까?
답변:
좋은 질문. R. Baltensperger의 "임의 배열 포인트에 대한 행렬 미분법의 정확도 향상"이라는 제목의 논문이 있습니다. 내 의견으로는 큰 문제는 아니지만 2000 년에 등장하기 전에 이미 알려진 요점이 있습니다. 정수 함수 의 미분이 사실 이어야 한다는 사실을 정확하게 표현하는 것이 중요하다는 점을 강조 합니다. 0이어야합니다 (수학적 의미로 정확하게 유지되지만 반드시 숫자로 표시되는 것은 아님).
이것은 n 번째 도함수 행렬 의 행 합 이 0이어야한다는 것을 쉽게 알 수 있습니다. 대각선 입력을 조정하여, 즉 을 설정하여 이러한 제약 조건을 적용하는 것이 일반적입니다부동 소수점 계산의 반올림 오류로 인해 컴퓨터에서 작업 할 때이 기능이 정확하게 유지되지 않는 것은 분명합니다. 더 놀라운 것은 미분 행렬 (예 : Gauss-Lobatto와 같은 많은 기존 배열 지점에서 사용 가능)에 대한 분석 공식을 사용할 때 이러한 오류가 훨씬 더 심각하다는 것입니다.
이제, 논문 (및 그 참조)은 도함수의 오차가 행 합계의 편차의 순서가 0에서 나온다고 명시하고있다. 따라서 목표는 가능한 한 숫자를 작게 만드는 것입니다.
좋은 점은 Fornberg 절차가 이와 관련하여 상당히 좋은 것 같습니다. 아래 그림에서 나는 다양한 수의 Chebyshev-Lobatto 배열 위치에 대해 정확한, 즉 1 차 미분 행렬과 Fornberg 알고리즘에 의해 도출 된 행동을 비교했습니다.
다시 인용 된 논문의 진술을 믿으면 이것은 Fornberg 알고리즘이 미분에 대해 더 정확한 결과를 산출 할 것임을 암시합니다.
이를 증명하기 위해 논문에서와 동일한 기능인
오류 평가이는 (i) 분석적으로 얻어진 유도체 매트릭스, (ii) Fornberg 유도체 매트릭스, 및 (iii) Fornberg 매트릭스의 조정 된 버전에 대해 수행되며, 여기서 상기 식은 (1) 를 통해 매우 간단하게 시행됩니다.다음은 내가 얻는 것입니다 (Gauss-Lobatto abscissas의 예).
결론적으로, Fornberg의 방법은 분석 공식의 결과보다 약 3 배 정도 더 정확한 경우 경우에 상당히 정확한 것으로 보입니다 . 대부분의 응용 프로그램에 충분히 정확해야합니다. 더욱이 Fornberg는이 사실을 그의 방법에 명시 적으로 포함시키지 않는 것 같습니다 (적어도 두 Fornberg 논문에는 언급이 없습니다).
이 예에서 식 (4)을 간단하게 포함함으로써 다른 크기의 자릿수를 얻을 수있다. 이것은 매우 간단한 접근 방식이며 각 파생 상품에 대해 한 번만 적용되므로 사용하지 않을 이유가 없습니다.
반올림 오차를 줄이기 위해 식 (1)의 합계를 평가하기 위해보다 정교한 접근 방식을 사용하는 Baltensperger 논문의 방법은 오차와 거의 동일한 크기를 산출합니다. 따라서이 예에서는 위의 "Adjusted Fornberg"방법과 거의 같습니다.
연속 함수의 숫자 구현을 차별화하려고한다고 가정하면 많은 방법이 있습니다.
1) 자동 분화. 가장 정확하고 일반적인 방법입니다. 코드가 고통스럽기 때문에 연산자 오버로드와 인수 의존 조회가 필요합니다. 이러한 개념을 이해하기 위해 사용자에게 부담을줍니다. 또한 에서 sinc를 차별화하는 것과 같은 제거 가능한 특이점으로 어려움을 겪습니다 .
2) 체비 쇼프 변환. 함수를 체비 쇼프 다항식 범위에 투영하고 세 항의 재발을 구별하십시오. 매우 빠르고 정확합니다. 그러나 귀하는 관심 분야가 간결하게 지원되어야합니다. 선택된 도메인 외부에서 , 3 개의 용어 재발이 불안정하다.
3) 유한 차분. 1D로 과소 평가됨; 수치 계산에 관한 Nick Higham의 팁과 요령을 참조하십시오 . 잘림 오류와 반올림 오류의 균형을 맞추면 단계별 크기를 선택할 필요가 없습니다. 자동으로 선택할 수 있습니다. Boost 에서이 아이디어는 유형에 대한 올바른 자릿수의 6/7을 기본적으로 복구하는 데 사용됩니다. (Higham은 정확한 자릿수 1/2의 간단한 경우에 대한 아이디어 만 보여 주지만 아이디어는 쉽게 확장됩니다.) 계수는 Fornberg의 등거리 테이블에서 얻은 것이지만 함수가 1ULP로 평가 될 수 있다는 가정하에 단계 화가 선택됩니다. 정확성. 단점은 유형의 자릿수 절반을 복구하기 위해 2 개의 함수 평가가 필요하고, 자릿수는 3/4를 복구하기 위해 4가된다는 것입니다. 1D에서는 나쁜 거래가 아닙니다. 더 높은 차원에서는 치명적입니다.
4) 복소수 단계 미분. 사용 . 가지고 단위 반올림을 할이 능력은 거의 모든 올바른 비트 복구합니다. 그러나 실제 파생물을 직접 코딩하는 것보다 복잡한 평면에서 함수를 구현하는 것이 일반적으로 어렵 기 때문에 다소 부정적입니다. 여전히 멋진 아이디어이며 특정 상황에서 유용합니다.
나는 Fornberg의 알고리즘을 개선 한 사람을 알지 못합니다 (그의 최신 논문 참조 ). 옆으로, 수치 미분을 계산하는 방법으로 그의 알고리즘을 보는 것이 옳지 않은 것 같습니다. 그가 한 일은 유한 차분 법에 대한 가중치 를 계산하는 효율적인 알고리즘을 도출하는 것입니다 . 그의 방법의 장점은 한 번에 원하는 파생물까지 모든 파생물에 대한 가중치를 제공한다는 것입니다.
Fornberg 방법의 확장에 대한 다른 답변 외에도 여기에 더 간단한 대안에 대한 질문을 드리겠습니다.
이를 위해 Lagrangian 보간법의 미분 계수를 더 직접 생성하는 대체 체계를 스케치합니다. 구현에는 몇 줄의 코드 만 필요하고 임의의 그리드에서 작동하며 첫 번째 실험에 따르면 Fornberg만큼 정확합니다.
구현의 기초는 허수 미분
여기서 기계 정밀 순서의 변수입니다. 허수 단계 미분은 미분 값을 안정적으로 생성하는 것으로 알려져 있으며 으로 유한 차분 구현의 수치 적 불안정성을 겪지 않습니다 .
두 번째 성분은 격자 의 라그랑주 보간 다항식 입니다. 중심 한 형태 중 하나로 평가됩니다. 예 :
여기서
복소수 미분을 사용하려면 이러한 수식이 복소수에 대해서도 작동해야합니다. 인수 . 또한 주어진 함수 f (x) 및 계수 벡터 에 대해 를
통한 보간 다항식을 나타냅니다
알고리즘은 다음과 같습니다. Fornberg와 동일한 입력 및 출력 매개 변수를 갖지만 훨씬 더 쉬운 것은 아닙니다.
입력:
초기화
연산
반면 :
계산
복잡한 단계 유도체 의해 위한 모든 와 .
여기서 는 의 번째 행을 나타냅니다 .
o = o + 1로 설정;
무엇을 출력 할지 결정하십시오 .
벡터 점에서 유한 차이 계수 , . 이것이 Fornberg가하는 일입니다.
보간 함수 을 미분 주문 . 이를 위해 함수 resp를 입력해야합니다. 에서 함수 값 를 알고리즘에 적용합니다.
변형 2의 보간 함수를 반환 하는 메타 함수 . 그러나 그리드 포인트에서 보간 할 임의의 함수 대해.
개인적으로 변형 3이 가장 좋습니다.
Fornberg의 경우이 알고리즘은 입니다. 시간을 찾으면 정확성, 안정성 등과 관련하여 더 경험적인 결과를 게시 할 것입니다.
수치 미분의 정밀도를 높이려면 다음을 수행하십시오.
1) 단계 크기 h 에 따라 선호하는 고정밀 "표준"방법을 선택하십시오 .
2) 다르지만 합리적인 단계 크기 h로 여러 번 1)에서 선택한 방법으로 미분 값을 계산합니다 . 매번 h 를 구간 (0.5 * H / 10, 1.5 * H / 10)에서 난수로 선택할 수 있습니다. 여기서 H는 사용하는 방법에 적합한 단계 크기입니다.
3) 결과 평균.
결과는 절대 오차 wrt에서 2-3 배의 크기를 얻을 수 있습니다. 평균화되지 않은 결과.