Если мы
хотим, чтобы выражения, включающие заданную нами
функцию преобразовывались, упрощались и
вычислялись по некоторым правилам, необходимо
эти правила задать. Программа Maple V имеет
программируемые входы для многих команд, таких
как simplify , diff , expand, series , evalf , и
многих других функций.
Например, чтобы задать правила
дифференцирования функции H, нужно определить
процедуру с именем `diff/H`, задающую правило
дифференцирования H.
Если процедура `diff/H` определена, то вызов
функции diff(H(x, y, ...), y) будет вызывать `diff/H`(x,y,...,y),
чтобы вычислить производную.
В качестве примера научим Maple вычислять
производную функции H от одной переменной H(x)
> restart;`diff/H` := proc(x,y)
H(x)*diff(x,y)/x end:
> diff(H(x),x);
> diff(H(g(x)),x);
> diff(H(sin(x)),x);
> evalf(subs(x=Pi/2,%));
Читатель без труда узнает по правилу
вычисления производной в функции H натуральный
логарифм.
Точно также, пользователь может задать
собственные правила упрощения при помощи
некоторой процедуры. Если процедура
`simplify/f`задана, то вызов функции simplify(a,f)
задействует `simplify/f`(a).
Научим, например Maple упрощениям
H(x^n)=n*H(x) и H(x*y)=H(x)+H(y).
> restart;
`simplify/H` := proc(y)
local x;
if op(0,y)=H then
if type(op(y),`^`) then x:=op(1,op(y))
elif type(op(y),`*`) then RETURN(H(op(1,op(y)))+H(op(2,op(y))))
else RETURN(y)
fi;
op(2,op(y))*H(x);
else y;
fi;
end;
> op(0,H(sin(y)^5));simplify(H(sin(y)^5),H);
> simplify(H(sin(x)*cos(y)),H);
> expand(ln(sin(x)^n),H);
Функции expand и series также можно
научить выполнять операции над введенными
пользователем функциями. Если процедура ` expand
/f` задана, то выполнение expand (f(x)); будет
приводить к выполнению ` expand /f`(x);
Один из способов задания вычисления
значений определенной функции - использование
разложения в ряд функции, если он известен.
Пользователь может научить Maple разлагать функцию
в ряд командой series . Если процедура ` series /f`
задана, то выполнение series (f(x,y),x) вызовет
выполнение ` series /f`(x,y,x) для вычисления ряда.
Заметим, что эта определенная пользователем
функция `series/f` будет создавать структуру типа series
, а не полином ( polynomial ). Чтобы получить
вычисляемый полином нужно применить команду convert
(выражение, polynom).
|