Пассивные функции/процедуры тестируются и нашей процедурой ParProc [41,103], как это иллюстрирует нижеследующий фрагмент:
ParProc := proc(P::symbol) local k L R h a t p g, , , , , , , ; option system remember `Copyright International Academy of Noosphere - Tallinn - 2000`, , ; if P = 'ParProc' then return matrix([[Arguments = P::symbol], [locals = (k L R h a t p g, , , , , , , )], [`options` = (system remember, , `Copyright International Academy of Noosphere - Tallinn - 2000` )]]) else L := ['Arguments', 'locals `options`', , 'rem_tab `description`', , 'globals', 'lex_tab', 'exit_type']; unassign '( A194219471967 '), assign(R = Release1( )), `if`(P = 'randomize', goto(A194219471967 ), `10_17`), `if`( type(P `module`, ), RETURN(cat(P ` is module with exports`, ), [exports(P)]), `if`( type(P, 'procedure'), assign(h = Builtin(P)), assign(p = "" || P, g = `10_17`))); if g = `10_17` then if belong(op convert(( p[1], 'bytes')), 65 .. 90) then Sproc `if`( (length(p) = 1, `` p || , `` || (Case(p[1], 'lower')) || p[2 .. -1]), 'g'); if type(g, 'list') and member(g[2], {'builtin', 'iolib', 'Maple'}) then return (proc( )x try value(x( )) catch : return inert_function, WARNING( |
"<%1> is inert version of procedure/function <%2>", x, cat(Case(p[1], 'lower'), p[2 .. -1])) end try ; error "<%1> is not a procedure and not a module", x end proc )(P) else error "<%1> is not a procedure and not a module", P end if else error "<%1> is not a procedure and not a module", P end if end if; if type(h, 'integer') then RETURN(`builtin function`, h) else try h := IO_proc(P); if type(h, 'integer') then RETURN(`iolib function` h, ) end if catch "": NULL end try end if; A194219471967 ; if P = 'writedata' then a := op(parse(Sub_st(["array(1)" = "'array'(1)"], convert [( op 1,( eval(writedata))], 'string'), )[1]));t t := 9 end if; array 1 .. ( add(`if`(op(k, eval(P)) = NULL, 0 1, ), k = 1 .. R + 1), 1 .. 1, [seq( `if`(op(k, eval(P)) ≠ NULL, `if`(k = 1 and t = 9 [, L k[ ] = a], [L k[ ] = op(k, eval(P))]), NULL), k = 1 .. R + 1)]) end if end proc > map(ParProc, [Int, Diff, Product, Sum, Limit, Normal]); Warning, <Int> is inert version of procedure/function <int> Warning, <Diff> is inert version of procedure/function <diff> Warning, <Product> is inert version of procedure/function <product> Warning, <Sum> is inert version of procedure/function <sum> Warning, <Limit> is inert version of procedure/function <limit> Warning, <Normal> is inert version of procedure/function <normal> [inert_function, inert_function, inert_function, inert_function, inert_function, inert_function] > ParProc(AVZ); ParProc(avz); ParProc(Avz); ParProc(Mkdir); Error, (in ParProc) <AVZ> is not a procedure and not a module Error, (in ParProc) <avz> is not a procedure and not a module Error, (in ParProc) <Avz> is not a procedure and not a module Error, (in unknown) <Mkdir> is not a procedure and not a module |
По установке infolevel[<Функция>]:=n (n=1..3) можно определять уровень протокола выполнения указанной функции, а по infolevel[<Функция>, _debug]:= 3 установке определять уровень вывода отладочной информации. По умолчанию infolevel-таблица пакета содержит только один вход hints = 1 {print(infolevel); ⇒ TABLE([hints = 1])}, определяя вывод ошибочных и предупреждающих сообщений. По приведенным установкам для указанной функции в таблице infolevel определяется соответствующий вход, обеспечивающий необходимый уровень мониторинга выполнения функции, например:
> infolevel[int]:= 3: int(sqrt((1 + x^2)/(1 - x^2)), x); int/indef1: first-stage indefinite integration int/indef1: first-stage indefinite integration int/indef1: first-stage indefinite integration int/algebraic2/algebraic: algebraic integration int/indef1: first-stage indefinite integration int/indef1: first-stage indefinite integration int/indef1: first-stage indefinite integration int/algebraic2/algebraic: algebraic integration int/elliptic: trying elliptic integration int/ellalg/ellindefinite: indefinite elliptic integration ⌠−_X3 + 1_X − 2_X − _X4 + 1 d_X⌡ int/ellalg/ellindefinite: Step 2 -- partial fraction decomposition of 0 giving ⌠0 d_X = ⌠0 d_X ⌡ ⌡ int/ellalg/ellindefinite: Step 3 -- Hermite Reduction. int/ellalg/ellindefinite: Step 4 -- Symbolic partial fraction reduction to Hj1's. int/ellalg/ellindefinite: Step 5 -- Reduction of polynomial part to I0, I1, I2. int/ellalg/ellindefinite: result of indefinite elliptic integration 1/2*(1-_X^4)^(1/2)-(1_X^2)^ (1/2)*(1+_X^2)^(1/2)/(1-_X^4)^(1/2)*EllipticF(_X,I)+1/2*I*ln(I*_X^2+(1-_X^4)^ (1/2))+(1-_X^2)^ (1/2)*(1+_X^2)^(1/2)/(1-_X^4)^(1/2)*(EllipticF(_X,I)-EllipticE(_X, I)) int/indef1: first-stage indefinite integration int/indef1: first-stage indefinite integration int/algebraic2/algebraic: algebraic integration int/elliptic: trying elliptic integration int/ellalg/ellindefinite: indefinite elliptic integration ⌠−_X3 − 1_X − 2_X − _X4 − 1 d_X⌡ int/ellalg/ellindefinite: Step 2 -- partial fraction decomposition of 0 giving ⌠0 d_X = ⌠0 d_X ⌡ ⌡ int/ellalg/ellindefinite: Step 3 -- Hermite Reduction. int/ellalg/ellindefinite: Step 4 -- Symbolic partial fraction reduction to Hj1's. int/ellalg/ellindefinite: Step 5 -- Reduction of polynomial part to I0, I1, I2. int/ellalg/ellindefinite: result of indefinite elliptic integration 1/2*(1-_X^4)^(1/2)+(1_X^2)^ (1/2)*(1+_X^2)^(1/2)/(1-_X^4)^(1/2)*EllipticF(_X,I)+1/2*I*ln(I*_X^2+(1- _X^4)^(1/2))-(1-_X^2)^ (1/2)*(1+_X^2)^(1/2)/(1-_X^4)^(1/2)*(EllipticF(_X,I)-EllipticE(_X,I)) 1 + x2 2) 1 − x2 1 + x2 EllipticE(x I, )− 2 (−1 + x −1 + x − −(1 + x2) (−1 + x2) 1 − x4 > infolevel[simplify]:= 3: simplify(%%); |
simplify/do: applying simplify/sqrt function to expression simplify/do: applying commonpow function to expression simplify/do: applying power function to expression EllipticE(x, I) > infolevel[dsolve]:= 3: dsolve(diff(y(x), x$3) - y(x) + sin(x)*cos(x)^2); Methods for third order ODEs: --- Trying classification methods --- trying a quadrature trying high order exact linear fully integrable trying differential order: 3; linear nonhomogeneous with symmetry [0,1] trying high order linear exact nonhomogeneous trying linear constant coefficient checking if the LODE has constant coefficients <- constant coefficients successfuly( )x = sin 3( x) − cos 3( x) − cos( )x + sin( )x + _C1 ex + _C2 e− 2x sin 32 x + _C3 e− 2x cos 32 x > eval(infolevel); ⇒ table([dsolve = 3, int = 3, simplify = 3, hints = 1]) |
Возможность мониторинга имеет особый смысл в учебных целях, предоставляя протокол получения решения, который может анализироваться на предмет изучения хода вычислений, выполняемого пакетом для получения требуемого результата.
Преобразования математических функций. Различного рода преобразования выражений составляют один из краеугольных камней многих разделов современных математических дисциплин и в этом отношении пакет Maple обеспечивает пользователя достаточно развитыми средствами, в большинстве своем рассматриваемыми на протяжении книги. Здесь мы представим основные средства Maple-языка по преобразованию известных пакету математических функций, играющему чрезвычайно важную роль, прежде всего, в прикладной математике и ряде физических дисциплин, имеющих важные физико-технические приложения [8-14,32].
Для целей преобразования математических функций (известных ядру пакета) из одного типа в другой предназначена многоаспектная convert-функция, рассмотренная в разделе 1.7. Здесь мы акцентируем наше внимание на ее возможностях по конвертации одного типа математических функций в другой. В этом случае формат кодирования функции convert имеет следующий вид: convert(<Выражение>, <Тип функции>)
и преобразует входящие в исходное Выражение функции одного типа в функции типа, определяемого ее вторым аргументом. В качестве основных функциональных преобразований, поддерживаемых convert-функцией (дополнительно к уже рассмотренным выше), отметим следующие:
* Bessel{ |I|J|K|Y} - преобразование волновых Айри-функций в функции Бесселя ука- занного типа либо функций Бесселя одного типа в функции Бесселя другого типа; * Hankel - преобразование волновых Айри-функций и/или функций Бесселя в функции Ханкеля. В обоих случаях преобразованию подвергаются как собственно сами функ- ции Айри и Бесселя, так и их производные. Простейший случай Bessel-аргумента всег- да возвращает результат, тогда как в остальных случаях возможно возвращение невы- численного выражения, т. е. выражения в его исходном виде;
* binomial - преобразование GAMMA-функций и факториалов в биномиалы;
* erf - преобразование дополнительной erfc-функции ошибок, ее итеративных интегра- лов и интегралов Доусона в основную erf-функцию ошибок;
* erfc - преобразование основной erf-функции ошибок в ее erfc-дополнительную; * GAMMA - преобразование факториальных и биномиальных функций в функцию GAMMA; при этом, кодирование необязательного третьего вргумента convert-функ- ции позволяет определять ведущие переменные, по которым производится преобра-
зование;
* StandartFunctions - преобразование функций Мейера и гипергеометрических в стан- дартные специальные и элементарные функции по классификации [12] (ссылка [65]).
Прежде чем представить следующий тип преобразования, представим средство Mapleязыка по заданию в его среде кусочно-определенных функций, играющих чрезвычайно важную роль во многих прикладных областях математики. Для этой цели Maple-язык располагает функцией piecewise, имеющей следующий формат кодирования: piecewise(<ЛУ_1>, <В1>, <ЛУ_2>, <В2>, ..., <ЛУ_n>, <Вn> {, <Z>, <Вf>}) сущность которого соответствует условной конструкции (в терминах “if_then_else”-конструкций) следующего весьма прозрачного вида: