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]
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
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.
Wygląda mi to na proste aliasing. Czy naprawdę wierzysz, że Mathematica miałaby błąd w czymś tak zasadniczym? –
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
@houbysoft Nie mam Mathematica, w zasadzie nic o tym nie wiem, ale proponuję spróbować różnych wartości opcji PlotPoints –