다항식의 근을 플로팅하기

다항식의 근을 플로팅하기

나는 복소 평면에 주어진 다항식의 근을 플롯하고 싶습니다.

예: $P(x)=x^4-x^3-1$가 주어졌다고 가정합니다. 나는 $Oxy$ 복소 평면에 이 다항식의 네 근을 모두 플롯하고 싶습니다.

이 경우 Tikz가 유용한 도구일 수 있다고 생각하지만 이 패키지에 대한 경험이 없습니다.

답변1

좀 더 기술적인 수학으로 넘어가면 sagetex오픈 소스 CAS에 대한 액세스를 제공하는 패키지를 사용해야 합니다.세이지. CTAN에 대한 문서는 다음과 같습니다.여기. 원하는 것을 얻는 "빠르고 더러운" 방법은 다음과 같습니다.

\documentclass{article}
\usepackage{sagetex}
\begin{document}
\begin{sagesilent}
x = polygen(QQ)
f = x^4-x^3-1
root_list = f.roots(CC) 
real_roots = []
for root in root_list:
    real_roots += [root[0].n(digits=3)]
P = list_plot(real_roots,color='red',size=25)
\end{sagesilent}
The roots of the polynomial $\sage{f}$ plotted in the complex plane
\begin{center}
\sageplot[scale=.8]{P}
\end{center}
The roots of $\sage{f}$ are $\sage{real_roots}$.
\end{document}

출력은 다음과 같습니다. 여기에 이미지 설명을 입력하세요 코드가 복잡한지는 잘 모르겠지만, 그냥 다음을 참조하여 일부 코드를 해킹했습니다.이것그리고이것코드를 알아내기 위해. x = polygen(QQ)나는 합리적인 계수를 가진 다항식의 근을 찾을 수 있게 하고 f.roots(CC)세이지에게 복잡한 근을 찾도록 지시할 것이라고 생각합니다 . SAGE는 CAS이기 때문에 해당 숫자는 sqrt(2)와 같은 객체일 수 있으며 플롯할 수 있는 소수로 강제 변환하려고 합니다. 그것은 에 의해 달성됩니다 for root in root_list: real_roots += [root[0].n(digits=3)]. 실제 플롯은 변수 P에 저장됩니다. 여기서 P = list_plot(real_roots,color='red',size=25)색상과 크기는 처음에는 너무 작아서 쉽게 볼 수 없는 지점을 나타냅니다. 이 모든 작업은 sagesilent모드에서 이루어지며 이는 문서에 들어가지 않는 파지와 같습니다. LaTeX 코드에서는 \sage{}숫자/계산을 가져오고 \sageplot{}SAGE에서 수행되는 플롯을 가져오는 데 사용됩니다. Sage를 통해 플롯을 수행하면 코드가 짧아지고 CAS가 수학을 수행하므로 함수를 변경할 수 있으며(계수와 변수 간의 곱셈이 필요하다는 점만 기억하세요) SAGE가 결과를 계산합니다. 좀 더 코딩을 하면 플롯을 더 보기 좋게 만들 수 있습니다.tikz 제가 Zeta 함수에 대해 어떻게 했는지 참조할 수 있습니다.여기. 이렇게 하려면 몇 줄이 더 필요합니다. 내 코드에서 SAGE는 \sage{real_roots}. CAS가 작업을 수행하면 실수를 방지할 수 있습니다.

SAGE는 LaTeX 배포판의 일부가 아닙니다. 액세스하는 가장 좋은 방법은 무료 Cocalc 계정을 이용하는 것입니다.여기.

답변2

케이Z는 컴퓨터 대수학 시스템이 아닙니다. 물론 근을 직접 계산하고 극좌표를 사용하여 플롯할 수 있습니다. (원칙적으로 Ti를 허용할 수도 있습니다.케이Z는 근을 수치적으로 결정하는 방정식을 푼다. 그러나 이것은 아마도 약간 미친 짓일 것이다.)

\documentclass[tikz,border=3.14mm]{standalone}
\usepackage{amsmath}
\DeclareMathOperator{\re}{Re}
\DeclareMathOperator{\im}{Im}
\begin{document}
\begin{tikzpicture}[scale=4]
 \draw[-latex] (-1.5,0) -- (1.75,0) node[below left] {$\re z$};
 \draw[-latex] (0,-1.5) -- (0,1.5) node[below right] {$\im z$};
 \draw (1,0.05) -- (1,-0.05) node[below]{1};
 \draw (0.05,1) -- (-0.05,1) node[left]{i};
 \foreach \X/\Y in {-76.5/0.94,76.5/0.94,180/0.82,0/1.38}
  {\fill (\X:\Y) circle[radius=1pt];}
\end{tikzpicture}
\end{document}

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

답변3

다음번에는 더 많은 사용자를 귀하의 게시물에 끌어들이기 위해 최소한의 실제 예제를 게시해야 합니다. 어쨌든, 당신은 새로운 사용자이므로 이 답변은 TeX.SE에 오신 것을 환영하기 위한 것입니다!


우선, 나는 그것이 두 개 이상의 실제 뿌리를 가지고 있다고 생각하지 않습니다.

Ti를 사용하면 매우 쉽게 플롯할 수 있습니다.케이지:

\documentclass[tikz]{standalone}
\usetikzlibrary{intersections}
\begin{document}
\begin{tikzpicture}[>=stealth,scale=2]
\draw[->] (0,-2.5)--(0,2.5) node[left] {$y$};
\draw[->,name path=ox] (-2.5,0)--(2.5,0) node[above]{$x$};
\draw (0,0) node[below left] {$O$};
\foreach \i in {-2,-1,1,2} {
    \draw (-.05,\i)--(.05,\i);
    \draw (0,\i) node[left] {$\i$};
    \draw (\i,-.05)--(\i,.05);
    \draw (\i,0) node[below] {$\i$};
}
\draw[red,name path=pl] plot[smooth,samples=500,domain=-1.1:1.6] (\x,{\x*\x*\x*\x-\x*\x*\x-1});
\path[name intersections={of=ox and pl,by={i1,i2}}];
\fill (i1) circle (1pt) node[above right] {$A$};
\fill (i2) circle (1pt) node[below right] {$B$};
\end{tikzpicture}
\end{document}

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

이제 교차점이 있으면 좌표를 얻을 수 있습니다.

\documentclass[tikz]{standalone}
\usetikzlibrary{intersections}
\newdimen\xa 
\newdimen\xb 
\newdimen\ya 
\newdimen\yb
\makeatletter
\def\convertto#1#2{\strip@pt\dimexpr #2*65536/\number\dimexpr 1#1}
\makeatother
% https://tex.stackexchange.com/a/239496/156344
\begin{document}
\begin{tikzpicture}[>=stealth,scale=2]
\draw[->] (0,-2.5)--(0,2.5) node[left] {$y$};
\draw[->,name path=ox] (-2.5,0)--(2.5,0) node[above]{$x$};
\draw (0,0) node[below left] {$O$};
\foreach \i in {-2,-1,1,2} {
    \draw (-.05,\i)--(.05,\i);
    \draw (0,\i) node[left] {$\i$};
    \draw (\i,-.05)--(\i,.05);
    \draw (\i,0) node[below] {$\i$};
}
\draw[red,name path=pl] plot[smooth,samples=500,domain=-1.1:1.6] (\x,{\x*\x*\x*\x-\x*\x*\x-1});
\path[name intersections={of=ox and pl,by={i1,i2}}];
\fill (i1) circle (1pt) node[above right] {$A$};
\path (i1); \pgfgetlastxy{\xa}{\ya}
\fill (i2) circle (1pt) node[below right] {$B$};
\path (i2); \pgfgetlastxy{\xb}{\yb} 
\draw (0,-3) node[text width=10cm,align=left] {%
There are two roots:\\
$A$ at $({\convertto{cm}{\xa}*2}, 0)$ and $B$ at $({\convertto{cm}{\xb}*2}, 0)$.};
\end{tikzpicture}
\end{document}

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

물론 언제든지 원하는 곳 어디에서나 \xa사용할 수 있습니다 ;-)\xb


마모트가 말했듯이, Ti케이Z는 계산기가 아닙니다. 교차점을 사용하여 실제 뿌리를 찾는 데에만 도움이 될 수 있습니다. 그리고 뿌리를 직접 찾는 것 외에는 LaTeX 도구로는 그렇게 하기가 쉽지 않다고 생각합니다.

관련 정보