Как PGFplots вычисляет тригонометрические функции?

Как PGFplots вычисляет тригонометрические функции?

При построении графика из моегопоследний вопросЯ обнаружил, что графики, которые я получаю от PGFplots, не совсем корректны. Я пытался построить график (4.9/(w^2))*(cosh(w*x)-cos(w*x))для нескольких значений w. С помощью пользователей 1010011010 и Enthusiastic Student мне удалось получить хорошо выглядящие графики — до тех пор, пока я не проверил, что я должен получать с помощью WolframAlpha.

Так как wв моей формуле выше идет к 0, функция должна асимптотировать к 4.9*x^2сверху. Это не то, что показывают данные. Используя этот код, который по сути является просто 1010011010 в ссылке выше,

\documentclass{standalone}
\usepackage{pgfplots}
\def\mycolone{yellow}
\def\mycoltwo{green}
\pgfplotsset{every axis legend/.append style={at={(.5,-.2)}, anchor=north}} 
\begin{document}
\begin{tikzpicture} 
\begin{axis}[xmin=-10,xmax=10,ymin=-0.5,ymax=100,no markers, grid=both, samples=100, restrict y to domain=0:1000]
\foreach \w in {5,10,...,100} {\edef\tmp{\noexpand\addplot[\mycolone!\w!\mycoltwo, domain=-10:10]}
\pgfmathparse{\w/100}
\edef\x{\pgfmathresult}
\tmp{(4.9/((\w/100)^2))*(cosh(\w*x/100)-cos(\w*x/100))};
\edef\legendentry{\noexpand\addlegendentry{$\omega = \noexpand\pgfmathprintnumber[fixed,fixed zerofill, precision=2]{\x}$}};
\legendentry}
\addplot[draw=red, domain=-10:10] {4.9*x^2};
\end{axis}
\end{tikzpicture}
\end{document}

Я получаю следующие графики. введите описание изображения здесь Здесь красный график (4.9)*x^2.

Для справки, вот что WolframAlpha выдает мне для самых высоких и самых низких значений, изображенных wна графиках выше ( w=0.05и w=1), а также график (4.9)*x^2: введите описание изображения здесь

Трудно сказать, но если я уберу сюжет, 4.9*x^2вы увидите, что сюжет w=0.05практически полностью ему следует.

Это очень отличается от поведения на первом изображении выше. Поэтому мой вопрос в том, как PGFplots вычисляет такие вещи, как exp, cosh, и cos, и как я могу получить лучшее приближение в будущем?

решение1

Тригонометрические функции предполагают pgfввод в градусах. Чтобы ввести угол в радианах, используйте специальный rоператор: замените cos(\w*x/100)на cos(\w*x/100 r).

\documentclass{standalone}
\usepackage{pgfplots}
\def\mycolone{yellow}
\def\mycoltwo{green}
\pgfplotsset{compat=1.12,every axis legend/.append style={at={(.5,-.2)}, anchor=north}} 
\begin{document}
\begin{tikzpicture} 
\begin{axis}[xmin=-10,xmax=10,ymin=-0.5,ymax=100,no markers, grid=both, samples=100, restrict y to domain=0:1000]
\foreach \w in {5,10,...,100} {\edef\tmp{\noexpand\addplot[\mycolone!\w!\mycoltwo, domain=-10:10]}
\pgfmathparse{\w/100}
\edef\x{\pgfmathresult}
\tmp{(4.9/((\w/100)^2))*(cosh(\w*x/100)-cos(\w*x/100 r))};
\edef\legendentry{\noexpand\addlegendentry{$\omega = \noexpand\pgfmathprintnumber[fixed,fixed zerofill, precision=2]{\x}$}};
\legendentry}
\addplot[draw=red, domain=-10:10] {4.9*x^2};
\end{axis}
\end{tikzpicture}
\end{document}

В качестве альтернативы, с pgfplotsv1.11 или новее, новый ключ trig format plotsпозволяет нам изменить формат угла для всех \addplotкоманд в области действия настройки ключа 1 . Здесь я использую trig format plots=radна верхнем уровне, чтобы изменить поведение для всего документа, но это также может быть применено к каждой оси или к каждому участку. Обратите внимание, что это повлияет только на команды pgfplots' \addplot, а не на любые простые TiкZ-код с функциями тригонометрии. Кроме того, эта клавиша является экспериментальной и может работать некорректно с более экзотическими типами осей, такими как polarи smithchart. В руководстве по пакету упоминается, что она была протестирована только для осей по умолчанию.

\documentclass{standalone}
\usepackage{pgfplots}
\def\mycolone{yellow}
\def\mycoltwo{green}
\pgfplotsset{
  compat=1.12,
  every axis legend/.append style={at={(.5,-.2)}, anchor=north},
  trig format plots=rad,
} 
\begin{document}
\begin{tikzpicture} 
\begin{axis}[xmin=-10,xmax=10,ymin=-0.5,ymax=100,no markers, grid=both, samples=100, restrict y to domain=0:1000]
\foreach \w in {5,10,...,100} {\edef\tmp{\noexpand\addplot[\mycolone!\w!\mycoltwo, domain=-10:10]}
\pgfmathparse{\w/100}
\edef\x{\pgfmathresult}
\tmp{(4.9/((\w/100)^2))*(cosh(\w*x/100)-cos(\w*x/100))};
\edef\legendentry{\noexpand\addlegendentry{$\omega = \noexpand\pgfmathprintnumber[fixed,fixed zerofill, precision=2]{\x}$}};
\legendentry}
\addplot[draw=red, domain=-10:10] {4.9*x^2};
\end{axis}
\end{tikzpicture}
\end{document}

Оба метода дают правильный результат:

введите описание изображения здесь

1 СпасибоКристиан Фойерзенгер, pgfplotsсамому автору, за то, что он указал мне на этот новый метод в комментарии.

Связанный контент