Описания команд
Maple почти никогда не дает в точности то, что хочется, поэтому придется всегда работать с какими-то ручными алгебраическими выкладками. Однако возможности редактирования (обычные копирование-вставка Ctrl-c и Ctrl-v) позволяют удобно сочетать возможности рабочего листа Maple и алгебраических выкладок «вручную».
Примеры того, что может команда 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);
Эта команда – вторая половина универсальной Maple-овской пары, применяемой для алгебраических упрощений.
Первая – это simplify(expand(%)).
Если в результате расчетов получается алгебраическое выражение, которое требует помощи, пробуйте применять эту комбинацию.
Это команда, обратная expand. Обе они знают тригонометрические равенства, но не так много, как хотелось бы.
- 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(%);
Бывают случаи, когда вы сами не понимаете, чего хотите.
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);
Поиграйте с этими командами, чтобы хорошо овладеть работой с ними. При этом всегда пытайтесь прежде всего использовать опцию symbolic:
- restart;
- cc:=sqrt((a^2-b^2))/sqrt(a-b);
- simplify(cc);
- simplify(cc,symbolic);
Можно применять simplify с боковыми условиями (side-relations) (см. ?simplify/siderels). Они предназначены, чтобы сказать Maple, какие величины надо использовать, чтобы привести выражения к желаемому виду. Например, предположим, что, используя , надо привести cos(x)4 – 3 + cos(x)2 к новому виду, содержащему 2х вместо х:
- f:=cos(x)^4-3+cos(x)^2;
- simplify(f,{cos(x)^2 = (1+cos(2*x))/2});
(Обратите внимание, что боковики должны записываться внутри фигурных скобок.) Для Maple это не то же самое, что замена (см. команду subs ниже):
- subs(cos(x)^2=(1+cos(2*x))/2,f);
Использование боковиков – это своего рода умная замена, в которой Maple пытается заменить все, что может, используя заданное ему соотношение. Боковик помещается в фигурные скобки, причем можно определить сразу несколько величин в конструкции simplify(expression,{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});
sort располагает выражения, в особенности полиномиальные, в порядке от высшей степени к низшей:
- sort(2-3*x^2-x+x^4);
- sort(1-cos(x)^2+cos(x));
factor пытается записать полиномы как произведение членов:
- factor(x^2-6*x+8);
Это «половина» команды 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]);
Команда решает уравнение относительно определенной переменной. Если эта переменная очевидна, поскольку она в уравнении одна, то можно не указывать, относительно какой переменной идет решение. Если в уравнении нет знака =, то 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);
Укажите отличия между следующим выражением и тем, что написано выше:
- 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 не может его решить, поэтому возвращает без ответа.
Эта команда может подсказать Maple дать ответы вместо того, чтобы оставить решение в форме RootOf, особенно если они связаны с evalf:
- eq1:=x^2+2*y=5;eq2:=x-y^5=3;
- s:=solve({eq1,eq2},{x,y});
- evalf((allvalues(s)));
Нормальная форма рациональных функций для общего знаменателя:
- normal(1/x + 1/(x+1));
А что получится, если попытаться разложить результат?
- expand(%);
Он раскладывается, но не в исходный вид. Чтобы вернуться к исходному виду, следует применить команду convert.
Maple разрешает сослаться непосредственно на числитель или знаменатель дробного выражения вроде такого:
- denom((1+x)/(3-x^2));
- numer((1+x)/(3-x^2));
но, возможно, не точно в ожидаемой форме. Контролируют части таких выражений, применяя копирование-вставку:
- (1+x)/(3-x^2);
Используйте мышь для выделения числителя выражения (выше), копируйте его с помощью (Ctrl-c), затем вставьте в группу с помощью (Ctrl-v):
Эта команда выбирает части выражения.
Синтаксис: op(n,expr), где n – номер части выражения expr.
Поэкспериментируйте с ней:
- kk:=(1+x^2)/(sin(x)+tan(x))*cosh(x)/(1+tanh(x));
- op(1,kk);op(2,kk);op(3,kk);op(4,kk);
Эта команда заменяет одну переменную на другую:
- Eq1:=cos(x)^2-5*cos(x)+1;
- subs(cos(x)=y,Eq1);
- Eq2:=exp(2*x)-t^2=x*t;
- subs(x=xi,t=tau,Eq2);
При использовании subs вы, возможно, разочаруетесь ее глупостью:
- f:=x^4-3*x^2+5;
- subs(x^2=y,f);
Почему она не распознала, что x4 = y2?
Дело в том, что subs – символьная, а не алгебраическая команда. Есть алгебраическая форма subs, называемая algsubs, которая много умнее. Она распознает, что х2 – это замена х:
- algsubs(x^2=y,f);
В завершение:
Команда convert на самом деле – это множество команд, в зависимости от того, какое преобразование нужно выполнить. Поэтому, прежде чем что-то сделать, вначале спросите в справке ?convert, чтобы выяснить все ее возможности.
Ниже приведены несколько полезных примеров-опций.
Примеры применения convert:
Преобразуйте ответ из команды RootOf в вид с квадратными корнями, кубическими корнями и т. п.:
- eq1:=x=a*y;
- eq2:=x^2=b*y^2+c;
- s:=solve({eq1,eq2},{x,y});
- convert(s,radical);
Обратите внимание, что здесь команда convert менее полная, чем allvalues:
- allvalues(s);
Команда allvalues права: должно быть два решения. Чтобы найти оба с convert(..,radical), сделаем так:
- convert(s,radical,1);
- convert(s,radical,2);
Число в конце команды говорит Maple о том, какой корень вы хотите найти. Преобразуем ряд Тейлора в полином с помощью опции polynom
- g:=sqrt(1-x^2);
- h:=taylor(g,x,6);
- h2:=convert(h,polynom);
Преобразуем рациональные функции в дробь с помощью опции parfrac:
- k:=(2*x+1)/(x*(x+1));
- convert(k,parfrac,x);
Преобразуем рациональные функции в непрерывную дробь с помощью confrac:
- convert(k,confrac,x);
Выразим функции в экспоненциальной форме с помощью exp:
- convert(sin(x),exp,x);
- convert(sinh(x),exp,x);
Преобразуем выражения с синусами и косинусами в форму с тангенсами с помощью tan:
- restart;
- a:=convert((2+cos(x)^2)/(2-sin(x)^2),tan);
- a:=normal(a);
Преобразуем выражения с тангенсами в форму с синусами-косинусами с помощью sincos:
- convert(a,sincos);
- simplify(%);
Преобразуем английские меры в метрические convert(…,metric):
- convert(1.*acre,metric);convert(1.*MPH,metric);
Посмотрим, как английские меры преобразуются в метрические:
- ?convert/metric
Преобразуем выражения, содержащие abs, Heaviside, signum и т. п., с помощью piecewise:
- F:=abs(x);
- F:=convert(F,piecewise,x);
Например, convert дает красивое определение функции signum:
- G:=signum(x);
- G:=convert(G,piecewise,x);
Преобразуем комплексное выражение в форму polar:
- convert(x+I*y,polar);
Но это, вероятно, не в точности то, что имелось в виду. К счастью, команда map сможет представить это в более приемлемом виде.
Достаточно мощная; детали см. ?map
Команда map говорит Maple применить процедуру в первом входе (slot) map(a,b) к каждому из операндов объекта во втором слоте, в данном случае – к амплитуде и аргументу выражения. Процедура преобразования – это evalc, поэтому сделаем так:
- map(evalc,%);
Опция ratpoly преобразует ряд в рациональную функцию. Зачастую это очень удобный и компактный способ получить приближенное выражение для сложной функции. Синтаксис: convert(series,ratpoly,numdeg,dendeg), где numdeg – порядок числителя полинома, а dendeg – порядок его знаменателя.
Эти два аргумента не обязательны, и convert выберет соответствующее количество членов ряда. Ниже несколько примеров с иллюстрирующими графиками, использующих taylor для генерации ряда.
Приближенная функция для синуса. Сравните точный результат (красным) с рациональным приближением (синим):
- sinap:=convert(taylor(sin(x),x=0,13),ratpoly);
- plot([sin(x),sinap],x=0..6,color=[red,navy,tan]);
- tanap:=convert(taylor(tan(x),x=0,10),ratpoly);
- plot([tan(x),tanap],x=0..5,-10..10,color=[red,navy]);
Это выглядит несколько странно. Почему надо строить приближение имеющейся функции рациональной функцией?
Пусть нужна функция Бесселя в коде, написанном на C или Java. Для начала можно использовать ratpoly, затем применить код. (Удостоверьтесь, что приближение не используется вне границ его применимости, на что указывает расхождение синей и красной кривых.)
Вот как строится аппроксимация функции Бесселя J0(x):
- J0ap:=convert(taylor(BesselJ(0,x),x=0,10),ratpoly);
- plot([BesselJ(0,x),J0ap],x=0..5,color=[red,navy]);
Или иначе, постройте график разности между точной функцией и приближенной. Тогда лучше видна область применимости:
- plot(BesselJ(0,x)-J0ap,x=0..5,-.001..0.001);