Для иллюстрации применения вложенных процедур рассмотрим операцию интегрирования по частям. Пусть нам надо вычислить интеграл

∫ p(x)exdx,

где р(х) — выражение, представляющее полином.

Вначале подготовим процедуру IntExpMonomialR, реализующую вычисление уже рассмотренного ранее интеграла, но рекурсивным способом (файл р9):

> IntExpMonomialR:=proc(n::nonnegint,х::name)

local i;

if n=0 then RETURN(exp(x)) fi;

х^n*ехр(x)-n*IntExpMonomialR(n-1, x);

end;

 IntExpMonomialR: = proc(n::nonneg int, x::name)

 local i;

  if n = 0 then RETURN(exp(x)) end if;

  x^n × exp(x) -n × IntExpMonomialR(n - 1, x)

 end proc

Проверим ее в работе:

> IntExpMonomialR(4, х);

x4еx - 4x3еx + 12x2ex - 24хеx + 24 еx

> collect(%,exp(х));

4 - 4х3 + 12x2 - 24x + 24) еx

Теперь составим процедуру для вычисления по частям нашего интеграла:

> IntExpPolynomial:=proc(р::polynom,x::name) local i, result;

### WARNING: degree(0,x) now returns -infinity

result:=add(coeff(p,x,i)*IntExpMonomialR(i,x),i=0..degree(p, x));

collect(result,exp(x));

end;

 IntExpPolynomial: = proc(p::polynom, x::name)

 local i, result;

  result:= add(coeff(p, x, i) × IntExpMonomialR(i, x), i = 0..degree(p, x)); collect(result, exp(x))

 end proc

В этой процедуре имеется обращение к ранее составленной процедуре IntExpMonomialR. Обратите внимание на то, что в процедуре введено предупреждение об определенных проблемах, связанных с использованием функции degree (сообщение начинается с символов ###). Тем не менее, процедура работает, в чем убеждают, по крайней мере, следующие примеры:

> р:=(х^2+1)*(1-3*х);

р := (х² + 1)(1 - 3х)

> expand(р);

х² - 3х³ + 1 - 3x

> int(р*ехр(х),х);

х(-24 + 23х - 10х² + 3х³)

> IntExpPolynomial(р,х);

(24 - 23х + 10х² - 3х³)еx

> IntExpPolynomial(р,х);

(24 - 23х + 10х² - 3х³)еx

10.7. Дополнительные возможности Maple-языка

10.7.1. Переназначение определений

В большинстве случаев Maple-язык использует достаточно длинные идентификаторы для своих определений, например функций. Однако с помощью функции alias можно изменить любое определение на другое, если оно кажется пользователю более удобным. Функция alias записывается в виде

alias(e1, е2, ..., eN)

где е1, е2, …, eN — ноль или более равенств.

Эта функция возвращает список переназначений и осуществляет сами переназначения. Например, для замены имени функции BesselJ на более короткое имя BJ достаточно параметром функции alias записать BJ=BesselJ:

> alias(ВJ=BesselJ);

BJ, Fx

> [BJ(0,1.),BesselJ(0,1.)];

[.7651976866, .7651976866]

Можно также переназначить функцию пользователя:

> alias(Fx=F(x));

BJ, Fx

> diff(F(x),x);

> int(F(x),x=a..b);

Для отмены переназначения, например BJ, используется та же функция alias с повтором переназначения:

> alias(BJ=BJ);

Fx

> BJ(0,1.);

BJ(0, 1.)

Обратите внимание на то, что BJ исчезло из списка переназначений и функция BJ(0,1.) уже не вычисляется, поскольку ее больше нет.

10.7.2. Модули

Модули придают языку программирования Maple некоторые свойства языков объектно-ориентированного программирования. Они служат для реализации абстрактного типа данных на основе инкапсуляции — объединения данных и процедур их обработки. Модули задаются ключевым словом module с пустыми скобками () и завершаются словами end module или просто end:

name := module()

export eseq; local lseq; global gseq;

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату