Встроенные процедуры дифференцирования
Для дифференцирования выражения e по переменным x, y и т.д. используют следующие две команды в среде Maple
Diff, diff, - как обычно, команды с большой и малой буквы отвечают символу и значению т.е. процедуре отложенного и немедленного выполнения;
D - позволяет найти дифференциал функции и дифференцировать процедуры;
implicitdiff - позволяет дифференцировать функции, заданные уравнением.
Пример 5 (дифференцирование ).
> Diff(sin(x),x);
> diff(sin(x),x);
> Diff(sin(x),x$3);
> value(");
В последнем примере мы задали порядок дифференцирования.
Если функция не задана явно, то
> diff(f(x),x);
> diff(f(x,y),x,y);
Аналогично вычисляются и дифференциалы
> D(sin);
> D(ln);
> D(f);
> D(f)(0); # Производная от f вычисляется в точке 0
> D(D(f));
> (D@@2)(f); # Дифференциал старшего порядка как композиция простых дифференциалов
> D(f@g); # Дифференциал от композиции двух функций
Эта комманда позволяет дифференцировать и составные выражения. Например, предположим, что a -это число
> assume(a,constant);
> D(2*sin(a)*f);
Дифференциал можно преобразовать в производную и обратно
> f := D(y)(x) - a*D(z)(x);
> convert(f, diff, x);
> f := diff(y(x), x$2);
> convert(f, D);
Рассмотрим уравнение, которое определяет x(y) или y(x)
> f := x^2+y^3=1
Продифференцируем y по x или x по y
> implicitdiff(f,y,x);
> implicitdiff(f,x,y);
> implicitdiff(f,y,z);
> implicitdiff(f,y(x),x);
> implicitdiff(f,y,x,x);
Определение собственных функций
Необходимо отличать выражение вида f:=x^n+y с четко определенным значением от отображения (функционала) вида переменные -> результат, которое является символом. Внутреннее представление данного отображения эквивалентно написанию процедуры вида proc( переменные ) option operator, arrow; результат end
Рассмотрим, на примерах, различия между этими понятиями
Пример 7 (выражения).
> restart:
> f:=x^3+у^4+z;
с подстановкой и дифференцированием вида
> subs(x=1,y=5,z=-1,f);
> diff(f,x);
> Diff(f,y); value(");
Пример 8 (отображения).
> restart:
> F := (x -> sin(x));
> F(t);
> g:=(x)->x^2+y^4+z;
с подстановкой и дифференцированием вида
> g(1);
> D(g);
> D(g)(3);
Для случая многих переменных это так же несложно
> f := (x,y) -> exp(x*y);
> f(1,1);
> D[1](f);
> D[2](f);
Данные определения выражения и отображения отличаются не только способом вычисления в заданной точке и дифференцированием, но и рядом других свойств. Например, с помощью команд map и map2 можно применять заданное отображение к матрицам, спискам или другим более сложным объектам
Пример 9 ( команда map ).
> restart:
> map(f, x + y*z);
> map(f, y*z);
> map(f, {a,b,c});
Зададим какое-нибудь отображение
> f:=x-> x^5+1;
> L:=[1,-2,x,y,9];
> map(f,L);
Более сложное использование данных команд
> restart:
> map2( map, f, g(a+b, h(c)+d) );
Выражение можно всегда переопределить как функционал командой unapply. Фактически, в Maple даже дифференциал определён таким образом D(f) = unapply(diff(f(x), x), x). Напомним, что дифференциал преобразуется к производной и обратно командой convert.
Пример 10 (выражения и отображения).
> restart:
> q := x^2 + y^3 + 1;
> f := unapply(q,x);
> f(2);
> g := unapply(q,x,y);
Определим процедуру по правилу
> f := proc(x) local t1,t2;
> t1 := x^2;
> t2 := sin(x);
> 3*t1*t2+2*x*t1-x*t2
> end:
Вычислим производную от f по аргументу x
> D(f);
Проверим вычисление производной
> D(f)(x) - diff(f(x),x);
Следующим отличием отображений от выражений является то, что оператор композиции @, можно применять только для отображений. Данный оператор позволяет не только создавать сложные функции, но и является наиболее эффективным для создания обратных функций.
Пример 11 (композиция функций).
> sin@cos)(x);
> (sin@arcsin)(x);
> sin@arcsin;
> simplify(");
> sin@@0;
> sin@@1;
> (sin@@2)(x);
> (D@@2)(ln);
Обратные функции строяться аналогично
> sin@@(-1);
> ln@@(-3);
> LambertW@@(-1);
Для всех встроенных функций можно загрузить таблицу обратных функций (сразу всю!), но это занимает больше памяти, чем использование композиции.
> readlib(invfunc);
> invfunc[sin](1);
> Invfunc[sin](1);
> Invfunc[exp](x);
Интегрирование
Встроенные команды интегрирования
В стандартной (загруженной по умолчанию) библиотеке находяться процедуры Int (expr, options ) и int ( expr,options ), т.е. символ и значение. Синтаксис и опции можно найти в справочнике int.
Пример 1 (определенные и неопределенные интегралы).
> f:=sin(x):
> g:=Int(f,x);
> value(g);
> int(f,x);
Таким образом, мы видим,. что обозначения максимально приближены к обычной математической записи. Для вычисления определенного интеграла надо дополнительно указать пределы интегрирования
> f:=x*exp(x):
> g:=Int(f,x=0..1);
> value(g);
> int(f,x=0..1);
Рассмотрим более сложные интегралы
> f:=sin(x^3):
> g:=int(f,x=0..Pi);
> h:=evalf(g);
или
> g:=Int(x/(x^3-x^2+1),x);
> value(g);
здесь сумма берется по %1 - корням полинома в скобках.
Иногда, при интегрировании получаются многозначные функции, при этом, по умолчанию, Maple использует только одно значение. Список многозначных функций и их принципиальные ветви можно посмотреть следующей командой
> restart: readlib(branches):
> branches(ln);
Рассмотрим интегралы с параметрами
> f:=exp(-a*x)*ln(x)*sqrt(x);
> int(f,x=0..infinity);
Как видим, этот интеграл неопределен при всех значениях параметра. Сделаем дополнительные предположения
> assume(a<0): int(f,x=0..infinity);
Сравним с
> assume(a>0): int(f,x=0..infinity);
Полученные при интегрировании эллиптические функции, зависящие от радикалов можно упростить
> answer := int( 1/sqrt( sin(x) ), x=0..Pi/2 );
> radnormal(answer);
Интегралы, которые не выражаются через алгебраические функции, можно представить как ряд
> int(exp(x^3), x );
> series(", x=0);
В общем случае синтаксис для численного интегрирования имеет вид
evalf ( Int ( f, x = a..b , digits , flag ) ),
где digits- точность вычисления, и flag- код численного метода, см. int[numerical]
> int( exp(v-v^2/2)/(1+1/2*exp(v)), v = -infinity..infinity );
> evalf(", 20);
Здесь digits равно 20. Другой пример - интегрирование гамма функции с использованием алгоритма Ньютона-Котеса:
> evalf(Int(1/GAMMA(x), x = 0..2, 10, _NCrule));
Более сложные опции позволяют вычислять главное значение интеграла и реализуют некоторые дополнительные возможности
> int(1/x^3, x=-1..2, 'CauchyPrincipalValue');
> int( 1/(x+a)^2, x=0..2, 'continuous' );
В принципе, различные эвристические методы, такие как интегрирование по частям и замены переменных, не используются явно, например.
Рассмотрим несколько интегралов, которые берутся по частям или с использованием различных замен переменных
Пример 2 (интегрирование по частям и другие методы) .
> int(x*ln(x),x);
> int(x*sin(x^2),x);
> Int(x^2/(sqrt(1-x^2))^(3/2),x):
> value(");
Тем не менее, для обучения, мы можем использовать подобные команды явно. Эти команды содержатся в пакете student
Пример 3 (интегрирование с пакетом student).
Для начала мы очистим рабочую память и загрузим данный пакет.
> restart:
> with(student);
При загрузке любого пакета Maple выдает список всех загружаемых команд.
Замены переменных:
> f:=Int(sqrt(1-x^2),x=a..b);
> g:=changevar(x=sin(u),f,u);
Здесь мы вводим новую независимую переменную интегрирования u, связанную со старой переменной уравнением x=sin(u) (пределы интегрирования изменились автоматически!) Посмотрим на результат
> value(g);
В двойных интегралах интегралах это позволяет, например, перейти к полярным координатам:
> changevar({x=r*cos(t),y=r*sin(t)}, Doubleint(1,x,y),[t,r] );
Интегрирование по частям:
напомним, что правило интегрирования по частям записывается следующим образом
> f:=Int (u,v)=u*v-Int(v,u);
Синтаксис данной команды intparts(f,u)
> a:=Int(x^2*exp(x),x);
Проинтегрируем по частям
> b:=intparts(a,x^2);
проинтегрируем по частям второй раз
> c:=intparts(b,2*x);
и получим результат
> d:=value(c);
Другие полезные команды для интегрирования из данного пакета
> integrand(Int(h(x),x));
и
> Doubleint(h(x,y),x,y);
> Tripleint(h,x=1..n,y=2..4,z=w..u);
Кроме этого, в пакете student реализовано несколько численных методов:
leftbox, leftsum , rightbox, rightsum, middlebox, middlesum, simpson, trapezoid,
Синтаксис для всех команд одинаков, рассмотрим только один пример
Пример 4 (численное интегрирование).
> restart: with(student):
> f:=x^5*ln(x);
Явное интегрирование данной функции можно посмотреть в справочнике, мы же сравним численные значения
> ex:=evalf(int(f,x=1..3));
> s:=evalf(simpson(f,x=1..3,16));
> t:=evalf(trapezoid(f,x=1..3,16));
> ls:=evalf(leftsum(f,x=1..3,16));
Покажем это на рисунке
> leftbox(f,x=1..3,16,color=red,shading=BLUE);
Аналогично и для других команд
> rs:=evalf(rightsum(f,x=1..3,16));
> rightbox(f,x=1..3,16,color=red,shading=BLUE);
и
> ms:=evalf(middletsum(f,x=1..3,16)));
> middlebox(f,x=1..3,16,color=red,shading=BLUE);