Maple для студентов физиков. Часть 1. Учебное пособие
.pdf
Глава 9. Программирование: логика, циклы, процедуры
Vec1:=Vector(<a1,...,an>); Vec2:=Vector(1..n,[a1,...,an]); Matrix(n,m,[a11,a12,...,anm]]); Matrix(n,m,symbol=a); Matrix(<<a11,a21,a31>|<a12,a22,a32>>); Matrix(n,m,fill=1); Matrix([[a11,a12],[a21,a22],[a31,a32]]);
f:=(x,y)->expr; Matrix(n,m,(i,j)->f(i,j)); Matrix([[a11,...],..,[an1,...]]);
Sequences, lists, sets (Последовательности, листы, наборы) – это группы выражений. Maple сохраняет порядок и повторение в последовательностяхилистах(sequences иlists) инесохраняетвнаборах(sets). Порядок в наборах (sets) можно изменять в течение сессии Maple. table (таблица) – группа выражений, представленная в табличной форме. Каждый имеет индекс (целое или любое выражение) и значе-
ние (см. ?table).
array (массив) – таблица с целочисленным диапазоном индексов (см. ?Array). В Maple массивы могут быть любой размерности (зависит от памяти).
Vector (вектор) одномерный массив с положительным диапазоном целых индексов (см. ?vector, ?Vector).
matrix (матрица) двумерный массив с положительным диапазоном целых индексов (см. ?matrix, ?Matrix).
a:=5; b:=7; Rangel:=a..b; S1:=x,y,z,a,b,c; LS1:=[S1]; SS1:={S1};
L1:=[sin(x),cos(x),sin(2*x),cos(2*x)]; Set1:={x,y,z}; A1:=Array(-l..3); All:=array(-l..3); A2:=Array(l..4,[1,2,3,4]);
Основные операции со структурами данных:
Создание пустых структур, NULL, : =, [ ] .
Seq1:=NULL;
List1:=NULL; List2:=NULL; List3:=[]; Set1:={}; Set2:=NULL; Tab1:=table(); Array1:=Array(-10..10); Vec1:=Vector(10); Matrix1:=Matrix(10,10);
Связанные структуры, | |, op, [ ], cat. k:=1; Seq1:=seq(i,i=1..9);
201
Maple для студентов физиков
List1:=[Seq1];
a||Seq1; «Seq1»||(1..9); k||(1..9); cat(a,Seq1); op([List1,List1]); cat(Seq1,Seq1);
Извлечение i-го элемента из структуры, [ ], op, select,has. Seq1:=seq(i^2,i=1..9); List1:=[Seq1]; Set1:={Seq1}; Array1:=Array(1..9,1..9,[List1,0,List1,0,List1,List1]);
i:=5; j:=2; List1[i]; op(i,List1); Array1[i,j]; op(i,Set1);
element:=9; select(has,Set1,element);
Определение числа элементов в структуре, nops. List1:=[x,y,z]; Set1:={op(List1)}; nops(List1); nops(Set1);
Создание структуры, op, [ ]. Seq1:=x||(1..9); List1:=[Seq1]; Set1:={Seq1}; n:=nops(List1);
List2:=[Seq1,Seq1];
n1:=2; n2:=5; List3:=[op(n1..n2,List1)]; List4:=List1[n1..n2]; Seq2:=op([(n1..n2)],List2); Set2:={op(n1..n2,Set1)}; Set3:=Set1[n1..n2]; Seq3:=op([(n1..n2)],Set1);
Здесь n1 ≤ n2 ≤ n и n – число элементов List1.
Замена i-го элемента структуры, : =, [ ] subsop, subs, evalm. Seq1:=x[i] $ i=1..9; List1:=[Seq1]; i:=5; j:=2; val:=20; List1[i]:=val;
evaln(List1)=List1; List2:=subsop(i=val+1,List1); A:=Matrix(1..i,1..i,symbol=s); A1:=subs(s[i,j]=cos(a+b),A);
Вставка элемента или нескольких элементов в структуру,
[ ], op.
n1:=2; n2:=5; Seq1:=x[i] $ i=1..9; List1:=[Seq1]; List2:=[op(List1),A1]; List3:=[A1,op(List1)];
List4:=[op(n1..n2,List1),A1,A2,A3,A4,op(List2)];
202
Глава 9. Программирование: логика, циклы, процедуры
Создание структуры согласно формуле или обладающей особы-
ми свойствами, например, нуль, равенство, разреженность, симметричность, диагональность и т. п.
f:=x->cos(x); n:=0; m:=3; List1:=[seq(f(i*t),i=n..m)]; Set1:=map(x->x"2,{x,y,z}); List2:=[op(Set1)]; Matrix1:=Matrix(m,m,(i,j)->i+j); Vector1:=Vector(m,i->i"2); with(LinearAlgebra): ZeroMatrix(m,m); IdentityMatrix(m,m);
Операции с sets, matrices:
объединение или пересечение sets, удаление элементов из sets, сумма , разность умножение, деление, скалярное умножение матриц, union, intersect, minus, remove, has, evalm, &*.
Set1:=map(x->x"2,{x,y,z});
Set2:=map(x->cos(x),{x,y,t}); Set3:=Set1 union Set2; Set3:=Set1 intersect Set2; Set3:=Set1 minus Set2; Set2:=remove(has,Setl,A1); M1:=Matrix(3,3,symbol=a); M2:=Matrix(3,3,symbol=b); Mat3:=M1.M2; Mat4:=evalm(M1&*M2);
Применение функции к каждому элементу structure, map, apply, applyop.
Setl:={a||(1..9)}; func:=x->cos(x); Set2:=map(x->x”2,Setl); Set2:=map(func,Setl); apply(f,op(Setl)); applyop(func,{2,3},Setl);
203
Глава 10. СИМВОЛЬНАЯ АЛГЕБРА
Эту главу можно использовать как справочник символьной математики Maple. Например, если нужно улучшить
внешний вид получившегося результата.
Рассматриваемые в главе вопросы/задачи
Algsubs
Collect
Confrac (continued fraction)
Convert
Copy and paste
Exp (exponential form)
Expand
Factor
Matrices and arrays of expressions Metric (unit conversion)
Normal
Numer and denom
Op
Parfrac (partial fraction) Piecewise (convert functions)
Алгебраическая форма команды subs
Собери (частичное применение команды factor)
Confrac (continued fraction) (пре-
образование рациональной функции в непрерывную дробь) Convert (преобразовать) Копирование и вставка
Exp (экспоненциальный вид) Разложить Факторизация (разбиение на множители)
Matrices and arrays of expressions Metric(преобразование в системе единиц)
Normal
Numer and denom (числитель и знаменатель)
выбор части выражения Parfrac (частичное преобразование)
Piecewise (преобразование функций)
204
Глава 10. Символьная алгебра
Polar (convert to polar form)
Ratpoly (convert series to rational function) Simplify
Simplify with side-relations Solve
Sort Subs(titute)
Subscripted variables, avoiding
Polar (преобразование в полярный вид)
Ratpoly (преобразование в рациональный полином) Упростить Упростить с доп. условиями Решить
Сортировка по степеням Подстановка (замена одной переменной на другую) Индексированные переменные, как их избежать
Упоминаемые в главе команды Maple
copy and paste: |
op: |
expand: |
subs: |
simplify |
RootOf |
combine: |
polynom |
assume |
parfrac |
symbolic |
confrac |
simplify with side-relations |
sincos |
sort |
abs, |
factor |
Heaviside, |
collect |
signum, |
solve |
piecewise |
allvalues |
signum |
normal |
polar |
convert |
map |
numer and denom |
evalc |
|
ratpoly |
Выполнив работы предыдущих глав, вы овладели основами работы в Maple: дифференцированием, интегрированием, решением уравнений, дифференциальных уравнений и др. Эти знания понадобятся как первая ступень в овладении системой символьных вычислений.
205
Maple для студентов физиков
Для дальнейшего, возможно, понадобятся месяцы или даже более, но эти усилия никогда не пропадут зря. Maple, в отличие от человека, никогда не пропустит знак минус или множитель 2, но только вы можете задать нужный «красивый» стиль представления результатов.
В этой главе перечислены команды, которые нужны для хорошей работы в Maple.
copy and paste
Maple почти никогда не даст вам в точности то, что вы хотите, поэтому вам придется всегда работать с какими-то ручными алгебраическими выкладками. Однако возможности редактирования, (применяя обычные копирование-вставку ctrl-c и ctrl-v) позволяют удобно сочетать возможности рабочего листа Maple и алгебраических выкладок «вручную».
expand
Примеры того, что может expand (разложить)
>a:=(x-1)^2*(x+2);
>expand(a);
>b:=cos(x+y);
>expand(b);
>c:=exp(x-y);
>expand(c);
>d:=ln(x/(1+x^2));
>assume(x,real);expand(d);
>e:=tan(x-y);
>expand(e);
Эта команда – вторая половина универсальной мепловской пары, применяемой для алгебраических упрощений. Вторая – это simplify(expand(%)).
Есливрезультатерасчетовполучаетсяалгебраическоевыражение, которое требует помощи, то пробуйте применять эту комбинацию.
combine
Это команда, обратная expand. Обе они знают тригонометрические равенства, но не столь много, как хотелось бы.
206
Глава 10. Символьная алгебра
>restart;
>a:=cos(x+y);
>expand(a);
>combine(%);
>b:=exp(x-y);
>expand(b);
>combine(%);
>c:=ln(x/(1+x^2));
>assume(x,real);expand(c);
>combine(%);
>restart;
>a:=tan(x-y);
>expand(a);
>combine(%);
Иногда это не работает. Попытаемся применить expand и simplify и посмотрим, что получится.
> expand(%);simplify(%);
Иногда вы не понимаете, чего хотите.
simplify
Maple пытается угадать, что вы хотите сделать этой командой, причем не всегда успешно. Нужно творчески обходиться с этой и с другими обсуждаемыми здесь командами, чтобы получить именно то, что вы хотите. Хорошо скомбинировать expand, simplify и combine. И не забывайте, что можно изменять форму представления с помощью вставки-копирования:
>restart;
>a:=cos(x)^2+sin(x)^2;
>simplify(a);
>b:=(x^2-2*x+1)/(x-1);
>simplify(b);
>c:=cos(x)^2-sin(x)^2;
>simplify(c);
>d:=2*sin(x)*cos(x);
>simplify(d);
>combine(c);combine(d);
207
Maple для студентов физиков
Поиграйте с этими командами, чтобы хорошо овладеть работой с ними. При этом всегда пытайтесь, прежде всего, использовать опцию symbolic:
>restart;
>cc:=sqrt((a^2-b^2))/sqrt(a-b);
>simplify(cc);
>simplify(cc,symbolic);
simplify with side-relations
Вы можете использовать simplify с побочными условиями («боковиками», side-relations) (см. ?simplify/siderels). Они предназначены для того, чтобы сказать Maple о том, какие величины вы хотите использовать, чтобы привести ваши выражения к желаемому виду. Например, предположим, что вы хотите привести выражение cos(x)4 – 3 + cos(x)2 к новому виду, содержащему 2x вместо x путем использования
соотношения cos(x)2 1 cos(2x) . Это делается так: 2
>f:=cos(x)^4-3+cos(x)^2;
>simplify(f,{cos(x)^2 = (1+cos(2*x))/2});
(Обратите внимание, что боковики должны записываться внутри фигурных скобок.) Вы можете думать, что это всего лишь замена (см. команду subs ниже), но для Maple это не то же самое:
> subs(cos(x)^2=(1+cos(2*x))/2,f);
Использование боковиков – это своего рода умная замена, в которой Maple пытается заменить все, что может, используя заданное вами соотношение. Боковик помещается в фигурные скобки, причем можно определить сразу несколько величин в конструкции simplify(ex pression,{side1,side2,side3});
>f:=cos(x)^4+1-cos(x)^2-sin(x)^2+3*sin(x)^6;
>s1:=cos(x)^2=(1+cos(2*x))/2;
>s2:=sin(x)^2=(1-cos(2*x))/2;
>simplify(f,{s1,s2});
208
Глава 10. Символьная алгебра
sort
sort располагает выражения, в особенности полиномиальные, в порядке от высшей степени к низшей
>sort(2-3*x^2-x+x^4);
>sort(1-cos(x)^2+cos(x));
factor
factor пытается записать полиномы как произведение членов:
> factor(x^2-6*x+8);
collect
Это вариант «половины» команды factor. Возможно, что вы видите полный множитель в рамках большего по размерам выражения и вы бы хотели собрать вместе все члены, которые его содержат, как член ln(y) ниже. Делаем так:
>F:=x*ln(y)-5*x + 3*ln(y)+5*exp(y);
>collect(F,ln(y));
Если вы хотите собрать больше, чем один множитель, дайте список множителей в collect, как показано ниже:
>F:=a*x*sin(y)+b*a*x/cos(y);
>collect(F,[x,a]);
solve
Этого мы еще не видели. Команда решает уравнение относительно определенной переменной. Если эта переменная очевидна, поскольку она в уравнении одна, то можно не указывать относительно какой переменной идет решение. Если в уравнении нет знака =, то Maple полагает, что не дописанное = 0.
>solve(x^2-6*x+8);
>solve(ln(y/x)=3,y);solve(ln(y/x)=3,x);
>solve(1-tan(x)^2=-2,x);
209
Maple для студентов физиков
Можете ли вы указать отличия между следующим выражением и тем, что написано выше?
> solve(1-tan(x)^2=-2.,x);
Если вы дали Maple уравнение, не имеющее решения, то он возвратит его вам или не даст ответа. Обратите внимание, что нарисованная ниже функция никогда не становится больше 1.
> plot(1-tan(x)^2,x=-Pi..Pi,-3..3);
так что бесполезно пытаться найти, где она равна 2:
> solve(1-tan(x)^2=2,x);
Maple не может решить его, поэтому он возвращает без ответа.
allvalues
Эта команда может подсказать Maple дать вам ответы вместо того, чтобы оставить решение в форме RootOf, особенно, если вы связали их с evalf:
>eq1:=x^2+2*y=5;eq2:=x-y^5=3;
>s:=solve({eq1,eq2},{x,y});
>evalf((allvalues(s)));
normal
Нормальная форма рациональных функций для общего знаменателя
>normal(1/x + 1/(x+1));
Ачто получится, если вы попытаетесь разложить результат?
>expand(%);
Он раскладывается, но не назад, в исходный вид. Чтобы вернуться к исходному виду, следует применить команду convert.
numer and denom
Maple разрешит вам сослаться непосредственно на числитель или знаменатель дробного выражения, вроде этого:
210
