Mathcad: программой или одной формулой?
Для реализации в Matchad типовых алгоритмов, связанных с расчётами числовых характеристик последовательностей и массивов, совсем не обязательно писать программы по аналогии с классическими процедурными языками. Например, значение минимального по модулю элемента массива можно в Mathcad найти следующим образом:

процедурный способ поиска минимального по модулю значения в массиве
(код написан так, чтобы он работал независимо от значения системной переменной ORIGIN
).
Но куда быстрее сделать это с помощью оператора векторизации:

быстрый способ с оператором векторизации
Количество одинаковых минимумов в массиве можно искать, делая дополнительный проход по нему:

количество минимальных элементов в массиве, процедурная реализация
а можно просто узнать длину вектора, составленного из вхождений минимального элемента в исходный вектор:

количество минимальных элементов в массиве одним вызовом
Разумеется, далеко не факт, что второй способ менее затратен по вычислительным ресурсам, скорее наоборот. Но преимущество в том, что мы пользуемся только стандартными функциями и не составляем чреватых ошибками пользовательских подпрограмм-функций.
Современная тенденция языков и пакетов - готовые алгоритмы вместо их программирования, например, библиотека <algorithm>
в C++, функции обработки и фильтрации массивов в PHP или встроенные операторы суммирования, перемножения, векторизации и т.п. в Mathcad.
Общие правила расчётов по типовым алгоритмам можно сформулировать так:
- для каждой искомой величины создаётся по переменной того же типа данных, что исследуемые значения;
- до цикла обработки данных всем искомым в нём переменным присваиваются начальные значения. В простейших случаях достаточно присвоить:
- ноль – количеству, сумму или арифметическому среднему;
- единицу – произведению;
- заведомо малое для анализируемых данных значение или первый элемент последовательности данных – максимуму;
- заведомо большое для анализируемых данных значение или первый элемент последовательности данных – минимуму;
- в цикле обработки, если очередной элемент данных t (в качестве t может выступать элемент массива, выражение и т.д.) должен быть обработан алгоритмом, применяются операторы вида:
- k := k + 1; при поиске количества элементов k;
- s := s + t; при поиске суммы (или арифметического среднего) s;
- p := p * t; при поиске произведения элементов p;
- if t<min then min := t; при поиске минимума min из элементов данных t;
- if t>max then max := t; при поиске максимума max из элементов данных t;
где ":=" - оператор присваивания. Эти правила не зависят от языка или пакета, в которых вы работаете.
Однако если в языке, как и в Mathcad, есть встроенные циклические операторы и встроенная условная функция, все 3 шага типового алгоритма можно выполнить одним выражением.
Приведём несколько примеров, иллюстрирующих это утверждение, найдя для массива A
одним оператором:
- количество положительных элементов массива;
- сумму элементов, по модулю больших значения 2;
- произведение квадратов ненулевых элементов массива;
- вектор, в котором элементы, меньшие среднего арифметического элементов исходного вектора, заменены нулями;
- минимальный из положительных элементов массива.
Вот скриншоты расчётов, сделанных в том же порядке:

некоторые расчёты для типовых алгоритмов операторами суммы и произведения
Последний пример показывает, что во всём нужно знать меру. В самом деле, нам пришлось трижды фильтровать массив прежде, чем его стало можно обработать стандартной функцией min
.
Трудно придумать аргументы, чем это лучше и нагляднее классического кода

минимальный из положительных элементов массива - классический способ лучше
Также при поиске произведений следует иметь в виду вот это замечание (2).
Скачать документ .xmcd Mathcad 14/15 с этими расчётами в архиве .zip (20 Кб)
29.03.2017, 15:21 [10568 просмотров]