
При построении графика из моегопоследний вопросЯ обнаружил, что графики, которые я получаю от 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}
В качестве альтернативы, с pgfplots
v1.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
самому автору, за то, что он указал мне на этот новый метод в комментарии.