summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsyn <isaqtm@gmail.com>2020-02-16 21:16:23 +0300
committersyn <isaqtm@gmail.com>2020-02-16 21:16:23 +0300
commit40f07ad2436e9ac58976d1cd7bee26cee903fb25 (patch)
tree66436365e8654f486ea67d57abf3eaee87529d00
parentfd78d0fd00e6b98ae8b9894db8be028575e205ac (diff)
downloadalg3-40f07ad2436e9ac58976d1cd7bee26cee903fb25.tar.gz
Third task
-rw-r--r--four.py148
-rw-r--r--gen_all.py1
-rw-r--r--hw3.tex116
-rw-r--r--intro.tex1
-rw-r--r--libsolve.py5
5 files changed, 253 insertions, 18 deletions
diff --git a/four.py b/four.py
index 4f7cd54..12074cf 100644
--- a/four.py
+++ b/four.py
@@ -23,8 +23,10 @@ lbdE = Matrix([
[0, 0, 0, Poly([0, 1])]
])
-# uncomment to see characteristic poly
-#print((A - lbdE).det())
+print((A - lbdE).det())
+
+
+
@@ -45,11 +47,149 @@ A.make_D(0, -1)
A.make_U(1, 2)
A.make_D(1, Fraction(1, 4))
-gen_figure('fsr_A_T',
+gen_figure('V_1',
+f'''
+ {before}
+ {FOUR_SIMEQ}
+ {A.to_tex()}
+''')
+
+
+
+
+
+
+
+
+A = Matrix([
+ [-1, 1, 1, -1],
+ [-7, 4, 4, -3],
+ [4, -1, -2, 1],
+ [4, -1, -2, 1]
+])
+A = A@A
+
+before = A.to_tex()
+
+A.triangulate()
+
+
+A.make_D(0, -Fraction(1, 2))
+A.make_D(1, -6)
+
+gen_figure('V_0',
f'''
{before}
{FOUR_SIMEQ}
{A.to_tex()}
''')
-print(A) \ No newline at end of file
+
+
+
+
+
+# solve 16-equation system
+# unknown matrix is (answer_to_system).reshape(4, 4),
+# so we 'flatten' it to solve for each unknown
+
+def make_row(vec, ans):
+ return [
+ [0, 0, 0, 0] * i +
+ vec +
+ [0, 0, 0, 0] * (3 - i) +
+ [ans[i]]
+ for i in range(4)
+ ]
+
+v_11 = [1, 3, 0, 0]
+v_12 = [1, 0, 3, 3]
+v_01 = [-1,-3, 1, 0]
+v_02 = [12, 10, 0, 3]
+e_3 = [0, 0, 1, 0]
+e_4 = [0, 0, 0, 1]
+
+rows = []
+rows += make_row(v_11, [0, 0, 0, 0])
+rows += make_row(v_12, [0, 0, 0, 0])
+rows += make_row(e_3, v_01)
+rows += make_row(e_4, v_02)
+
+sys = Matrix(rows)
+
+before = sys.to_tex()
+
+sys.triangulate(True)
+sys.make_D(1, -Fraction(1, 3))
+sys.make_D(5, -Fraction(1, 3))
+sys.make_D(9, -Fraction(1, 3))
+sys.make_D(13, -Fraction(1, 3))
+
+gen_figure('sys_orig',
+f'''
+ \\begingroup % keep the change local
+ \\setlength\\arraycolsep{{4pt}}
+ {before}
+ {FOUR_SIMEQ}
+ {sys.to_tex()}
+ \\endgroup
+''')
+
+ans = [row[-1] for row in sys.rows]
+reshape = [ans[4 * i:4 * i + 4] for i in range(4)]
+
+psi = Matrix(reshape)
+
+gen_figure('psi',
+f'''
+\\psi' = {psi.to_tex()}
+''')
+
+
+
+
+
+
+inverse = Matrix([
+ [ 0, Fraction(1, 3), 0, 0, 1, 0, 0, 0],
+ [ 1, -Fraction(1, 3), 0, 0, 0, 1, 0, 0],
+ [-3, -1, 1, 0, 0, 0, 1, 0],
+ [-3, -1, 0, 1, 0, 0, 0, 1]
+])
+
+before = inverse.to_tex()
+
+inverse.triangulate(True)
+inverse.make_D(1, 3)
+
+gen_figure('inverse',
+f'''
+ {before}
+ {FOUR_SIMEQ}
+ {inverse.to_tex()}
+''')
+
+
+
+
+C = Matrix([
+ [ 0, Fraction(1, 3), 0, 0],
+ [ 1, -Fraction(1, 3), 0, 0],
+ [-3, -1, 1, 0],
+ [-3, -1, 0, 1]
+])
+
+inv = Matrix([
+ [1, 1, 0, 0],
+ [3, 0, 0, 0],
+ [6, 3, 1, 0],
+ [6, 3, 0, 1]
+])
+
+
+gen_figure('inverse_mul',
+f'''
+ \\psi = C^{{-1}}\\psi'C =
+ {((inv @ psi) @ C).to_tex()}
+'''
+)
diff --git a/gen_all.py b/gen_all.py
index 07a1c0f..3c42413 100644
--- a/gen_all.py
+++ b/gen_all.py
@@ -1,2 +1,3 @@
import one
import two
+import four
diff --git a/hw3.tex b/hw3.tex
index 2ec8de5..e064c25 100644
--- a/hw3.tex
+++ b/hw3.tex
@@ -117,18 +117,108 @@
\rangle
$
-%\dmquestion{4}
-% Найдем хар. многочлен $\varphi$:
-% \[
-% \mathrm{det} (\varphi - \lambda E)
-% \overset{\texttt{four.py}}=
-% \lambda^4 - \lambda^3 + \lambda^2 =
-% \lambda^2(\lambda - 1)^2
-% \]
-%
-% $
-% V^1 = \ker ((\varphi - E)^2)
-% $, так как у каждого собственного значения степень 2
-% \input{figures/fig_four_fsr_A_T}
+\dmquestion{4}
+ Найдем хар. многочлен $\varphi$:
+ \[
+ \mathrm{det} (\varphi - \lambda E)
+ \overset{\texttt{four.py}}=
+ \lambda^4 - \lambda^3 + \lambda^2 =
+ \lambda^2(\lambda - 1)^2
+ \]
+
+ $
+ V^1 = \ker ((\varphi - E)^2)
+ $, так как у каждого собственного значения степень 2
+ \input{figures/fig_four_V_1}
+
+ ФСР:
+ \[
+ v_{11} = (1, 3, 0, 0), \quad v_{12} = (1, 0, 3, 3)
+ \]
+
+ $
+ V^0 = \ker(\varphi^2)
+ $
+ \input{figures/fig_four_V_0}
+
+ ФСР:
+ \[
+ v_{01} = (-1, -3, 1, 0), \quad v_{02} = (12, 10, 0, 3)
+ \]
+
+ Дополним $v_{11}$ и $v_{12}$ до базиса $\mathbb{R}^4$:
+
+ \[
+ \begin{bmatrix}
+ 1 & 3 & 0 & 0\\
+ 1 & 0 & 3 & 3
+ \end{bmatrix}
+ \simeq
+ \begin{bmatrix}
+ 1 & 3 & 0 & 0\\
+ 0 & -3 & 3 & 3
+ \end{bmatrix}
+ \simeq
+ \begin{bmatrix}
+ 1 & 3 & 0 & 0\\
+ 0 & 1 & -1 & -1
+ \end{bmatrix}
+ \]
+
+ Дополним стандартными векторами $e_3$ и $e_4$
+
+ Мы хотим, чтобы $\Image \psi = V^0, \quad \ker \psi = V^1$.
+ Для этого, отправим $v_{11}$ и $v_{12}$ в $0$, а $e_3$ и $e_4$ в $v_{01}$ и $v_{02}$. Тогда у нас будет однозначно определенный оператор, надо будет лишь перейти обратно к стандартному базису. Пусть $\psi'$ - матрица $\psi$ в базисе $(v_{11}, v_{12}, e_3, e_4)$.
+
+ \[
+ \begin{cases}
+ \psi'v_{11} = 0\\
+ \psi'v_{12} = 0\\
+ \psi'e_3 = v_{01}\\
+ \psi'e_4 = v_{02}\\
+ \end{cases}
+ \]
+
+ \input{figures/fig_four_sys_orig}
+
+ \input{figures/fig_four_psi}
+
+ Теперь надо перевести $\psi'$ в стандартный базис:
+ \[
+ \begin{cases}
+ e_1 = v_{12} - 3e_3 - 3e_4\\
+ e_2 = \frac{1}{3}v_{11} - \frac{1}{3}v_{12} - e_3 - e_4\\
+ e_3 = e_3\\
+ e_4 = e_4
+ \end{cases}
+ \]
+
+ Выпишем разложение в столбцы матрицы перехода:
+ \[
+ C = (v_{11}, v_{12}, e_3, e_4) \to e =
+ \begin{bmatrix}
+ 0 & \frac{1}{3} & 0 & 0\\
+ 1 & -\frac{1}{3} & 0 & 0\\
+ -3 & -1 & 1 & 0\\
+ -3 & -1 & 0 & 1
+ \end{bmatrix}
+ \]
+
+ и найдем обратную:
+ \input{figures/fig_four_inverse}
+
+ \[
+ C^{-1} =
+ \begin{bmatrix}
+ 1 & 1 & 0 & 0\\
+ 3 & 0 & 0 & 0\\
+ 6 & 3 & 1 & 0\\
+ 6 & 3 & 0 & 1
+ \end{bmatrix}
+ \]
+
+ Тогда
+ \input{figures/fig_four_inverse_mul}
+
\end{document}
diff --git a/intro.tex b/intro.tex
index f4f9d67..eab3965 100644
--- a/intro.tex
+++ b/intro.tex
@@ -53,6 +53,7 @@
\mathrel{\vbox{\baselineskip.65ex\lineskiplimit0pt\hbox{.}\hbox{.}\hbox{.}}}%
}
+\setcounter{MaxMatrixCols}{20}
\newcommand{\question}[2]{
\bigskip\bigskip
\begin{cframed}
diff --git a/libsolve.py b/libsolve.py
index e9a0677..92f2b78 100644
--- a/libsolve.py
+++ b/libsolve.py
@@ -300,7 +300,7 @@ class Matrix:
parts.append(' & '.join(map(str, row.lst)))
return '\\begin{bmatrix}\n' + '\\\\\n'.join(parts) + '\n\\end{bmatrix}'
- def triangulate(self):
+ def triangulate(self, swap=False):
for i in range(self.shape[1]):
for j in range(i, self.shape[0]):
assert(self[j][i].deg() == 0)
@@ -315,6 +315,9 @@ class Matrix:
continue
coef = -Fraction(self[k][i].vec[0]) / Fraction(self[j][i].vec[0])
self[k] = self[k] + self[j] * coef
+
+ if swap:
+ self.make_U(j, i)
break
class Permutation: