Символьная алгебра

Справочник символьной математики 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);

Эта команда – вторая половина универсальной Maple-овской пары, применяемой для алгебраических упрощений.

Первая – это simplify(expand(%)).

Если в результате расчетов получается алгебраическое выражение, которое требует помощи, пробуйте применять эту комбинацию.

combine

Это команда, обратная 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(%);

Бывают случаи, когда вы сами не понимаете, чего хотите.

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 с боковыми условиями (with side-relations)

Можно применять 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 располагает выражения, в особенности полиномиальные, в порядке от высшей степени к низшей:

  • 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);

Укажите отличия между следующим выражением и тем, что написано выше:

  • 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 и denom

Maple разрешает сослаться непосредственно на числитель или знаменатель дробного выражения вроде такого:

  • denom((1+x)/(3-x^2));
  • numer((1+x)/(3-x^2));

но, возможно, не точно в ожидаемой форме. Контролируют части таких выражений, применяя копирование-вставку:

  • (1+x)/(3-x^2);

Используйте мышь для выделения числителя выражения (выше), копируйте его с помощью (Ctrl-c), затем вставьте в группу с помощью (Ctrl-v):

op

Эта команда выбирает части выражения.

Синтаксис: 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);
subs

Эта команда заменяет одну переменную на другую:

  • 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, чтобы выяснить все ее возможности.

Ниже приведены несколько полезных примеров-опций.

Примеры применения 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

Команда map говорит Maple применить процедуру в первом входе (slot) map(a,b) к каждому из операндов объекта во втором слоте, в данном случае – к амплитуде и аргументу выражения. Процедура преобразования – это evalc, поэтому сделаем так:

  • map(evalc,%);
ratpoly

Опция 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);