Como o PGFplots calcula funções trigonométricas?

Como o PGFplots calcula funções trigonométricas?

Ao traçar o gráfico do meuultima questãoDescobri que os gráficos que recebo do PGFplots não estão totalmente corretos. Eu estava tentando traçar (4.9/(w^2))*(cosh(w*x)-cos(w*x))vários valores de w. Com a ajuda dos usuários 1010011010 e Enthusiastic Student, consegui obter gráficos bonitos - isso até verificar o que deveria obter com o WolframAlpha.

Como wna minha fórmula acima vai para 0, a função deve ser assíntota 4.9*x^2de cima. Não é isso que os dados mostram. Usando este código, que é essencialmente apenas 1010011010 no link acima,

\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}

Eu recebo os seguintes gráficos. insira a descrição da imagem aqui Aqui está o gráfico vermelho (4.9)*x^2.

Para referência, aqui está o que o WolframAlpha me fornece para os valores mais altos e mais baixos wplotados acima ( w=0.05e w=1) e o gráfico de (4.9)*x^2: insira a descrição da imagem aqui

É difícil dizer, mas se eu remover o 4.9*x^2enredo você pode ver que o enredo w=0.05segue exatamente isso.

Este é um comportamento muito diferente da primeira imagem acima. Então, minha pergunta é como o PGFplots calcula coisas como exp,, coshe cos, e como posso obter uma melhor aproximação no futuro?

Responder1

As funções trigonométricas pgfassumem entradas em graus. Para inserir um ângulo em radianos, use o roperador especial: substitua cos(\w*x/100)por 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}

Alternativamente, com pgfplotsv1.11 ou mais recente, uma nova chave trig format plotsnos permite alterar o formato do ângulo para todos \addplotos comandos no escopo da configuração de chave 1 . Aqui, uso trig format plots=radno nível superior para alterar o comportamento de todo o documento, mas também pode ser aplicado por eixo ou por plotagem. Observe que isso afetará apenas os comandos pgfplots' \addplot, e não qualquer Ti simpleskCódigo Z com funções trigonométricas. Além disso, esta chave é um tanto experimental e pode não funcionar corretamente com tipos de eixo mais exóticos, como polare smithchart. O manual do pacote menciona que ele foi testado apenas para eixos padrão.

\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}

Ambos os métodos fornecem o resultado correto:

insira a descrição da imagem aqui

1 Graças aChristian Feuersänger, o pgfplotspróprio autor, por me apontar esse novo método em um comentário.

informação relacionada