Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Maple для студентов физиков. Часть 1. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
12.08.2026
Размер:
1 Мб
Скачать

Глава 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