2012-02-29 8 views
4

내가하려고하는 것이 의미가 있는지 확실하지 않습니다. 저는 mathematica에서 몇 가지 코드를 프로토 타이핑하고 있습니다. 어느 날 C++로 작성하려고합니다. 내가 (MS VC++ 컴파일러를 사용함에 따라) 배정도로만 계산할 수있는 환경.mathematica에서 의미있는 오류 플롯을 만드는 법?

나는 함수 f를 근사화하는 다항식을 가지고 있으며, 나는 에러 곡선을 그리기를 원한다. 다항식의 계수는 정밀도를 계산하기 위해 계산되었습니다 (C++의 경우와 같음). 그러나 상대 오차를 플롯하면 수치 잡음의 음모를 얻을 수 있습니다. 다항식은 테일러 다항식이므로 오차는 매끄러운 곡선이 될 것으로 기대합니다. 어떻게하면 더 합리적인 줄거리를 얻을 수 있습니까? 아래의 코드는 Cos 함수를 테스트 케이스로 사용하여 수행하려는 작업을 보여줍니다. 음모의 결과는 수치적인 잡음뿐입니다.

f[x_] = Cos[x] 
a[k_] := N[(-1)^k/(2*k)!] 
approx[x_] := Sum[a[k]*x^(2*k), {k, 0, 12}] 
Plot[approx[x]/f[x] - 1, {x, -Pi, Pi}, WorkingPrecision -> 30] 

나는 계수 a[k]이 계산되는 정밀도를 높일 수 있습니다.

a[k_] := N[(-1)^k/(2*k)!,30] 

더 현명한 플롯을 얻기 위해서이지만 이것은 프로토 타입 코드의 목적에 어긋납니다. 왜냐하면 결국 C++로 작성한 근사값의 오류 플롯을 그래프로 나타 내기 때문입니다. 그리고 그 환경에서 계수는 배정도로만 계산됩니다.

나는이 테스트가 의미가 있다고 생각합니까 ?? 내 approximation 기계 정밀도에 대한 정확한 것으로 기대하지만 오류 곡선을 그릴 수 있습니까?

읽어 주셔서 감사합니다. Pi/2 또는 -Pi/2 중 하나를 포함하는 범위 approx[x]/Cos[x] - 1 계획을 세우고 모든

답변

6

먼저 만 Cos[x] 그 지점에서 0이 같은 문제를 일으킬 것입니다. 이 시점에서 approx은 거의 0이지만 정확하지는 않습니다. 또한 Cos[x]은 나누기 전에 숫자 0으로 변환되기 전에 대수적으로 0으로 평가되므로 해당 지점에서 스파이크가 표시됩니다. 좀 더 분별있는 지역에 걸쳐 플롯 할 때

둘째,

Plot[approx[x]/f[x] - 1, {x, 0, 0.5}, WorkingPrecision -> 30, PlotRange -> All] 

나는 기계 정밀도 근처에서 작동 할 때 내가 예상 정확히 무엇

enter image description here

를 얻을. 각 스파이크는 대략 단일 비트와 같습니다.

마지막으로 원하는 전체 도메인에서 좋은 근사값을 원하면 확장 지점 주변의 테일러 확장을 사용하지 않을 것입니다. 대신 Chebyshev polynomials을 사용하여 min-max approximation을 보았습니다. 나는 각 시리즈와 Cos 사이의 절대 차를 세우고있어 경우 예를 들어, 14 개 조항에 밖으로 체비 쇼프 시리즈와 테일러 시리즈를 복용

enter image description here

을 제공합니다. 왼쪽 그림에서 볼 수 있듯이 Chebyshev 시리즈는 Taylor 시리즈보다 훨씬 전반적으로 성능이 뛰어납니다.