пятница, 10 августа 2012 г.

Отладка сложных документов Mathcad 15

Аннотация

Показан способ отладки сложного документа Mathcad 15 при помощи встроенной отладочной команды trace().







Вступление

Как известно Mathcad  умер. Компания PTC не стала продолжать совершенствовать старый добрый Mathcad 11 - 14, а "допинала" до 15 версии и начала всё сначала, о чём есть длинный тред на новом главном форуме, до которого теперь не так просто добраться в отличии от бывшего Collab.

Отнестись к такому поступку можно по-разному. С одной стороны весь наработанный годами код, который вроде как переехал и включён в новый форум, большей частью не работоспособен в Prime, с другой стороны нужно сказать спасибо, что вообще не забросили и деньги вкладываются.

По причине такой двойственности можно сделать деление способов работы с Mathcad. Способ первый - это использование старых версий, начиная с MC 11 и заканчивая MC 15. Способ второй - учиться работать в новом MP почти с нуля.
Здесь я покажу как выглядит один из усовершенствованных способов отладки, который может пригодиться тем, кто освоил MC 15 достаточно, чтобы писать на нём сложные многостраничные документы, т.е. работа по первому способу.

Описание

Чтобы далеко не ходить, посмотрим сразу на результат. Вот вид встроенного отладочного журнала после пересчёта полного документа:

Ссылка: MathcadReport

Здесь мы видим иерархию вызовов функций в процессе расчёта сложного и многоуровневого документа. Выполнено всё это при помощи единственной функции trace(), одного из немногих отладочный инструментов MC15. Однако, для того чтобы создать вид иерархии пришлось изменить подход к формированию документа Mathcad. Я предлагаю с самого начала сложный документ писать вот таким образом:

Ссылка: MathcadReportGraph

Можно заметить, что я оформляю каждую используемую функцию в виде программного блока. У этого блока есть пролог и эпилог, кроме непосредственно вычислительной части. Пролог и эпилог могут служить аналогами try ... catch метода для отлова исключений в Windows.


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

Полный документ MC15 можно посмотреть тут: MathcadReport.xmcdz

В этом документе, который содержит ошибку, автору никак не удавалось получить численные решения системы ОДУ. Из-за громоздкости выражений не было ясно где именно формируется ошибка. MC не слишком многословен в плане локализации места возникновения ошибки. После просмотра документа, оценив его реальную сложность, я предложил визуализировать процесс работы численного решателя системы путём использования отладочного механизма MC, добавив в него большую информативность.
В результате получился общий ход вычислений, благодаря чему автор может досконально проанализировать расчётные формулы и локализовать неявную ошибку в документе.




5 комментариев:

  1. отличная статья... буду использовать данный метод в своих вычислениях.

    Подскажите как Вы делаете двойную конструкцию присвоения в программе (у меня не получается):

    (глубина отступ) <- (глубина+1 Отступ(глубина))

    или это конструкция имеет другой смысл?

    ОтветитьУдалить
    Ответы
    1. Это действительно двойное (поочерёдное) присвоение. Так пишется для краткости записи. Здесь две вектор-строки по два элемента. Нужно вставить сначала одну вектор строку (Ctrl+M) размером 1 строка x 2 столбца, потом ввести оператор присвоения и вставить другую вектор строку того же размера.

      Присвоение при этом будет слева направо, т.е. в данном случае такая запись эквивалентна следующей:
      1) глубина <- глубина + 1
      2) отступ <- Отступ(глубина)

      Удалить
  2. Вячеслав спасибо за ответ. Освоил данный прием следующим образом: определяю матрицу слева и справа с соответствующим заполнением.

    ОтветитьУдалить
    Ответы
    1. На самом деле есть две формы такой краткой записи. Вторая бы выглядела так:

      ( глубина<-глубина+1 отступ<-Отступ(глубина) )

      Т.е. можно создать вектор-строку из двух элементов и в каждом элементе разместить операцию присвоения. Эта вторая форма более понятней, я думаю, чем первый вариант.

      Удалить
  3. Вячеслав добрый день.

    Возник у меня следующий вопрос:
    1.К примеру есть подпрограмма test(Matrix,x1,x2)
    2.Использование подпрограммы - test(GGG1,2,3)
    3.Теперь сам вопрос - можно ли в отладке, "трассировать" подпрограмму так чтобы выдавалась не матрица, а только имя матрицы?

    В таком синтаксисе выдает матрицу
    trace(concat(Ind(deep0+1),Pref1,"Обрабатывается матрица {0}"),GGG1)

    ОтветитьУдалить