무한대를 다루는 TikZ 플롯

무한대를 다루는 TikZ 플롯

TikZ로 그림을 그리는데 몇 가지 문제가 있습니다. 제가 얻고 싶은 사진은 다음과 같습니다.

이 하나.

내 코드는 다음과 같습니다.

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

내가 얻는 것은

여기에 이미지 설명을 입력하세요

두 가지 문제가 있습니다.

  • 내 계산에는 무한대가 있습니다. 이로 인해 모든 종류의 문제가 발생했기 때문에 특이점(그런 다음 arctan 함수에 의해 유한 값으로 매핑됨)을 포함하지 않도록 플롯의 영역을 제한했습니다. 그러나 이런 방식으로는 적절한 값을 얻을 수 없으며 플롯이 외부 원에 닿지 않습니다.
  • 줄거리가 매끄럽지 않습니다.

이 문제를 해결하는 방법에 대한 아이디어가 있습니까?

답변1

컴파일하는 데 약간의 시간이 걸리지만 거의 비슷한 것 같습니다. 나는 pgfplots를 사용하여 플로팅 및 무한대 문제 등을 처리했습니다. 이미 polaraxis환경을 제공하므로 추가 작업을 수행할 필요가 없습니다. 더 높은 정밀도를 얻기 위해 gnuplot 지시문을 호출할 수도 있습니다. 그래도 색상 맵을 변경하는 것이 좋습니다. Matlab조차도 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}

여기에 이미지 설명을 입력하세요

답변2

이것은 실제 해결책이 아닌 부정행위 레슨(내 댓글을 볼 수 있음)입니다.

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

여기에 이미지 설명을 입력하세요

편집하다:atan2그리고 여기에 무한 문제를 피하기 위해 사용하는 실제 솔루션이 있습니다 .

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

여기에 이미지 설명을 입력하세요

관련 정보