Задачи высшей математики с Maxima
3.2 Задачи линейной алгебры
Пакет Maxima включает большое число функций для решения разнообразных задач линейной алгебры.
Рассмотрим основные функции, позволяющие оперировать матрицами и решать основные задачи линейной алгебры.
3.2.1 Простейшие операции с матрицами
В Maxima на матрицах определены обычные операции умножения на число, сложения и матричного умножения. Последнее реализуется с помощью бинарной операции "." (точка). Размерности матрицсомножителей должны быть согласованы.
Рассмотрим несколько примеров.
Создание двух прямоугольных матриц:
(%i1) a:matrix([1,2,3],[4,5,6]);
(%i2) b:matrix([2,2],[3,3],[4,4]);
Функция транспонирует матрицу:
(%i1) a:matrix([1,2,3]); transpose(a);
Умножение матрицы на число:
(%i2) c:b*2;
Сложение матриц (естественно, матрицы должны быть одинаковой формы, иначе возникает ошибка):
(%i4) b+c;
(%i5) a+b; fullmap: arguments must have same formal structure. – an error. To debug this try: debugmode(true);
Умножение матриц (в данном случаем исходные матрицы и согласованы по размерам):
(%i6) f:a.b;
Если матрица — левый сомножитель, то правым сомножителем может быть не только вектор-столбец, но и вектор-строка и даже список.
Maxima позволяет также возводить матрицы в степень, но фактически эта операция применяется к каждому элементу.
3.2.2 Обращение матриц и вычисление определителей
Для обращения матриц используется функция . Пример:
(%i1) a:matrix([1,2],[3,4]); b:invert(a); b.a;
Определитель вычисляется функцией :
(%i4) determinant(a);
3.2.3 Характеристический полином, собственные числа и собственные векторы матрицы
Характеристический полином матрицы вычисляется функцией ( — матрица, — переменная, относительно которой строится полином).
Пример:
(%i6) charpoly(a,x);
(%i7) ratsimp(%);
Корни характеристического полинома являются собственными числами матрицы.
Однако для вычисления собственных чисел и собственных векторов матрицы обычно используют специальные функции: и .
Функция аналитически вычисляет собственные значения и собственные вектора матрицы, если это возможно. Она возвращает список, первый элемент которого — список собственных чисел (аналогично ), а далее идут собственные вектора, каждый из которых представлен как список своих проекций.
(%i1) a:matrix([1,1,1],[2,2,2],[3,3,3]);
(%i2) eigenvalues(a);
(%i3) eigenvectors(a);
Функция отличается от функции тем, что возвращает нормированные на единицу собственные векторы.
3.2.4 Ортогонализация
Maxima включает специальную функцию для вычисления ортонормированного набора векторов из заданного. Используется стандартный алгоритм Грама-Шмидта.
Синтаксис вызова: или .
Аргумент функции — матрица или список. В качестве компонентов системы векторов, на базе которой строится ортонормированная система, рассматриваются строки матрицы или подсписки списка . Для использования данной функции необходимо явно загрузить пакет eigen.
Пример:
(%i1) load("eigen");
(%i2) x:matrix([1,2,3],[4,5,6]);
(%i3) y:gramschmidt(x);
(%i4) ratsimp(%[1].%[2]);
3.2.5 Преобразование матрицы к треугольной форме
Преобразование матрицы к треугольной форме осуществляется методом исключения Гаусса посредством функции (аналогичный результат даёт функция ):
(%i1) a:matrix([1,2,3],[4,5,x],[6,7,y]);
(%i2) b:echelon(a);
Отличия рассматриваемых функций в том, что нормирует диагональный элемент на 1, а — нет. Обе функции используют алгоритм исключения Гаусса.
3.2.6 Вычисление ранга и миноров матрицы
Для расчёта ранга матрицы (порядка наибольшего невырожденного минора матрицы) используется функция .
Пример:
(%i1) a:matrix([1,2,3,4],[2,5,6,9]);
Матрица — невырожденная (две строки, ранг равен 2). Вычислим ранг вырожденной матрицы, содержащей линейно-зависимые строки.
(%i1) a:matrix([1,2,3,4],[2,5,6,9]);
(%i2) rank(a);
(%i3) b:matrix([1,1],[2,2],[3,3],[4,5]);
(%i4) rank(b);
Минор матрицы вычисляется при помощи функции , где — матрица, — индексы элемента, для которого вычисляется минор.
3.2.7 Решение матричных уравнений
Пусть дано матричное уравнение , где — квадратная матрица размерности ; — матрица размерности ; — неизвестная матрица размерности . Пусть — невырожденная матрица (т.е. , тогда существует единственное решение этого уравнения. Решение можно найти по формуле
Пример: Найти решение матричного уравнения , где
Сначала зададим матрицы и :
(%i1) A: matrix( [1, 2, 2],[ -1, -1, 3], [2, 5, 0]);
(%i2) B:matrix([10, 0],[-2, 5], [1, 4]);
Проверим существование и единственность решения:
(%i3) determinant(A);
Матрица невырожденная, значит, решение существует и единственно. Найдём его:
(%i4) A1:invert(A); x:A1.B;
Выполним проверку:
(%i6) A.x-B;
Аналогично решается матричное уравнение , где — квадратная матрица размерности — матрица размерности , — неизвестная матрица размерности . Если — невырожденная матрица, то существует единственное решение .
Пример: Найти решение матичного уравнений , где матрица из предыдущей задачи, — заданная матрица. Аналогично предыдущему примеру, вычисляем решение:
(%i10) C:matrix([10,0,-2],[5,1,4]); x:C.A1; x.A-C;
В общем случае (когда — вырожденная матрица, или — не квадратная матрица) матричное уравнение можно решить при помощи функции .
Синтаксис вызова: , где — список уравнений, — список неизвестных, относительно которых осуществляется решение.
3.2.8 Специальные функции для решения систем линейных и полиномиальных уравнений
Функция решает список одновременных линейных уравнений относительно списка переменных .
Выражения могут быть полиномами указанных переменных и представляться в виде уравнений.
Пример: Решить системы линейных уравнений
Решение в 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]);
Таким образом общее решение имеет вид: , где — произвольная постоянная. Ей можно задавать произвольные действительные значения. При каждом значении c получается частное решение. Например, при получается частное решение
(%i5) ev(%),%r1=1;
Способ представления решения зависит от флага (по умолчанию ). Если указанный флаг установлен в , решение недоопределённых систем включает параметры и т.д. Если флаг установлен в , связанные переменные выражаются через свободные.
Во многом аналогичный результат позволяет получить функция (фактически, это надстройка над ).
Функция решает систему полиномиальных уравнений относительно списка переменных .
Выражения могут быть представлены и в виде уравнений. Количество уравнений может превышать количество неизвестных и наоборот.
Пример:
(%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);
(%i10) algsys ([e1, e2, e3, e4], [x, y, a1, a2]);
Для вычисления корней единичных полиномиальных уравнений используется функция .
Варианты синтаксиса:
- ;
- ;
- ;
- .
Функция находит все корни выражения или уравнения . Функция строит последовательность Штурма для изоляции каждого корня и использует алгоритм деления пополам для уточнения корня с точностью или с точностью, заданной по умолчанию.
Пример:
(%i11) realroots (2 - x + x^5, 5e-6);
(%i12) float(%);
(%i13) ev(2-x+x^5,%[1]);
Все корни полинома (действительные и комплексные) можно найти при помощи функции . Способ представления решения определяется переменной (по умолчанию ; если установить в , то функция возвращает результат факторизации). Алгоритм поиска корней получисленный.
Пример:
(%i1) eqn:x^4+1; soln:allroots (eqn);
Количество действительных корней уравнения в некотором интервале возвращает функция (синтаксис ).
Пример: (находим число корней уравнения на отрезке [-6, 9]):
(%i1) p: x^10 - 2*x^4 + 1/2$ nroots (p, -6, 9);
Для преобразования уравнений используются функции и , позволяющие выделить левую и правую часть уравнения соответственно.
Пример:
(%i1) eqn:x^2+x+1=(x-1)^3;
(%i2) lhs(eqn);
(%i3) rhs(eqn);
Упрощение систем уравнений достигается функцией , позволяющей исключить те или иные переменные.
Вызов исключает переменные из указанных выражений.
Пример:
(%i1) expr1: 2*x^2 + y*x + z; expr2: 3*x + 5*y - z - 1; expr3: z^2 + x - y^2 + 5;
(%i4) eliminate ([expr3, expr2, expr1], [y, z]);