Компания ALT Linux
Опубликован: 24.03.2015 | Доступ: свободный | Студентов: 550 / 136 | Длительность: 19:00:00
Лекция 3:

Задачи высшей математики с Maxima

3.2 Задачи линейной алгебры

Пакет Maxima включает большое число функций для решения разнообразных задач линейной алгебры.

Рассмотрим основные функции, позволяющие оперировать матрицами и решать основные задачи линейной алгебры.

3.2.1 Простейшие операции с матрицами

В Maxima на матрицах определены обычные операции умножения на число, сложения и матричного умножения. Последнее реализуется с помощью бинарной операции "." (точка). Размерности матрицсомножителей должны быть согласованы.

Рассмотрим несколько примеров.

Создание двух прямоугольных матриц:

(%i1)	a:matrix([1,2,3],[4,5,6]);
\parbox{8ex}{(\%o1)}
\begin{pmatrix}1 & 2 & 3\cr 4 & 5 & 6\end{pmatrix}

(%i2) b:matrix([2,2],[3,3],[4,4]);

\parbox{8ex}{(\%o2)}
\begin{pmatrix}2 & 2\cr 3 & 3\cr 4 & 4\end{pmatrix}

Функция transpose транспонирует матрицу:

(%i1)	a:matrix([1,2,3]); transpose(a);
\parbox{8ex}{(\%o1)}
\begin{pmatrix}1 & 2 & 3\end{pmatrix}
\quad \parbox{8ex}{(\%o2)}
\begin{pmatrix}1\cr 2\cr 3\end{pmatrix}

Умножение матрицы на число:

(%i2)	c:b*2;
\parbox{8ex}{(\%o2)}
\begin{pmatrix}4 & 4\cr 6 & 6\cr 8 & 8\end{pmatrix}

Сложение матриц (естественно, матрицы должны быть одинаковой формы, иначе возникает ошибка):

(%i4)	 b+c;
\parbox{8ex}{(\%o4)}
\begin{pmatrix}6 & 6\cr 9 & 9\cr 12 & 12\end{pmatrix}
(%i5)	a+b;

fullmap: arguments must have same formal structure.
– an error. To debug this try: debugmode(true);

Умножение матриц (в данном случаем исходные матрицы a и b согласованы по размерам):

(%i6)	f:a.b;
\parbox{8ex}{(\%o6)}
\begin{pmatrix}20 & 20\cr 47 & 47\end{pmatrix}

Если матрица — левый сомножитель, то правым сомножителем может быть не только вектор-столбец, но и вектор-строка и даже список.

Maxima позволяет также возводить матрицы в степень, но фактически эта операция применяется к каждому элементу.

3.2.2 Обращение матриц и вычисление определителей

Для обращения матриц используется функция invert. Пример:

(%i1)	a:matrix([1,2],[3,4]);
	b:invert(a);
	b.a;
\parbox{8ex}{(\%o1)}
\begin{pmatrix}1 & 2\cr 3 & 4\end{pmatrix}
\quad \parbox{8ex}{(\%o2)}
\begin{pmatrix}-2 & 1\cr \frac{3}{2} & -\frac{1}{2}\end{pmatrix}
\quad \parbox{8ex}{(\%o3)}
\begin{pmatrix}1 & 0\cr 0 & 1\end{pmatrix}

Определитель вычисляется функцией determinant:

(%i4)	determinant(a);
\parbox{8ex}{(\%o4)}-2

3.2.3 Характеристический полином, собственные числа и собственные векторы матрицы

Характеристический полином матрицы вычисляется функцией charpoly(M,x) (M — матрица, x — переменная, относительно которой строится полином).

Пример:

(%i6)	charpoly(a,x);
\left( 1-x\right) \,\left( 4-x\right) -6\leqno{ (\%o6) }
(%i7)	ratsimp(%);
{x}^{2}-5\,x-2\leqno{ (\%o7) }

Корни характеристического полинома являются собственными числами матрицы.

Однако для вычисления собственных чисел и собственных векторов матрицы обычно используют специальные функции: eigenvalues и eigenvectors.

Функция eigenvectors аналитически вычисляет собственные значения и собственные вектора матрицы, если это возможно. Она возвращает список, первый элемент которого — список собственных чисел (аналогично eigenvalues), а далее идут собственные вектора, каждый из которых представлен как список своих проекций.

Пример:

(%i1)	a:matrix([1,1,1],[2,2,2],[3,3,3]);
\parbox{8ex}{(\%o1)}
\begin{pmatrix}1 & 1 & 1\cr 2 & 2 & 2\cr 3 & 3 & 3\end{pmatrix}
(%i2)	eigenvalues(a);
\parbox{8ex}{(\%o2)}[[0,6],[2,1]]
(%i3)	eigenvectors(a);
\parbox{8ex}{(\%o3)}[[[0,6],[2,1]],[[[1,0,-1],[0,1,-1]],[[1,2,3]]]]

Функция uniteigenvectors отличается от функции eigenvectors тем, что возвращает нормированные на единицу собственные векторы.

3.2.4 Ортогонализация

Maxima включает специальную функцию для вычисления ортонормированного набора векторов из заданного. Используется стандартный алгоритм Грама-Шмидта.

Синтаксис вызова: gramschmidt(x) или gschmidt(x).

Аргумент функции — матрица или список. В качестве компонентов системы векторов, на базе которой строится ортонормированная система, рассматриваются строки матрицы x или подсписки списка x. Для использования данной функции необходимо явно загрузить пакет eigen.

Пример:

(%i1)	load("eigen");
/usr/share/maxima/5.13.0/share/matrix/eigen.mac \leqno{ (\%o1) }
(%i2)	x:matrix([1,2,3],[4,5,6]);
\begin{pmatrix} 1 & 2 & 3\cr 4 & 5 & 6 \end{pmatrix} \leqno{ (\%o2) }
(%i3)	y:gramschmidt(x);
[[1,2,3],[\frac{{2}^{2}\,3}{7},\frac{3}{7},-\frac{2\,3}{7}]] \leqno{ (\%o3)
}
(%i4)	ratsimp(%[1].%[2]);
0\leqno{ (\%o4) }

3.2.5 Преобразование матрицы к треугольной форме

Преобразование матрицы к треугольной форме осуществляется методом исключения Гаусса посредством функции echelon(M) (аналогичный результат даёт функция triangularize(M)):

(%i1)	a:matrix([1,2,3],[4,5,x],[6,7,y]);
\parbox{8ex}{(\%o1)}
\begin{pmatrix}1 & 2 & 3\cr 4 & 5 & x\cr 6 & 7 & y\end{pmatrix}
(%i2)	b:echelon(a);
\parbox{8ex}{(\%o2)}
\begin{pmatrix}1 & 2 & 3\cr 0 & 1 & -\frac{x-12}{3}\cr 0 & 0 & 1\end{pmatrix}

Отличия рассматриваемых функций в том, что echelon нормирует диагональный элемент на 1, а triangularize — нет. Обе функции используют алгоритм исключения Гаусса.

3.2.6 Вычисление ранга и миноров матрицы

Для расчёта ранга матрицы (порядка наибольшего невырожденного минора матрицы) используется функция rank.

Пример:

(%i1)	a:matrix([1,2,3,4],[2,5,6,9]);

Матрица a — невырожденная (две строки, ранг равен 2). Вычислим ранг вырожденной матрицы, содержащей линейно-зависимые строки.

(%i1)	a:matrix([1,2,3,4],[2,5,6,9]);
\parbox{8ex}{(\%o1)}
\begin{pmatrix}1 & 2 & 3 & 4\cr 2 & 5 & 6 & 9\end{pmatrix}
(%i2)	rank(a);
\parbox{8ex}{(\%o2)}2
(%i3)	b:matrix([1,1],[2,2],[3,3],[4,5]);
\parbox{8ex}{(\%o3)}
\begin{pmatrix}1 & 1\cr 2 & 2\cr 3 & 3\cr 4 & 5\end{pmatrix}
(%i4)	rank(b);
\parbox{8ex}{(\%o4)}2

Минор матрицы вычисляется при помощи функции minor(M,i,j), где M — матрица, i,j — индексы элемента, для которого вычисляется минор.

3.2.7 Решение матричных уравнений

Пусть дано матричное уравнение AX = B, где A — квадратная матрица размерности n; B — матрица размерности n\times k; X — неизвестная матрица размерности n\times k. Пусть A — невырожденная матрица (т.е. det(A) \neq 0, тогда существует единственное решение этого уравнения. Решение можно найти по формуле X=A^{-1} B

Пример: Найти решение матричного уравнения AX = B, где

A = \left[ \begin{array}{ccc}
  1 & 2 & 2\\
  - 1 & - 1 & 3\\
  2 & 5 & 0
\end{array} \right]$, \ $B = \left[ \begin{array}{c}
  \begin{array}{cc}
    \text{10} & 0
  \end{array}\\
  \begin{array}{cc}
    - 2 & 5
  \end{array}\\
  \begin{array}{cc}
 1 & 4
  \end{array}
\end{array} 
\right].

Сначала зададим матрицы A и B:

(%i1)	A: matrix( [1, 2, 2],[ -1, -1, 3], [2, 5, 0]);
\parbox{8ex}{(\%o1)}
\begin{pmatrix}1 & 2 & 2\cr -1 & -1 & 3\cr 2 & 5 & 0\end{pmatrix}
(%i2)	B:matrix([10, 0],[-2, 5], [1, 4]);
\parbox{8ex}{(\%o2)}
\begin{pmatrix}10 & 0\cr -2 & 5\cr 1 & 4\end{pmatrix}

Проверим существование и единственность решения:

(%i3)	determinant(A);
\parbox{8ex}{(\%o3)}-9

Матрица A невырожденная, значит, решение существует и единственно. Найдём его:

(%i4)	A1:invert(A); x:A1.B;
\parbox{8ex}{(\%o4)}
\begin{pmatrix}\frac{5}{3} & -\frac{10}{9} & -\frac{8}{9}\cr -\frac{2}{3} &
\frac{4}{9} & \frac{5}{9}\cr \frac{1}{3} & \frac{1}{9} &
-\frac{1}{9}\end{pmatrix}
\quad \parbox{8ex}{(\%o5)}
\begin{pmatrix}18 & -\frac{82}{9}\cr -7 & \frac{40}{9}\cr 3 &
\frac{1}{9}\end{pmatrix}

Выполним проверку:

(%i6)	A.x-B;
\parbox{8ex}{(\%o6)}
\begin{pmatrix}0 & 0\cr 0 & 0\cr 0 & 0\end{pmatrix}

Аналогично решается матричное уравнение XA = B, где A — квадратная матрица размерности n, B — матрица размерности k \times n, X — неизвестная матрица размерности k \times n. Если A — невырожденная матрица, то существует единственное решение X=BA^{-1}.

Пример: Найти решение X матичного уравнений XA = C, где матрица A из предыдущей задачи, C — заданная матрица. Аналогично предыдущему примеру, вычисляем решение:

(%i10)	C:matrix([10,0,-2],[5,1,4]); x:C.A1; x.A-C;
\parbox{8ex}{(\%o10)}
\begin{pmatrix}10 & 0 & -2\cr 5 & 1 & 4\end{pmatrix}\\
\parbox{8ex}{(\%o11)}
\begin{pmatrix}16 & -\frac{34}{3} & -\frac{26}{3}\cr 9 & -\frac{14}{3} & -\frac{13}{3}\end{pmatrix}
\quad \parbox{8ex}{(\%o12)}
\begin{pmatrix}0 & 0 & 0\cr 0 & 0 & 0\end{pmatrix}

В общем случае (когда A — вырожденная матрица, или A — не квадратная матрица) матричное уравнение AX = B можно решить при помощи функции solve.

Синтаксис вызова: solve([eq_1,eq_2 ... ,eq_n], [x_1,x_2,... ,x_m]), где [eq_1,eq_2 ... ,eq_n] — список уравнений, [x_1,x_2,... ,x_m] — список неизвестных, относительно которых осуществляется решение.

3.2.8 Специальные функции для решения систем линейных и полиномиальных уравнений

Функция linsolve([expr_1,expr_2,... ,expr_m], [x_1,x_2,... ,x_n]) решает список одновременных линейных уравнений [expr_1,expr_2,... ,expr_m] относительно списка переменных [x_1,... ,x_n].

Выражения [expr_1,... ,expr_n] могут быть полиномами указанных переменных и представляться в виде уравнений.

Пример: Решить системы линейных уравнений

\left\{ \begin{array}{r}
  x \hspace{0.75em} + \hspace{0.75em} y \hspace{0.75em} + \hspace{0.75em} z
  \hspace{0.75em} + \hspace{0.75em} t = 6,\\
  2 x - 2 y + z + 3 t = 2,\\
  3 x - y + 2 z - t = 8 \text{.}
\end{array} \right.

Решение в Maxima:

(%i1)	ex1:x+y+z+t=6;
	ex2:2*x-2*y+z+3*t=2;
	ex3:3*x-y+2*z-t=8;
	linsolve([ex1,ex2,ex3],[x,y,z,t]);
\parbox{8ex}{(\%o1)}z+y+x+t=6
\parbox{8ex}{(\%o2)} z-2\,y+2\,x+3\,t=2
\parbox{8ex}{(\%o3)} 2\,z-y+3\,x-t=8
\parbox{8ex}{(\%o4)}[x=-\frac{3\,\%r1-14}{4},y=-\frac{\%r1-10}{4},z=\%r1,t=0]

Таким образом общее решение имеет вид: x=(14-3c)/4,  y= (10 - c)/4,  z = c, t = 0, где c — произвольная постоянная. Ей можно задавать произвольные действительные значения. При каждом значении c получается частное решение. Например, при c = 1 получается частное решение

(%i5)	ev(%),%r1=1;
[x=\frac{11}{4},y=\frac{9}{4},z=1,t=0]\leqno{ (\%o5) }

Способ представления решения зависит от флага linsolve_params (по умолчанию true). Если указанный флаг установлен в true, решение недоопределённых систем включает параметры %r1, %r2 и т.д. Если флаг linsolve_params установлен в false, связанные переменные выражаются через свободные.

Во многом аналогичный результат позволяет получить функция algsys (фактически, это надстройка над solve).

Функция algsys([expr_1,expr_2,... ,expr_m], [x_1,x_2,... ,x_n]) решает систему [expr_1 = 0,expr_2 = 0,... ,expr_m = 0] полиномиальных уравнений относительно списка переменных [x_1,... ,x_n].

Выражения [expr_1,... ,expr_n] могут быть представлены и в виде уравнений. Количество уравнений может превышать количество неизвестных и наоборот.

Пример:

(%i6)	e1: 2*x*(1 - a1) - 2*(x - 1)*a2; e2: a2 - a1;
	e3: a1*(-y - x^2 + 1); e4: a2*(y - (x - 1)^2);
2\,\left( 1-a1\right) \,x-2\,a2\,\left( x-1\right) \leqno{(\%o6) }
a2-a1 \leqno{(\%o7) }
a1\,\left(-y-{x}^{2}+1\right) \leqno{(\%o8) }
a2\,\left( y-{\left( x-1\right) }^{2}\right) \leqno{(\%o9) }
(%i10)	algsys ([e1, e2, e3, e4], [x, y, a1, a2]);
[[x=0,y=\%r2,a1=0,a2=0],[x=1,y=0,a1=1,a2=1]]\leqno{ (\%o10) }

Для вычисления корней единичных полиномиальных уравнений используется функция realroots.

Варианты синтаксиса:

  • realroots(expr,bound);
  • eralroots(eqn,bound);
  • realroots(expr);
    • realroots(eqn).

Функция находит все корни выражения expr = 0 или уравнения eqn. Функция строит последовательность Штурма для изоляции каждого корня и использует алгоритм деления пополам для уточнения корня с точностью bound или с точностью, заданной по умолчанию.

Пример:

(%i11)	realroots (2 - x + x^5, 5e-6);
[x=-\frac{664361}{524288}]\leqno{ (\%o11) }
(%i12)	float(%);
[x=-1.267168045043945]\leqno{ (\%o12) }
(%i13)	ev(2-x+x^5,%[1]);
3.0858501665065319\,{10}^{-6}\leqno{ (\%o13) }

Все корни полинома (действительные и комплексные) можно найти при помощи функции allroots. Способ представления решения определяется переменной polyfactor (по умолчанию false; если установить в true, то функция возвращает результат факторизации). Алгоритм поиска корней получисленный.

Пример:

(%i1)	eqn:x^4+1; soln:allroots (eqn);
\parbox{8ex}{(\%o1) }
{x}^{4}+1
\parbox{8ex}{(\%o2) }
[x=0.70710678118655\%i+0.70710678118655,\\
 x=0.70710678118655-0.70710678118655\%i,\\
 x=0.70710678118655\%i-0.70710678118655,\\
 x=-0.70710678118655\%i-0.70710678118655]

Количество действительных корней уравнения в некотором интервале возвращает функция nroots (синтаксис nroots(p,low,high) ).

Пример: (находим число корней уравнения на отрезке [-6, 9]):

(%i1)	p: x^10 - 2*x^4 + 1/2$ nroots (p, -6, 9);
4\leqno{ (\%o2) }

Для преобразования уравнений используются функции lhs и rhs, позволяющие выделить левую и правую часть уравнения соответственно.

Пример:

(%i1)	eqn:x^2+x+1=(x-1)^3;
{x}^{2}+x+1={\left( x-1\right) }^{3}\leqno{ (\%o1) }
(%i2)	lhs(eqn);
{x}^{2}+x+1\leqno{ (\%o2) }
(%i3)	rhs(eqn);
{\left( x-1\right) }^{3}\leqno{ (\%o3) }

Упрощение систем уравнений достигается функцией eliminate, позволяющей исключить те или иные переменные.

Вызов eliminate([eqn_1,...,eqn_n], [x_1,... ,x_k]) исключает переменные [x_1,... ,x_k] из указанных выражений.

Пример:

(%i1)	expr1: 2*x^2 + y*x + z;
	expr2: 3*x + 5*y - z - 1;
	expr3: z^2 + x - y^2 + 5;
z+x\,y+2\,{x}^{2}\leqno{ (\%o1) }
-z+5y+3x-1\leqno{ (\%o2) }
{z}^{2}-{y}^{2}+x+5\leqno{ (\%o3) }
(%i4)	eliminate ([expr3, expr2, expr1], [y, z]);
(\%o4)\  [7425{x}^{8}-1170{x}^{7}+1299{x}^{6}+12076{x}^{5}+22887{x}^{4}-
5154{x}^{3}-1291{x}^{2}+7688x+15376]