2010-12-31 9 views
33

że wykreśla się losowo Sin [x] w funkcji Mathematicą 7 i to pokazuje:Strange Sin [x] Wykres na Mathematicą

http://i.stack.imgur.com/hizGw.png

Uwaga widoczny defekt w przybliżeniu x = -100.

Oto zoom części wad, wyraźnie pokazując, że Mathematica jakiegoś powodu używa znacznie niższą rozdzielczość pomiędzy tamtejszymi punktów:

mesh

ktoś wie dlaczego tak się dzieje i dlaczego tylko w x = -100?

Uwaga: samo dzieje się w Wolfram Alpha, przy okazji.

+0

Wygląda mi to na proste aliasing. Czy naprawdę wierzysz, że Mathematica miałaby błąd w czymś tak zasadniczym? –

+0

Nie, dlatego byłem tak zaskoczony. Jeśli byłaby to aliasing, czy nie miałaby tendencji do pojawiania się więcej, gdyby interwał się zwiększył? Jeśli zmienię xmin, xmax na -60 Pi/60 Pi, to na przykład zniknie. – houbysoft

+1

@houbysoft Nie mam Mathematica, w zasadzie nic o tym nie wiem, ale proponuję spróbować różnych wartości opcji PlotPoints –

Odpowiedz

60

Krótka odpowiedź: default kreślenia dokładność nie jest wystarczająca dla tej funkcji, więc zwiększać ją następująco

Plot[Sin[x], {x, -42 Pi, 42 Pi}, PlotPoints -> 100] 

Długa odpowiedź: Plot prace oceniające funkcję na skończonego zbioru punktów, a łączący te punkty proste linie. Widać punktów wykorzystywanych przez Plot pomocą następującego polecenia

Plot[Sin[x], {x, -42 Pi, 42 Pi}, Mesh -> All, PlotStyle -> None, 
MeshStyle -> Black] 

plot

Widać, że dla swojej funkcji, punkty, w których funkcja oceniano „brakowało szczyt” i wprowadził duży błąd aproksymacji. Algorytm używany do wybierania lokalizacji punktów jest bardzo prosty i taka sytuacja może się zdarzyć, gdy dwa piki są ściślejsze niż PlotRange/PlotPoints.

Plot rozpoczyna się od 50 równomiernie rozmieszczonych punktów, a następnie wstawia dodatkowe punkty w etapach do MaxRecursion. Możesz zobaczyć, jak ta "dziura" pojawia się, gdy narysujesz region dla różnych ustawień MaxRecursion.

plot1 = Plot[Sin[x], {x, -42 Pi, 42 Pi}, PlotPoints -> 100, 
    PlotStyle -> LightGray]; 
Table[plot2 = 
    Plot[Sin[x], {x, -42 Pi, 42 Pi}, Mesh -> All, MeshStyle -> Thick, 
    PlotStyle -> Red, MaxRecursion -> k]; 
    Show[plot1, plot2, PlotRange -> {{-110, -90}, {-1, 1}}, 
    PlotLabel -> ("MaxRecursion " <> ToString[k])], {k, 0, 
    5}] // GraphicsColumn 

plot

Według Mathematica książki Stana wagonu, Plot decyduje, czy dodać dodatkowe półmetek pomiędzy dwoma kolejnymi punktami, jeśli kąt między dwóch nowych odcinków będzie więcej niż 5 stopni . W tym przypadku fabuła osiągnęła pecha z początkowym pozycjonowaniem punktu, a podpodział nie spełnia tego kryterium. Widać, że wstawienie pojedynczego punktu oceny w środku otworu spowoduje prawie identycznie wyglądającą fabułę.

Sposobem na zwiększenie kąta używany do zdecydować, kiedy do podziału za pomocą Refinement opcji (mam go z książki, ale to nie wydaje się być udokumentowane w produkcie)

plot1 = Plot[Sin[x], {x, -42 Pi, 42 Pi}, PlotPoints -> 100, 
    PlotStyle -> LightGray]; 
Show[plot1, 
Plot[Sin[x], {x, -42 Pi, 42 Pi}, Mesh -> All, MeshStyle -> Thick, 
    PlotStyle -> Red, MaxRecursion -> 3, 
    Method -> {Refinement -> {ControlValue -> 4 \[Degree]}}], 
PlotRange -> {{-110, -90}, {-1, 1}}] 

Tutaj można zobacz, że zwiększenie go o 1 stopień od domyślnego 5 powoduje usunięcie dziury.

plot

+0

Ach, aktualizacja części odpowiedzi jest dokładnie tym, czego szukałem (znałem resztę, po zaimplementowaniu kalkulatora graficznego, który sam to zrobił, ale nie dodałem mechanizmu podobnego do MaxRecursion, co wyjaśnia nieprecyzyjność). – houbysoft