Важнейшие математические константы
Обратите внимание, что имена констант начинаются с больших букв
> Pi; evalf(");
> E; evalf(");
> I;
> infinity;
> gamma; evalf (");
Более подробно смотри в ininames .
Авторы всех систем символьных вычислений следуют принципу Кронекера - "Бог создал целые числа - все остальное дело рук человеческих".
Во всех языках представление целых чисел первично, так как в этом случае алгоритмы сложения и умножения становятся, по-крайней мере в принципе, довольно простыми.
Деление представляет значительно более сложную задачу, поскольку метод, изучаемый в школе, не является алгоритмом, так как он требует угадывания цифры частного. Knuth (1981) детально описал эту проблему и предложил алгоритм такого угадывания, который почти всегда является правильным.
В силу этого "ленивого" принципа Maple выдает только целые числа или имена без численных ответов до тех пор пока вы об этом не попросите. Основные команды "принудительного" вычисления
evalb - для булевых выражений,
evalc - для комплексных выражений,
evalf - для операций с плавающей запятой,
evalm - для вычисления матричных выражений.
Пример 3 (вычисление выражений).
> 25/15+23^3;
> evalf(");
> sin(36);
> evalf(");
> sqrt(2+3); evalf(");
Как видим, на экран выводятся только целые числа, пока не попросишь об обратном. Для операции с плавающей точкой можно задать число цифр после запятой, присвоив необходимое число переменной Digits (начальное значение 10).
Совет: не используйте числа с плавающей точкой в промежуточных вычислениях.
Это приводит к потере времени, точности и иногда приводит к совершенно неверным результатам.
Можно объявлять, что переменные зависят друг от друга, т.е. строить функции и отображения. Следует отметить, что зависимость является глобальным свойством, не подчиняющимся блочной структуре. Зависят ли переменные друг от друга можно узнать командой depends
Пример 4 (зависимость).
> depends(sin(x)+cos(z),{x,y});
> depends(int(f(x),x=a..b),x);
> depends(int(f(x),x=a..b),a);
Все наиболее распространенные математические функции уже определены в виде встроенных функций. Часть из них заданы изначально, другие собраны в библиотеки программ (пакеты), которые необходимо загружать по мере необходимости.
Встроенные функции
Список встроенных функций достаточно велик. Более того, используя дополнительные пакеты данный список можно расширить. Имена функций в пакетах символьных вычислений максимально приближены к стандартным математическим именам. Например, sin, cos, tan, exp, ln, GAMMA, Zeta, или binomial.
Список всех основных функций смотри в inifcns.
Самые важные функции в пакетах символьных вычислений связаны не столько с математикой, сколько с проблемой общения пользователя и компьютера.
В пакете Maple это функции:
· simplify - упростить выражение,
· factor - факторизовать,
· expand - разложить ( раскрыть все скобки),
· normal - привести выражение к "нормальному" виду,
· convert - переписать в заданном виде,
· coeff - выделить коэффициенты полинома,
· collect - собрать вместе части выражения.
Пока мы достаточно грубо описали эти функции. Используя их в дальнейшей работе, мы более детально изучим их свойства.
Слово "упрощение" допускает множество интерпретаций. Очевидно, что запись (x-1) более "простая", чем (x^2-1)/(x+1), но является ли выражение x^999 - x^998 + x^997 - ... -1 более простым, чем (x^1000-1)/(x+1) .
На практике каждому пользователю хочется большего, и именно здесь включается в игру субъективность.
Пример 5 (что такое "просто").
Рассмотрим выражение
> x^100-1; simplify(");
Вид этого выражениея "прост" и для компьютера и для пользователя.
Разложим этот полином на множители
> factor(x^100-1);
и попробуем упростить
> simplify(");
Как видно, это выражение так же "просто" для компьютера как и прежнее.
Но если вы получите это выражение в результате своих вычислений, то вряд ли
вид этого выражения удовлетворит вас. Чтобы упростить данное выражение раскроем все скобки
> expand("");
Данный пример показывает, что даже получив правильный ответ с помощью компьютера, вы должны еще уметь представить его в удобном для пользователя виде.
Пример 6 (упростить).
> simplify((x^a)^b+4^(1/2), power);
> simplify(exp(a+ln(b*exp(c))));
> simplify(sin(x)^2+cos(x)^2, trig);
Подстановка с помощью данной команды
> f := -1/3*x^5*y + x^4*y^2 + 1/3*x*y^3 + 1:
> simplify(f, {x^3 = x*y, y^2 = x+1});
Работа с многозначными функциями требует большего труда
> g:=sqrt(x^2);
> simplify(g);
> simplify(g,assume=real);
> simplify(g,assume=positive);
Можно всегда максимально упрощать используемые выражения, это не только приятно для глаза, но и позволяет сократить время работы и размеры необходимой для работы памяти.
Однако и довольно часто, для пользователя различные представления формул могут ассоциироваться с другими формулами. Это позволяет продвинуться в работе значительно дальше и быстрее чем простой счет на компьютере.
Факторизация означает разложение выражения на множители. В лучших алгоритмах факторизации время счета растет медленнее, чем экспоненциально, но быстрее, чем полиномиально. На практике Maple трактует факторизацию достаточно широко.
Пример 7 (факторизовать).
> factor(x^3+5);
> factor(x^3+5, 5^(1/3));
> factor(x^3+5, {5^(1/3),(-3)^(1/2)});
> factor(x^3+5.0);
> factor(sin(x)^2-1);
Для полиномов и рациональных функций это просто раскрытие всех скобок, для других функций это более сложная процедура. Причем, как показывает опыт, это одна из наиболее непредсказуемых процедур, особенно когда вы работаете с радикалами.
Пример 8 (разложить).
> expand((x+1)*(x+2));
> sin(x+y); expand(");
> exp(x+y); expand(");
> expand(BesselJ(2,t));
В последнем выражении используется функция Бесселя.
Команда normal обычно используется для полиномов и рациональных функций, хотя иногда применима и для более общих выражений.
Пример 9 (нормальный вид выражения).
> normal( 1/x+x/(x+1) );
> normal( 1/x+x/(x+1), expanded );
> sin(x)+1/sin(x)^2; normal(");
Команда convert имеет следующий ситаксис: convert(x,type) или convert(x,type,option). Как всегда, типы и опции можно найти в справочнике.
Пример 10 (преобразовать).
> convert( 1.23456, fraction );
> (x+a)/(x*(x-b)*(x^2+c)); convert(",parfrac,x);
> sin(x); convert(");
> exp(I*x); convert(",trig);
> convert(evalf(Pi),rational,exact);
Команды collect и coeff приводят выражение к нормальному виду и позволяют явно выделять коэффициенты полинома.
Пример 11 (работа с полиномами).
> f := x*(x+1)+y*(x+1);
> g := collect(f,x);
> coeff(g,x,1);
Определение нормальной формы полинома от многих переменных более сложное. Кроме лексикографического представления выделяют так же рекурсивное и распределенное представления по различным наборам переменных
> p:= x*y+a*x*y+y*x^2-a*y*x^2+x+a*x:
> collect(p, [x,y], recursive );
> collect(p, [x,y], distributed);
> collect(p, [y,x],recursive);
> collect(p, [y,x], distributed );
Кроме этого, данная команда позволяет выделять часть из целого и не только в полиномах, например
> f := a*ln(x)-ln(x)*x-x;
> collect(f,ln(x));
Команда combine является аналогом команды collect для функций общего положения, (математический алгоритм команды был разработан только в 1986 году!).
Пример 12 (комбинирование).
> f:=exp(sin(a)*cos(b)) * exp(cos(a)*sin(b));
> combine(f,exp);
> combine(f,[trig,exp]);
Последний вид, по-моему, наиболее приятен для пользователя. Кроме этого данное упрощение, проведенное в промежуточных расчетах, позволит сократить и время работы и размер необходимой памяти.
> combine(Psi(-x)+Psi(x),Psi);
Psi(x) - дигамма функция, определяемая как производная от логарифма гамма функции Psi(x) = diff( ln(GAMMA(x)) , x ).