Гурский Д., Турбина Е. - Вычисления в MathCad 12 (1077322), страница 36
Текст из файла (страница 36)
ПрограммированиеОднако избежать подобных ситуаций все же можно. Для этого следует использоватьспециальный оператор обхода ошибки on error (вводится также сочетанием Ctrl+«'»):i on error iДанный оператор по своему синтаксису полностью соответствует условному оператору if. В правый его маркер следует ввести величину или выражение, ошибка в вычислении которого должна быть зарегистрирована. В левом маркере следует прописатьусловие, которое должно быть выполнено при возникновении ошибочной ситуации.В лучшем случае таким образом можно исправить или обойти возникшую проблемуТак, при численном решении уравнения, если приближение оказывается в окрестности экстремума и возникает ошибка при делении на производную, можно, используяоператор on error, не допустить остановки работы алгоритма из-за такой незначительной трудности.
Для этого нужно просто прибавить к значению приближения небольшую величину (данное условие прописывается в левом маркере оператора ошибки, а в правый соответственно заносится сама расчетная формула). Это, с одной стороны, ничегоне изменит в эффективности определения результата, с другой — позволит предельнопросто разрешить трудную ситуацию.Пример 4.19. Создание функции численного решения уравненийс использованием оператора on errorNev(f,xO,TOL) :=D(x) <- - f ( x )dx(n<-0whilef(x) := x - sin(x)-x+ 1x^xO)f/x^l>TOLNev(f, 1,0.0001) =-0.77246.-5x <- x + 0.0001 on errornxfl[-0.77246)=-2.18x 10n, 4— xn+1-° D ( x .)n <- n + 1В некоторых случаях (когда причина сбоя точно известна) оператор ошибки можетбыть заменен условным оператором.
Так, условие обхода проблемной ситуации в примере 4.19 можно задать и как:ifx)х <-х +0.0001 ifnn^4В тех случаях, когда разрешить возникшую проблему невозможно, следует ограничиться выводом сообщения, раскрывающего причину остановки программы. Сделатьэто можно очень просто, присвоив переменной, значение которой выводится как ответ,соответствующую текстовую строку.4.6. Поиск ошибок в программах* 151Пример 4.20.
Вывод сообщения об ошибкеТ(х) := "can't devide by zero"on error2x -lТ(тс)= 0.113T(0.3) = -1.099T(l) = "can't devide by zero"Обратите внимание, как интересно задана функция в примере 4.20: оператор on errorвозвращает значение самого выражения в том случае, если в нем нет ошибки.Если вас не устраивает форма сообщения в виде текстовой строки, то его можно вывести в принятой в Mathcad форме, то есть в виде желтой всплывающей подсказки. Дляэтого нужно использовать специальную функцию error(«S»), где S — текст сообщения(рис.
4.2).Т(х) := error(" can't devide by zero!!! ")on errorx2-lТ(я) = 0.113T(0.3) =-1.099| can't devide by zero!!! |Рис. 4.2. Использование функции error4.6. Поиск ошибок в программахДо тех пор пока вы не приобретете достаточно опыта, ваши программы вряд ли будутработать с первого же запуска. Почти наверняка они будут содержать множество ошибок и незамеченных опечаток. Конечно, большинство из них может быть легко найдено, но если вы сталкиваетесь с ошибкой такого типа впервые, определить ее расположение будет непросто. Особенно это касается больших программ, запутаться в которыхочень и очень легко даже опытному программисту.В универсальных языках программирования высокого уровня ошибки обычно находитсама система при процедуре, называемой компиляцией.
В Mathcad подобной процедуры нет, однако возможность быстро и легко определять ошибки в синтаксисе алгоритма имеется.Рассмотрим конкретную ошибочную ситуацию (рис. 4.3): при попытке использованияпрограммы, вычисляющей интеграл по методу трапеций, система выдает сообщениеThis variable is undefined (Эта переменная не определена). При проверке всех используемых в программе переменных они оказываются заданными верно. В чем же реальнаяпричина сбоя? У авторов этой книги, столкнувшихся с данной проблемой при написании раздела об интегрировании, самостоятельно найти ошибку не получилось. Если неполучится и у вас, то стоит обратиться за помощью к системе.
Для этого щелкните правой кнопкой мыши на функции, в которой возникла ошибка. При этом откроется ееконтекстное меню, в котором следует выбрать команду, расположенную в его верхнейстроке, Trace Error (Поиск ошибки). Если вы это сделаете, то откроется специальная одноименная панель, содержащая различные параметры поиска ошибки.1 5 2 •:• Глава 4.
ПрограммированиеInt(f,a,b,n) :=» * !=*.-.)for i e 1.. n^h+a)+fl(l-l).h+a]jIn.t(f,0,w,| This variable is undefined. |S<- S + sРис. 4.З. Ошибочная ситуацияПанель Trace Error (Поиск ошибки) (рис. 4.4) содержит несколько кнопок.Trace Error1« First< PreviousРис. 4 .
4 . Панель Trace ErrorLJ First (Первая). Если нажать эту кнопку, то тот фрагмент программы, который вызываетошибку, будет выделен курсором (рис. 4.5). В нашем случае будет выделен сомножитель h в первом выражении в цикле for. Проанализировав, где именно в выделенном выражении может быть ошибка, обнаруживаем, что между h и скобкой с полусуммой функций нет знака умножения. А это означает, что h рассматривается какфункция со значением аргумента, равным величине в скобках. Однако, так как h неявляется функцией одного переменного, запись такая некорректна, что приводитк появлению сообщения об ошибке.
Кстати, с учетом того, что знаки умножения ноумолчанию в Mathcad не отображаются, найти ошибку такого рода очень сложно.Tiace ErrorМех» >Last » 1| illegal function value!Рис. 4 . 5 . В программе найдена ошибка•Previous (Предыдущая). Так как влияние ошибки распространяется иногда уровнями (например, при неправильном задании индекса), бывает нужным произвестиисправления в разных фрагментах программы. Чтобы подняться на уровень выше,и используется данная команда.• Next (Следующая).
Команда, идентичная предыдущей по функциям, но противопо. ложная по направлению.4.7. Символьное вычисление программ * 1 5 3•Last (Последняя). Команда помещает курсор на последний уровень распространения ошибки.• Close (Закрыть). Команда служит для сворачивания окна Trace Error (Поиск ошибки).Использовать панель Trace Error (Поиск ошибки) можно не только в случае программ,но и везде, где есть последовательность выполнения каких-то действий.Объективно говоря, производить отладку программ Mathcad довольно сложно.
ПанельTrace Error (Поиск ошибки) и всплывающие сообщения могут помочь лишь тогда, когдадопущена синтаксическая ошибка. Если же ошибка имеется в самом алгоритме, то система ее, естественно, не обнаружит. Как же действовать в подобном случае? В первуюочередь нужно внимательно проанализировать код алгоритма. Вполне вероятно, чтопричина сбоя — это обычная описка. Если же ничего явно неверного в коде обнаружено не будет, программу следует исследовать в работе.
Для этого обычно нужно проверять, как меняются переменные, когда срабатывают условия, или сколько итерацийделают циклы. Полученную информацию необходимо записывать в вектор, которыйдолжен быть возвращен как результат работы программы.4.7. Символьное вычисление программАналогично большинству операторов и встроенных функций, программы Mathcadмогут быть просчитаны как численно, так и символьно.
Однако аналитический расчеталгоритмов пользователя не согласован с операторами on error и return, поэтому он может быть произведен лишь в случае программ, в коде которых данных операторов нет.Также символьно невозможно рассчитывать рекурсивные алгоритмы. В качестве примера аналитически просчитываемой программы можно привести создание функции,находящей ряд Фурье для произвольной функции.Пример 4.21. Символьное вычисление программ•2-яFur(f,n):= s «-2-яf(t) dtОm<- 1while m < ns <- s + —яiff(t)cos(mt) dtcos(mt) +f(t)sin(n>t) dt-sin(m-t)я Jnm+f(t):=t+ яFur(f,2) -» 2-яcos(t) + 3-sin(t)яcos(t) + 3-sin(t)яsin(2t)212Fur(f,4) ->• 2-я1212sin(2-t)cos(3t) + sin(3t)9-яsin(4-t)4154 •Глава 4.
Программирование4.8. РекурсияРекурсией в программировании называется вызов подпрограммой самой себя. Рекурсия является одной из самых важных структур управления, так как с ее использованием максимально просто реализуется ряд чрезвычайно полезных алгоритмов.В том, что функция может вызвать саму себя, нет ничего удивительного. Чтобы понятьэто, нужно четко отделить программу, определяющую функцию (она одна), и активацию функции (их может быть несколько).
Активация — это особый объект данных,создаваемый в памяти при вызове функции на основании ее определения. Проще говоря, активация — это выполняющаяся функция. Одновременно в памяти может бытьнесколько активаций — они образуют стек (очередь) в том порядке, в котором онибыли вызваны. Активация, сформированная последней, выполняется первой — и наоборот.
При вызове функции, вызывающей другую функцию, создается два объектаактивации: первая функция «ждет», пока выполнится вторая, и лишь затем выполняется сама. Никаких принципиальных различий от того, вызовет ли функция своеопределение или определение другой функции, нет: в любом случае будет создано дваобъекта активации.Классическим примером рекурсивной функции, приводимым практически в любойкниге по программированию, является функция, вычисляющая факториал числа(п!=1-2-3'...(п-2)-(п~1)'П). Не будем нарушать традицию и мы (см.