Отладка
Бывает, что даже у хорошего программиста программа не работает. Нужно и важно уметь и знать, как поймать ошибку. Ниже приведены примеры отладки.
Пусть нужно узнать, как выглядит функция
Команда Maple plot – великолепный способ для этого:
- restart: f:=x-> sin(a^2*x^2)/sin(a*2)^2;
затем используйте:
- plot(f(x),x=-1..1);
Сообщение об ошибке скажет, что у Maple есть затруднения при переводе этой формулы в численные величины, которые нужны для построения графика. Узнать причину ошибки позволяет применение evalf к значению функции:
- evalf(f(1.));
Это завуалированное сообщение об ошибке, которое означает, что Maple пытается вернуть число, но не может, так как не сказано, что такое a. Задайте a значение – график заработает.
Еще пример. Вычислить
- s:=sin(pi/2);
Не получается, так как нужно правильно записать имя резервированной переменной Pi:
- sin(Pi/2.);
Повторная ошибка: для уравнений применяется только =; а присвоение – это a:=5.
Чтобы узнать причину ошибки, надо посмотреть, что происходит с числами. Для этого лучше всего построить график. Например, нужен интеграл:
- restart;
- int(sin(x)/(1-cos(x)),x=0..Pi);
Ожидалось число, а Maple выдал бесконечность. Можно использовать аргументы с плавающей запятой для проверки функций вроде этой:
- sin(1.)/(1-cos(1.));
Чтобы просмотреть все числа, нужен график:
- plot(sin(x)/(1-cos(x)),x=0..Pi);
Теперь видно, что подынтегральное выражение сингулярно в точке x = 0, так что ответ Maple был верен.
Иногда ошибка свзана с тем, что Maple «думает» широко («глобально»), а не в рамках поставленной ему узкой задачи. Например, надо вычислить интеграл:
- restart;
- int(exp(-a^2*x^2),x=0..infinity);
Нужен ответ в виде формулы, содержащей a. Вместо этого выдается предельное выражение и сообщение об ошибке, которое напоминает о возможности Maple работать с комплексными величинами, что не позволяет сразу сказать, является ли a2 положительным или отрицательным. Всё получится, если в команде assume указать, какой именно должна быть величина а.
- assume(a,real);
- int(exp(-a^2*x^2),x=0..infinity);
Посмотрите help команды assume, где сказано, как получить нужный результат.
Предупреждение. Применение assume к переменной может создать проблемы. Вот пример:
Пусть нечто задано для a, которая затем используется в выражении и присваивается другой переменной (например, b). Затем задаем значение для а и пытаемся вычислить b:
- restart;
- assume(a,real);
- b:=cos(a);
- a:=2.;
- evalf(b);
Теперь посмотрим, что получится с той же последовательностью без assume:
- restart;
- b:=cos(a);
- a:=2.;
- evalf(b);
Урок в том, чтобы применять assume только в случае крайней необходимости.
Пусть надо задать для переменной два условия, например одновременно c>0 и c<1. В Maple есть два способа сделать это.
Можно поставить оба условия в одну команду assume:
- assume(c>0,c<1);
или сделать это в два (или больше) шагов, применяя команду additionally
- assume(c>0);
- additionally(c<1);
Причина: Нельзя повторно применять две команды assume, поскольку второе её применение к той же переменной сотрет предыдущие установки.
Иногда расчет занимает много времени, так как лист загромождён предыдущими результатами сеанса работы. Maple помнит все предыдущие выкладки, присвоения, выдачи, и это, конечно, отражается на скорости. Кроме того, может появляться ошибка, от которой никак не удается избавиться. В этих случаях начните все заново, применив restart. Это Maple-овский эквивалент перезагрузки, и им придется часто пользоваться.