
Мне нужно построить график корней любого заданного полинома на комплексной плоскости.
Пример: Пусть дано $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 найти любые комплексные корни. Поскольку 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
, вы можете обратиться к тому, как я это сделал для функции Дзета.здесь. Это займет довольно много дополнительных строк. Обратите внимание, что в моем коде SAGE также смог дать вам 4 нуля с помощью \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
как угодно ;-)
Как сказал сурок, ТикZ — это не калькулятор. Он может только помочь нам найти настоящие корни, используя пересечения. И я не думаю, что это легко сделать с помощью каких-либо инструментов LaTeX, кроме как найти корни самостоятельно.