diff options
author | syn <isaqtm@gmail.com> | 2020-02-16 21:16:23 +0300 |
---|---|---|
committer | syn <isaqtm@gmail.com> | 2020-02-16 21:16:23 +0300 |
commit | 40f07ad2436e9ac58976d1cd7bee26cee903fb25 (patch) | |
tree | 66436365e8654f486ea67d57abf3eaee87529d00 | |
parent | fd78d0fd00e6b98ae8b9894db8be028575e205ac (diff) | |
download | alg3-40f07ad2436e9ac58976d1cd7bee26cee903fb25.tar.gz |
Third task
-rw-r--r-- | four.py | 148 | ||||
-rw-r--r-- | gen_all.py | 1 | ||||
-rw-r--r-- | hw3.tex | 116 | ||||
-rw-r--r-- | intro.tex | 1 | ||||
-rw-r--r-- | libsolve.py | 5 |
5 files changed, 253 insertions, 18 deletions
@@ -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()} +''' +) @@ -1,2 +1,3 @@ import one import two +import four @@ -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} @@ -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: |