Dibujar pendientes en isoclinas en TikZ

Dibujar pendientes en isoclinas en TikZ

Necesito dibujar isoclinas para una EDO ( $y' = x^2 - y^2$en mi ejemplo). Yo uso el código deesta pregunta(con pequeños cambios) y funciona bastante bien, pero me encontré con tres problemas.

  1. No puedo dibujar pendientes en las isoclinas verdes (funciones g5(x)y g6(x)en el código) porque xla variable no está definida cuando -1 < x < 1. ¿Es posible \foreach"saltar" un intervalo (0,1)? Intenté usar algo como esto: \ifnum \xmin+\i*\hx < -1 draw...pero \ifnumsolo funciona con números enteros. También intenté usarlo \breakforeachpero no funcionó.
  2. ¿Es posible poner los centros de las pendientes en isoclinas? Sea (x0,y0)el extremo izquierdo de la pendiente y (x1,y1)el extremo derecho de la pendiente. Supongo que el centro de cada pendiente estaría en la isoclina correspondiente si hago una traslación x0 -> x0 - abs(x0 - (x0+x1)/2), y0 -> y0 - abs(y0 - (y0+y1)/2). Pero no sé cómo escribirlo en código LaTeX cuando hay atan2para el extremo derecho de la pendiente.
  3. Hay un pequeño hueco en la curva verde izquierda. No existe tal brecha en la curva verde derecha.

MWE

\documentclass[border=5mm,tikz]{standalone}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}
[declare function=
{f(\x,\y)=\x*\x-\y*\y;
g1(\x)=\x;
g2(\x)=-\x;
g3(\x)=sqrt(\x*\x+1);
g4(\x)=-sqrt(\x*\x+1);
g5(\x)=sqrt((\x*\x)-1);
g6(\x)=-sqrt((\x*\x)-1);
},
scale=2.5]


\def\xmax{2.0} \def\xmin{-2.0}
\def\ymax{2.0} \def\ymin{-2.0}
\def\nx{15}  \def\ny{15}

\draw[red] plot[domain=\xmin-0.1:\xmax+0.1] (\x,{g1(\x)});
\draw[red] plot[domain=\xmin-0.1:\xmax+0.1] (\x,{g2(\x)});
\draw[red] plot[samples=100, smooth,domain=\xmin-0.1:\xmax+0.1] (\x,{g3(\x)});
\draw[red] plot[samples=100, smooth,domain=\xmin-0.1:\xmax+0.1] (\x,{g4(\x)});
\draw[green] plot[samples=1000, smooth,domain=\xmin-0.1:-1.0] (\x,{g5(\x)});
\draw[green] plot[samples=100, smooth,domain=1:\xmax+0.1]  (\x,{g5(\x)});
\draw[green] plot[samples=1000, smooth,domain=\xmin-0.1:-1.0] (\x,{g6(\x)});
\draw[green] plot[samples=100, smooth,domain=1:\xmax+0.1]  (\x,{g6(\x)});

\pgfmathsetmacro{\hx}{(\xmax-\xmin)/\nx}
\pgfmathsetmacro{\hy}{(\ymax-\ymin)/\ny}
\foreach \i in {0,...,\nx}
\foreach \j in {0,...,\ny}{
    \draw[blue,-] 
    ({\xmin+\i*\hx},{g1(\xmin+\i*\hx)}) -- ++ ({atan2(0,1)}:0.15);
    \draw[blue,-] 
    ({\xmin+\i*\hx},{g2(\xmin+\i*\hx)}) -- ++ ({atan2(0,1)}:0.15);
    \draw[blue,-] 
    ({\xmin+\i*\hx},{g3(\xmin+\i*\hx)}) -- ++ ({atan2(-1,1)}:0.15);
    \draw[blue,-] 
    ({\xmin+\i*\hx},{g4(\xmin+\i*\hx)}) -- ++ ({atan2(-1,1)}:0.15);
}

\draw[-latex] (\xmin-.1,0)--(\xmax+.1,0) node[below right] {$x$};
\draw[-latex] (0,\ymin-.1)--(0,\ymax+.1) node[above left] {$y$};
\end{tikzpicture}
\end{document}

isoclinas

Respuesta1

Las curvas verdes emergen de las rojas por rotación. Lo siguiente se puede simplificar aún más, pero en mi humilde opinión, su pregunta no está escrita con mucha claridad. Se pueden poner cosas en medio de un camino con la midwayllave.

\documentclass[border=5mm,tikz]{standalone}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}
[declare function=
{f(\x,\y)=\x*\x-\y*\y;
g1(\x)=\x;
g2(\x)=-\x;
g3(\x)=sqrt(\x*\x+1);
g4(\x)=-sqrt(\x*\x+1);
},
scale=2.5]


\def\xmax{2.0} \def\xmin{-2.0}
\def\ymax{2.0} \def\ymin{-2.0}
\def\nx{15}  \def\ny{15}
\begin{scope}[red]
\draw plot[domain=\xmin-0.1:\xmax+0.1] (\x,{g1(\x)});
\draw plot[domain=\xmin-0.1:\xmax+0.1] (\x,{g2(\x)});
\draw plot[samples=100, smooth,domain=\xmin-0.1:\xmax+0.1] (\x,{g3(\x)});
\draw plot[samples=100, smooth,domain=\xmin-0.1:\xmax+0.1] (\x,{g4(\x)});
\end{scope}
\begin{scope}[green,rotate=90]
\draw plot[samples=100, smooth,domain=\xmin-0.1:\xmax+0.1] (\x,{g3(\x)});
\draw plot[samples=100, smooth,domain=\xmin-0.1:\xmax+0.1] (\x,{g4(\x)});
\end{scope}

\pgfmathsetmacro{\hx}{(\xmax-\xmin)/\nx}
\pgfmathsetmacro{\hy}{(\ymax-\ymin)/\ny}
\foreach \i in {0,...,\nx}
\foreach \j in {0,...,\ny}{
    \draw[blue,-] 
    ({\xmin+\i*\hx},{g1(\xmin+\i*\hx)}) -- ++ ({atan2(0,1)}:0.15)
    node[midway,sloped]{$\times$};
    \draw[blue,-] 
    ({\xmin+\i*\hx},{g2(\xmin+\i*\hx)}) -- ++ ({atan2(0,1)}:0.15)
    node[midway,sloped]{$\times$};
    \draw[blue,-] 
    ({\xmin+\i*\hx},{g3(\xmin+\i*\hx)}) -- ++ ({atan2(-1,1)}:0.15)
    node[midway,sloped]{$\times$};
    \draw[blue,-] 
    ({\xmin+\i*\hx},{g4(\xmin+\i*\hx)}) -- ++ ({atan2(-1,1)}:0.15)
    node[midway,sloped]{$\times$};
}
\begin{scope}[rotate=90]
\foreach \i in {0,...,\nx}
\foreach \j in {0,...,\ny}{
    \draw[blue,-] 
    ({\xmin+\i*\hx},{g1(\xmin+\i*\hx)}) -- ++ ({atan2(0,1)}:0.15)
    node[midway,sloped]{$\times$};
    \draw[blue,-] 
    ({\xmin+\i*\hx},{g2(\xmin+\i*\hx)}) -- ++ ({atan2(0,1)}:0.15)
    node[midway,sloped]{$\times$};
    \draw[blue,-] 
    ({\xmin+\i*\hx},{g3(\xmin+\i*\hx)}) -- ++ ({atan2(-1,1)}:0.15)
    node[midway,sloped]{$\times$};
    \draw[blue,-] 
    ({\xmin+\i*\hx},{g4(\xmin+\i*\hx)}) -- ++ ({atan2(-1,1)}:0.15)
    node[midway,sloped]{$\times$};
}
\end{scope}
\draw[-latex] (\xmin-.1,0)--(\xmax+.1,0) node[below right] {$x$};
\draw[-latex] (0,\ymin-.1)--(0,\ymax+.1) node[above left] {$y$};
\end{tikzpicture}
\end{document}

ingrese la descripción de la imagen aquí

Respuesta2

Con la ayuda de @user121799, conseguí lo que quería. Basta cambiar ({\xmin+\i*\hx},{g1(\xmin+\i*\hx)}) -- ++ ({atan2(0,1)}:0.15)con ({atan2(0,1)}:-0.075) ++ ({\xmin+\i*\hx},{g1(\xmin+\i*\hx)}) -- ++ ({atan2(0,1)}:0.15)colocar los centros de las pendientes sobre las isoclinas. Quizás a alguien le resulte útil.

ingrese la descripción de la imagen aquí

\documentclass[border=5mm,tikz]{standalone}
\usetikzlibrary{calc}
\begin{document}
    \begin{tikzpicture}
    [declare function=
    {f(\x,\y)=\x*\x-\y*\y;
        g1(\x)=\x;
        g2(\x)=-\x;
        g3(\x)=sqrt(\x*\x+1);
        g4(\x)=-sqrt(\x*\x+1);
    },
    scale=2.5]


    \def\xmax{2.0} \def\xmin{-2.0}
    \def\ymax{2.0} \def\ymin{-2.0}
    \def\nx{15}  \def\ny{15}
    \begin{scope}[red]
    \draw plot[domain=\xmin-0.3:\xmax+0.3] (\x,{g1(\x)});
    \draw plot[domain=\xmin-0.3:\xmax+0.3] (\x,{g2(\x)});
    \draw plot[samples=100, smooth,domain=\xmin-0.1:\xmax+0.1] (\x,{g3(\x)});
    \draw plot[samples=100, smooth,domain=\xmin-0.1:\xmax+0.1] (\x,{g4(\x)});
    \end{scope}
    \begin{scope}[red,rotate=90]
    \draw plot[samples=100, smooth,domain=\xmin-0.1:\xmax+0.1] (\x,{g3(\x)});
    \draw plot[samples=100, smooth,domain=\xmin-0.1:\xmax+0.1] (\x,{g4(\x)});
    \end{scope}

    \pgfmathsetmacro{\hx}{(\xmax-\xmin)/\nx}
    \pgfmathsetmacro{\hy}{(\ymax-\ymin)/\ny}
    \foreach \i in {0,...,\nx}
    \foreach \j in {0,...,\ny}{
        \draw[blue,-] 
        ({atan2(0,1)}:-0.075) ++ ({\xmin+\i*\hx},{g1(\xmin+\i*\hx)}) -- ++ ({atan2(0,1)}:0.15);
        \draw[blue,-] 
        ({atan2(0,1)}:-0.075) ++ ({\xmin+\i*\hx},{g2(\xmin+\i*\hx)}) -- ++ ({atan2(0,1)}:0.15);
        \draw[blue,-] 
        ({atan2(-1,1)}:-0.075) ++ ({\xmin+\i*\hx},{g3(\xmin+\i*\hx)}) -- ++ ({atan2(-1,1)}:0.15);
        \draw[blue,-] 
        ({atan2(-1,1)}:-0.075) ++ ({\xmin+\i*\hx},{g4(\xmin+\i*\hx)}) -- ++ ({atan2(-1,1)}:0.15);
    }
    \begin{scope}[rotate=90]
    \foreach \i in {0,...,\nx}
    \foreach \j in {0,...,\ny}{
        \draw[blue,-] 
        ({atan2(-1,1)}:-0.075) ++ ({\xmin+\i*\hx},{g3(\xmin+\i*\hx)}) -- ++ ({atan2(-1,1)}:0.15);
        \draw[blue,-] 
        ({atan2(-1,1)}:-0.075) ++ ({\xmin+\i*\hx},{g4(\xmin+\i*\hx)}) -- ++ ({atan2(-1,1)}:0.15);
    }
    \end{scope}


    \draw[-latex] (\xmin-.1,0)--(\xmax+.1,0) node[below right] {$x$};
    \draw[-latex] (0,\ymin-.1)--(0,\ymax+.1) node[above left] {$y$};
    \end{tikzpicture}
\end{document}

información relacionada