Maple для студентов физиков. Часть 1. Учебное пособие
.pdf
Глава 6. Линейная алгебра
Особые типы векторов
Наиболее важные типы специальных векторов: нулевой вектор, единичный вектор, случайные векторы, разреженные векторы, скалярное произведение единичного вектора и др.
with(LinearAlgebra): ZeroVector(n); UnitVector(j,n); ConstantVector(x,n); ScalarVector(x,j,n); Vector(n,shape=zero); Vector(n,shape=unit[j]); Vector(n,shape=constant[x]); Vector(n,shape=scalar[j,x]); Vector(n,storage=sparse); RandomVector[column](n,generator=G);
Матричные представления и компоненты
with(LinearAlgebra Matrix([[a11,...,a1m],...,[an1,...anm]]); <<a11|...|a1m>,...,<an1|...|anm>>; map(x->f(x),M); <<a11,...,an1>|...|<a1m,...,anm>>; Matrix(n,m,(i,j)->f(i,j)); Matrix(n,m,ops); Matrix(n,m,fill=c); Matrix(n,m,symbol=a); with(Student[LinearAlgebra]): A:=MatrixBuilder(); M[i,j]; M[i,1..-1];M[1..-1,j];M[a..b,c..d]; SubMatrix(M,[a..b],[c..d]); Dimension(M); ColumnDimension(M); RowDimension(M);
Matrix([[a11,...,a1m],...,[an1,...anm]]) – конструирует матрицу – по-
строчно (как список списков).
<<a11|...|a1m>,...>>, <<a11,...,an1>|...>> – конструирует матрицу,
соответственно – построчно и по столбцам (как векторы); для больших матриц это работает медленно.
MatrixBuilder (из пакета Student[LinearAlgebra]) – интерактивное конструирование матрицы (до 5 × 5).
Matrix(n,m,(i,j)->f(i,j)), map(x->f(x),M) – конструирует матрицу n × m с элементами, определенными функцией f(i, j) и функцией f(x), применяемой к каждому элементу матрицы M.
Matrix(n,m,fill=c), Matrix(n,m,symbol=a) – конструирует матрицу n × m где, соответственно, каждый элемент – это c и символьные элементы – это aij. В общем виде матрицы можно конструировать, определяя различные опции функции Matrix.
141
Maple для студентов физиков
M[i,j], M[i,1..-1], M[1..-1,j], M[a..b,c..d] – извлекаетэлементы строк,
столбцов, подматриц матрицы M.
Dimension, RowDimension, ColumnDimension – определяет раз-
мер, размер строки и размер столбца матрицы.
Типы данных в матрицах
Система удобна для вычислений в линейной алгебре – как точных, так и для математики с плавающей запятой. Следовательно, элементы матрицы могут иметь разные типы данных, определенных в системе (действительные, комплексные, символьные и т. д.).
MatrixOptions(M,datatype=val,shape=val);
Matrix(n,m,ops); Matrix(n,m,datatype=val);
MatrixOptions – показывает или устанавливает опции матрицы. Matrix, Matrix,datatype – конструирует числовую матрицу n ×
m и выполняет численные операции линейной алгебры, где опция datatype=val показывает тип данных матрицы.
datatype=float[8], datatype=complex[8] – элементы матрицы – дей-
ствительные и комплексные.
datatype=sfloat, datatype=complex(sfloat) – элементы матрицы – это действительные и комплексные числа с плавающей запятой (число 8 означает число байт для хранения этих чисел в матрице means the number of bytes, n – целое с десятичной точкой – из плавающей запятой «от софта», что работает медленнее, плавающая запятая «от железа»).
Математические операции с матрицами
with(LinearAlgebra): M1+M2; M1-M2; a*M; c1*M1+c2*M2; M1.M2; M1^n; MatrixPower(M1,n); MatrixAdd(M1,M2); Add(M1,M2); Add(M1,M2,c1,c2); Add(M1,-M2); Multiply(M1,M2); MatrixScalarMultiply(M1,a); MatrixVectorMultiply(M1,V1); MatrixMatrixMultiply(M1,M2); M1^(-1); MatrixInverse(M1);
M1^%T; Transpose(M1); M1^%H; Trace(M1); HermitianTranspose(M1); Norm(M1,2); Norm(M1,p); Determinat(M1); factor(M1^5);
142
Глава 6. Линейная алгебра
Элементарные операции со строками и столбцами матриц
Рассмотрим элементарные операции со строками и столбцами матриц:
a)перестановка двух строк или столбцов,
b)умножение строки или столбца на ненулевую константу,
c)сложение строк или столбцов.
RowOperation(A,[i1,i2]); ColumnOperation(A,[j1,j2]);
RowOperation(A,i,s); ColumnOperation(A,j,s);
RowOperation(A,[i1,i2],s); ColumnOperation(A,[j1,j2],s);
Визуализация матриц
with(plots): matrixplot(M,ops); pointplot3d(M,ops); sparsematrixplot(M,ops); listdensityplot(M,ops);
Особые типы матриц
Наиболее важные типы матриц: нулевая, единичная, постоянная, случайная, Гильбертова, Ханкеля, разреженная, диагональная, треугольная, скалярное произведение на единичную матрицу, симметричная и кососимметричная и т. д.
with(LinearAlgebra): ZeroMatrix(n,m); IdentityMatrix(n,m); ConstantMatrix(C,n,m); RandomMatrix(n,m,generator=a..b,ops); Matrix(n,m,shape=zero); Matrix(n,m,shape=constant[C]); Matrix(n,m,shape=identity); HilbertMatrix(n,m,var); HankelMatrix([elems],n); DiagonalMatrix([elems],n,m); BandMatrix([elems],k,n,m); ScalarMatrix(C,n,m); Matrix(n,m,[elems],storage=val); Matrix(n,n,[elems],shape=val);
Замечание. Функции UpperDiagonalMatrix, LowerDiagonalMatrix,
TridiagonalMatrix недоступны в версиях ≥ 6, но их легко построить, с помощью функции SparseArray с конструкцией Band. Несмотря на функцию BlockMatrix , ее следует применить к функции ArrayFlatten. Функция ZeroMatrix заменена на функцию ConstantArray.
143
Maple для студентов физиков
Стандартные матричные операции
Наиболее употребительные матричные операции: детерминант, ранг, минор, обратная и др.
with(LinearAlgebra): Determinant(M); Rank(M); Adjoint(M); Minor(M,i,j); MatrixInverse(M);
144
Глава 7. РЕШЕНИЕ УРАВНЕНИЙ
В этой главе мы изучим методы нахождения корней полиномов, решения уравнений, содержащих элементарные
и специальные функции и наборов сложных уравнений.
Рассматриваемые в главе вопросы/задачи
Fsolve, численный поиск нулей |
Fsolve, numerical zero finder |
Solve, символьное решение |
Solve, symbolic equation solver |
уравнений |
|
Системы нелинейных уравнений |
Systems of nonlinear equations |
Нули систем нелинейных урав- |
Zeroes of systems of nonlinear |
нений |
equations |
Нули полиномов |
Zeroes of polynomials |
Нули трансцендентных уравне- |
Zeroes of transcendental |
ний |
equations |
|
|
Упоминаемые в главе команды Maple
solve |
|
RootOf |
fsolve |
|
seq |
avoid |
|
implicitplot |
evalf |
|
|
Разделы: |
|
|
Уравнения с одной переменной |
|
|
Системы уравнений |
|
|
В главе 6 мы рассматривали, как решаются системы линейных уравнений. Методы достаточно просты, но Maple также может управлять решением намного более сложных нелинейных уравнений. Ос-
145
Maple для студентов физиков
воив эту главу, вы не станете более применять матрицы для решения систем линейных уравнений в Maple.
Уравнения с одной переменной
В Maple предусмотрены две команды для решения таких уравнений – solve и fsolve, соответственно – для обычного символьного решения и решения с получением ответа в числовом виде.
Например, формула для квадратного уравнения:
>restart;
>s1:=solve(a*x^2+b*x+c=0,x);
Синтаксис solve выглядит так: solve(equation,variable). Оба ответа получены и записаны через запятую, и, если вы зададите численные коэффициенты, то система попытается дать вам численные ответы:
> s2:=solve(x^2-8*x+14=0,x);
Maple знает формулы для кубического уравнения:
> s3:=solve(a*x^3+b*x^2+c*x+d=0,x);
но они сложны и их почти никогда не применяют.
Вместо этого используем численные коэффициенты и ожидаем численный ответ:
> s4:=solve(x^3+3*x^2-2*x+7=0,x);
Эти ответы правильны, но поскольку Maple думает символами, то они не выглядят слишком пригодными. Для получения чисел с плавающей запятой следует применять уже известную команду evalf
> evalf(s4);
или вводить коэффициенты уравнения с десятичной точкой.
> s4:=solve(x^3+3.*x^2-2.*x+7.=0,x);
Команда solve с полиномами работает по-умному: она знает фундаментальную теорему алгебры о том, что полином n-го порядка имеет n корней. Например, если вы спросите о корнях x^6+1:
146
Глава 7. Решение уравнений
> s5:=evalf(solve(x^6+1=0,x));
он даст ответ: все 6. Попробуем другое:
> s6:=solve(x^6+3*x^5+2=0,x);
При решении уравнений в Maple вы часто видели RootOf . Проблема в том, что вы задавали полиномы с целыми коэффициентами, что для Maple означает попытку решить уравнение с радикалами (квадратными, кубическими корнями и т. п.). И в этом случае он не может дать решение, кроме корня -1. Однако, если нужно получить только числа, то либо используйте evalf, либо изменяйте коэффициенты на числа с плавающей точкой, и вы получите все шесть.
>evalf(s6);
>solve(x^6+3.*x^5+2.=0,x);
Maple может решать более сложные уравнения, вроде:
cos(x) x 0 . 10
> s7:=solve(cos(x)-x/10=0,x);
снова RootOf, и решение такое же: чтобы найти хотя бы одно решение, замените 10 на 10., или используйте evalf(s7):
> evalf(s7);
При решении сложных уравнений надо проявлять осторожность, поскольку возможно более одного ответа, и Maple не даст все. По-
пробуем нарисовать функцию cos(x) x и увидим, как много у нее
10
нулей, т. е. сколько корней придется искать.
> plot(cos(x)-x/10,x=-15..15);
Maple на самом деле не обманывает: 1.427551779 – это решение, но есть и еще.
Важно: стройте график, прежде чем искать решение, и тогда вы будете знать, сколько корней надо найти.
147
Maple для студентов физиков
Как заставить Maple выдать все корни? Поскольку ищутся численные корни, надо использовать команду fsolve, в которой надо задать уравнение, переменную и диапазон значений, в котором ищутся корни. Например, на рисунке видно, что корни находятся вблизи -9.6, -9.2, -4, -2, 1.5, 5, и 7. Это надо указать в fsolve, задавая диапазон поиска решений x1..x2:
>fsolve(cos(x)-x/10=0.,x,-10..-9.5);
>fsolve(cos(x)-x/10=0.,x,-9.5..-8.8);
Посмотрите, что произойдет, если указать диапазон, где нет кор-
ней:
> fsolve(cos(x)-x/10=0.,x,-8.5..-8);
По общему правилу, когда Maple просто возвращает вам то, что вы ему задали, то это означает, что он либо не может найти ответ, или вы ошиблись. Ищите, где ошибка.
Учтите, что вместо диапазона вы можете просто задать одно угаданное решение
> fsolve(cos(x)-x/10=0.,x=1.5);
Здесь надо быть осторожным. Если вы подсказали fsolve начальное значение, которое близко к максимуму функции, нули которой ищутся, то fsolve может ошибиться, или, возможно, найдет решение, которое не там, где начальная подсказка. На примере метода секущих в Главе 9 вы увидите, почему так происходит. Вот пример такой задачи:
> fsolve(cos(x)-x/10=0.,x=0);
Еще один способ контроля за решениями – опция avoid в fsolve.
Пусть ищется решение уравнения cos(x) x 0 . Чтобы посмо- 3
треть, где искать корни, нарисуем функцию и увидим рядом с 3 два близко расположенных корня. Команда найдет один из них:
> s1:=fsolve(cos(x)+x/3=0,x=3);
148
Глава 7. Решение уравнений
а вам нужен второй, и возникает проблема, как указать команде на него или как задать начальное значение. Можно сказать так: ищи один корень вблизи 3, но не ищи s1:
> s2:=fsolve(cos(x)+x/3=0,x=.09,avoid={x=s1});
Задача 6.1
Найдите все корни следующих полиномов, действительные или комплексные. Используйте для этого обе команды solve и fsolve.
solve будет давать комплексные величины, а fsolve – нет. Это можно исправить, указав fsolve, что нужно искать комплексные решения: fsolve(x^2+1=0, x,complex).
Посмотрите что случается при использовании команды factor(f,complex), где f – полином, который вы хотите разложить.
(a) x4 – 1 (b) x3 + x2 + x + 1
Задача 6.2
(a)Найдите все решения уравнения ex = 10sin(x) между -5 и 20.
(b)Найдите все решения уравнения e(–x) = x, используйте обе solve
иfsolve, и сравните ответы
Задача 6.3 |
cos(1 |
x2 ) |
|
|
99 |
|
|
Найдите все корни функции f (x) |
|
|
для x меж- |
||||
1 |
x |
|
111x |
||||
|
1 |
|
|||||
ду 0 и 10. |
|
|
|
|
|
|
|
Задача 6.4-1
Найдите все корни производной функции Бесселя x J2 (x) между
0 и 100 и занесите их в вектор-столбец an.
Эту задачу можно решить очень компактно с помощью команды seq с командой fsolve внутри ее.
Делайте задачу по отдельным мелким частям:
(1) Сначала нарисуйте функцию x J2 (x) между 0 и 100, затем не-
сколько раз обновите диапазон графика, чтобы узнать, где первый и
149
Maple для студентов физиков
второй корни и как далеко они друг от друга. (Вы обнаружите, что они на расстоянии порядка π.)
(2)Чтобы применить полученную информацию, используйте команду seq, чтобы генерировать все эти корни.
Командаseq генерируетсписокчисел, вродетакого: seq(n^2,n=0..20); затем учтите, что первый аргумент seq может быть чем угодно, что генерирует зависящее от n число, даже результат fsolve.
Вот пример построения последовательности нулей косинуса с помощью seq и fsolve, который основан на догадке, что начинать надо
с1.4 и расстояние между ними нулями π: seq(fsolve(cos(x)=0,x=1.4+n
*Pi),n=0..20);
(3)Все, что вам теперь нужно сделать – загрузить эти числа в вектор-столбец. См. Главу 6, как это сделать. Если команда seq не дала вам первый корень при x = 0, догадайтесь, как это сделать вручную.
Системы уравнений
Maple может решать системы линейных и нелинейных уравнений, но это хитрое дело, поскольку чтобы разобраться в происходящем надо рисовать уравнения, а это сложнее, поскольку пространство решений – многомерное. Это снова команды solve и fsolve, но в этом случае им задаются наборы (в фигурных скобках) уравнений и переменных.
В первом примере используем solve для простой задачи линейной алгебры, как те, что были в Главе 6.
John вдвоестаршеKimberly. ВозрастKimberly плюсвозрастJohn равен 27. Найти возраст каждого. Если использовать пакет LinearAlgebra, то придется рассматривать матрицу, но можно применить solve (и fsolve), которые могут непосредственно работать с уравнениями:
>restart;
>E1:=J=2*K;E2:=K+J=27;
>solve({E1,E2},{J,K});
>fsolve({E1,E2},{J,K});
Поскольку нет надобности беспокоиться о переводе в матричный вид, то получился иной метод решения систем линейных уравнений.
150
