Enredo TikZ lidando com infinitos

Enredo TikZ lidando com infinitos

Tenho alguns problemas ao desenhar uma imagem com o TikZ. A imagem que gostaria de obter é a seguinte:

Este.

Aqui está o meu código:

\documentclass[10pt]{article}
\usepackage{pgf,tikz}
\usetikzlibrary{positioning,patterns}
\pagestyle{empty}
\begin{document}
\begin{tikzpicture}[scale=2]
\clip(0,0) rectangle (6,6);
\draw[thick] (3.,3.) circle ({pi/2});
\pgfmathsetmacro{\x}{1};
\draw[thick,pattern=north west lines, pattern color=black] (3.,3.) circle ({rad(atan(\x))});
\begin{scope}[shift={(3,3)}]
\foreach \z in {0.5,1,2,3}
\draw [variable=\y,domain=-\z+0.001:\z-0.001] plot ({deg(\y)+90}:{rad(atan( (\x*(1-(cosh(\x*\y)/cosh(\x*\z))^2)^(-0.5)))});
\end{scope}
\end{tikzpicture}
\end{document}

O que eu obtenho é

insira a descrição da imagem aqui

Eu tenho dois problemas:

  • Tenho infinitos em meu cálculo. Isso causou todos os tipos de problemas, então restringi o domínio no gráfico para não incluir o ponto singular (que então é mapeado para um valor finito pela função arctan). Porém, desta forma não consigo chegar ao valor adequado e os gráficos não tocam o círculo externo.
  • As linhas do enredo não são suaves.

Todas as ideias sobre como resolver isso?

Responder1

Demora um pouco para compilar, mas parece que chega perto. Usei pgfplots para lidar com problemas de plotagem e infinito, etc. Ele já fornece um polaraxisambiente, portanto não há necessidade de trabalho extra. Você também pode invocar uma diretiva gnuplot para obter mais precisão. Eu recomendaria fortemente alterar o mapa de cores. Até o Matlab finalmente parou de usá-lo em 2014b.

\documentclass{standalone}
\usepackage{pgfplots}
\usetikzlibrary{patterns,pgfplots.polar}
\begin{document}
\begin{tikzpicture}
\begin{polaraxis}[samples=200,grid=none,enlargelimits=false,
                  xtick=\empty,ytick=\empty,axis y line={none}]
 \pgfmathsetmacro{\x}{1};
 \pgfplotsinvokeforeach{0.15,0.3,...,3,pi}{
 \addplot[mesh,domain=-#1+1e-3:#1-1e-3,variable=\y,
          point meta=12-\plotnumofactualtype, % For color match
          point meta max=30] 
         ({deg(\y)+90},{rad(atan( (\x*(1-(cosh(\x*\y)/cosh(\x*#1))^2)^(-0.5)))});}
\end{polaraxis}
\end{tikzpicture}
\end{document}

insira a descrição da imagem aqui

Responder2

Esta é uma lição de trapaça (você pode ver meus comentários), não uma solução real.

\documentclass[varwidth,border=50]{standalone}
\usepackage{tikz}
\usetikzlibrary{positioning,patterns}

\begin{document}
  \begin{tikzpicture}[scale=2]
    \clip (3.,3.) circle ({pi/2 - .05});
    \pgfmathsetmacro{\x}{1};
    \draw[thick,pattern=north west lines, pattern color=black] (3.,3.) circle ({rad(atan(\x))});
    \begin{scope}[shift={(3,3)}]
      \foreach[evaluate=\z as \c using .3*\z] \z in {.1,.3,...,3,3.14} {
        \definecolor{currentcolor}{hsb}{\c,1,1}
        \draw [variable=\y,domain=-\z+0.001:\z-0.001, smooth, samples=100, currentcolor] 
        plot ({deg(\y)+90}:{rad(atan( (\x*(1-(cosh(\x*\y)/cosh(\x*\z))^2)^(-0.5)))});
      }
    \end{scope}
    \draw[very thick] (3.,3.) circle ({pi/2 - .059});
  \end{tikzpicture}
\end{document}

insira a descrição da imagem aqui

EDITAR:E aqui está uma solução real atan2para evitar problemas de infinito.

\documentclass[varwidth,border=50]{standalone}
\usepackage{tikz}
\usetikzlibrary{patterns}

\begin{document}
  \begin{tikzpicture}[scale=2]
    \draw[thick,pattern=north west lines, pattern color=black] circle (pi/4);
    \foreach[
      evaluate=\z as \c using \z/180,
      evaluate=\z as \chz using cosh(rad(\z))]
      \z in {10, 20, ..., 180} {
        \definecolor{currentcolor}{hsb}{\c,1,1}
        \draw [variable=\y,domain=-\z:\z, smooth, samples=100, currentcolor]
            plot({\y + 90} : {rad(atan2(\chz, sqrt((\chz)^2 - (cosh(rad(\y)))^2)))});
      }
    \draw[very thick] circle (pi/2);
  \end{tikzpicture}
\end{document}

insira a descrição da imagem aqui

informação relacionada