
Estou tentando recriar a seguinte imagem:
Infelizmente, isso foi desenhado em Python, então não posso usá-lo. Então pensei que deveria recriá-lo com o Tikz.
Minha tentativa de criar a imagem esquerda:
\usetikzlibrary{arrows}
\usetikzlibrary{decorations.markings}
\begin{tikzpicture}
\coordinate (Origin) at (0,0);
\coordinate (OLSEstimates) at (2,8);
\coordinate (Intersect) at (2.55,4.3);
%0.5 scaled
\draw[rotate=45] (OLSEstimates) ellipse (1.275 and 3);
%0.75 scaled
\draw[rotate=45] (OLSEstimates) ellipse (1.9125 and 4.5);
%original boundary
\draw[rotate=45] (OLSEstimates) ellipse (2.56 and 6);
\draw [<->,thick] (0,10) node (yaxis) [above] {$y$}
|- (10,0) node (xaxis) [right] {$x$};
\draw (0,0) circle (5);
%draw line to intersection
\draw[draw=black,-triangle 90] (Origin) -- (Intersect);
\end{tikzpicture}
O problema agora é que, embora pareça que meu círculo está atingindo a elipse, isso foi feito de maneira dolorosa, ajustando manualmente as coordenadas (então provavelmente está errado). Segundo, a intersecção do ponto entre a elipse e o círculo também foi feita com o mesmo método, então provavelmente está um pouco errada.
Agora eu vi uma coisa maluca, que o Tikz conseguia calcular as coordenadas das interseções de duas retas, então fiquei pensando se algum tipo de técnica poderia ser aplicada aqui.
Uma pequena observação: seria perfeito se pudesse dimensionar automaticamente a elipse para o "tamanho" correto para intersectá-la exatamente em um ponto, mas acho que isso é impossível (nunca vi alguém fazer isso).
Obrigado!
Responder1
Modificado o código para colocar as elipses concêntricas e o ponto. A mesma ideia de ancorar as elipses ao nó quadrado também é possível.
A orientação das elipses pode ser alterada ancorando-as em relação ao nó de origem (mas não entendi essa parte) para o qual acho que a equação da crista deveria apontar.
\documentclass[tikz]{standalone}
\usetikzlibrary{shapes.geometric,calc}
\begin{document}
\begin{tikzpicture}[>=latex]
\clip (-1,-1) rectangle (6,6);
\draw[->,thick] (-1,0) --++(6,0);
\draw[->,thick] (0,-1) --++(0,6);
% Given
\def\myradius{2.5cm} % CHANGE THESE
\def\mypoint{(3,2)}
% computed
\node[circle,draw,minimum height=2*\myradius] (o) at (0,0) {};
% here we take the point and compute the distance to the circle node
% and also the angle of the point wrt to origin. Then we rotate ellipses and adjust the size
\path let \p1=\mypoint,\n1 = {veclen(\x1,\y1)-\myradius},\n2={atan2(\y1,\x1)} in
\foreach \x in {1,0.75,0.5}{
node[ellipse,draw,
minimum height=2*\n1*\x,
minimum width=3.5*\n1*\x,
rotate=\n2-90] (a) at \mypoint {}
};
\draw[->] (o.center) -- (a.center)
node[above,inner sep=1pt,rounded corners,fill=white,draw] {$\theta_{\text{Normal Equation}}$};
\draw[->] (o.center) -- (o.80)
node[above,inner sep=1pt,rounded corners,fill=white,draw] {$\theta_{\text{RidgeEquation}}$};
\end{tikzpicture}
\end{document}
Responder2
Você pode tentar algo assim, mas deve haver métodos mais eficientes por aí:
\usetikzlibrary{intersections,calc}
\usetikzlibrary{arrows}
\usetikzlibrary{decorations.markings}
\begin{tikzpicture}
\draw [<->,thick] (0,10) node (yaxis) [above] {$y$}
|- (10,0) node (xaxis) [right] {$x$};
\coordinate (Origin) at (0,0);
\coordinate (OLSEstimates) at (2,8);
\coordinate (Intersect) at (0,5.1); % Initial guess, must be inside the ellipse
%original boundary
\draw[rotate=45, name path=ellipse] (OLSEstimates) ellipse (2.56 and 6);
%scaled boundaries
\foreach \scale in {0.75,0.5} {
\draw[rotate=45] (OLSEstimates) ellipse (\scale*2.56 and \scale*6);
}
%Compute intersection point iteratively
\foreach \j in {1,...,3} {
\path[name path=circle-\j, overlay] let \p1 = ($(Origin)-(Intersect)$) in (Origin) circle ({veclen(\x1,\y1)});
\draw[name intersections={of=ellipse and circle-\j,by={a,b}, total=\t}] let \p1 = ($0.5*(a)+0.5*(b)$) in (\x1,\y1) coordinate (Intersect);
}
\draw let \p1 = ($(Origin)-(Intersect)$) in (Origin) circle ({veclen(\x1,\y1)});
%draw line to intersection
\draw[draw=black,-triangle 90] (Origin) -- (Intersect);
\end{tikzpicture}
Queremos encontrar um círculo tal que tenha apenas um ponto de intersecção com a elipse. Neste código, ele é calculado iterativamente tomando o centro dos dois pontos de interseção entre um círculo e a elipse e fazendo com que o próximo círculo cruze esse ponto.
O código funciona, mas é extremamente lento!
Quanto ao desenho das reticências, coloquei o \draw
comando em foreach
loop, é bem simples como vocês podem ver.