Основы Maple

 

версия для печати

Отладка

Бывает, что даже у хорошего программиста программа не работает. Нужно и важно уметь и знать, как поймать ошибку. Ниже приведены примеры отладки.


evalf (посмотрите на числа)

Пусть нужно узнать, как выглядит функция

Команда 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.);
check := vs =

Повторная ошибка: для уравнений применяется только =; а присвоение – это a:=5.

plot (создание графика)

Чтобы узнать причину ошибки, надо посмотреть, что происходит с числами. Для этого лучше всего построить график. Например, нужен интеграл:

  • 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 был верен.

assume

Иногда ошибка свзана с тем, что 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, поскольку второе её применение к той же переменной сотрет предыдущие установки.

restart

Иногда расчет занимает много времени, так как лист загромождён предыдущими результатами сеанса работы. Maple помнит все предыдущие выкладки, присвоения, выдачи, и это, конечно, отражается на скорости. Кроме того, может появляться ошибка, от которой никак не удается избавиться. В этих случаях начните все заново, применив restart. Это Maple-овский эквивалент перезагрузки, и им придется часто пользоваться.