Совет 81. KISS-принцип (на примере метода наименьших квадратов)

    

Рис. 81. Универсальная реализация метода наименьших квадратов

KISS-принцип к поцелуям никакого отношения не имеет, хотя хорошее отношение к компьютерам в нем заметить можно. KISS – это аббревиатура английской фразы «Keep It Simple, Stupid! – Делай это проще, дурачок!» Она призывает при решении задач прибегать к наиболее простым алгоритмам. KISS-принцип полезен при работе в любой программной среде. Наш совет, естественно, будет касаться Mathcad.

На рис. 81 показано решение в среде Mathcad одной из самой популярных задач – аппроксимация табличной зависимости методом наименьших квадратов. В среде Mathcad есть для этого соответствующие встроенные функции: slope, intercept, line, linfit, genfit и т.д. Наиболее универсальной из них считается последняя – genfit (general fitting – «главное» сглаживание), которая применима к любому виду аппроксимирующей функции с любым числом переменных. У функции genfit лишь один недостаток – ее использование требует знания (ввода в расчет) частных производных аппроксимирующей функции. Их можно было бы найти средствами символьной математики, но беда в том, что переменные аппроксимирующей функции должны быть записаны в виде элементов вектора (х0, х1 и т.д.), а к таким неизвестным операторы и команды символьной математики, увы, неприменимы. Кроме того, использование функции gentif как бы «затуманивает» расчет, делает его сложным для понимания.

Заглавную задачу совета можно решить проще (KISS-принцип) и наглядней, если вспомнить, что она сводится к минимизации суммы квадратов отклонений точек от кривой. В среде Mathcad 8 и выше есть для этого соответствующая встроенная функция – Minimize. На рис. 81 метод наименьших квадратов «прозрачен», открыт для изучения: ищутся значения переменных b и k, при которых функция с именем S[D^2] (сумма квадратов отклонений точек от искомой аппроксимирующей кривой) будет минимальна.

Несколько непронумерованных советов, вытекающих из рис. 81:

1.        На рис. 81 нет традиционных комментариев в виде текстовых вставок – комментарии обрамляют пять смысловых областей (Areas) Mathcad-документа. Эти области можно защищать от редактирования (Lock) и захлопывать (Collapse), что помогает работе с документом: область решения (Solution) может, например, занимать много страниц, а ответ (Answer) «лежит» на дне. Если область решения захлопнуть, то исходные данные (два исходных вектора) и ответ окажутся рядом.

2.        Отказ от использования функции genfit позволил работать с вектором Х, элементы которого необязательно должны возрастать (функция genfit работает только с отсортированным вектором Х).

3.        Два вектора исходных данных расположены не вертикально, а горизонтально с транспонированием VT, что делает Mathcad-документ более компактным[1].

4.        Элементы векторов Х и Y хранят лишние нули и десятичные точки (0.3 вместо .3, 2.0 вместо 2 и т.д.). Это позволило выровнять по вертикали вектора Х и Y и четко фиксировать пары чисел. Тут также можно посоветовать хранить координаты точек не в двух векторах, а в одной матрице с двумя столбцами (или с двумя строками с последующим транспонированием), а потом уже выделять из этой матрицы два вектора.

5.        На рис. 81 записаны три аппроксимирующие формулы. Выбрать нужную из них можно, выключив из работы две ненужные (они отмечены черным прямоугольником в правом верхнем углу). Можно посоветовать и другой способ отключения ненужных функций – размещать их столбиком. При этом нужную аппроксимирующую функцию можно включать в работу перетаскиванием ее в низ столбца функций. Mathcad допускает многократное определение одной пользовательской функции, но при этом «работает» только с последней. Третий способ включения в работу нужной функции может быть основан на смене стиля имени функции. Кроме того, работающую сглаживающую функцию стоит подцветить, чтобы обратить на нее внимание. Подцветить можно и другие ключевые операторы: исходные данные и ответ, например.

6.                          Целевая функция, которая на рис. 81 минимизируется, имеет несколько необычное имя – S[D^2], включающее две греческие буквы (S и D), цифру (2) и три спецсимвола ([, ^ и ]) [2]. Это имя – не что иное, как сокращение полного названия функции: сумма (S) квадратов (^2) отклонений (D) точек от кривой. В имени функции записаны квадратные скобки для того, чтобы отличать их от круглых, обрамляющих аргументы функции: функция вида S(D^2)(bk) была бы совсем уж ни на что не похожа[3].

7.                          В расчете на рис. 81 группы переменных объединены стилями, имеющими разный цвет (см. совет 52 и совет 83). Благодаря этому в расчете используются две пары переменных b и k: первое приближение к решению и само решение.

 



[1] Этот прием в нашей книге где-то уже описан, но… «повторение – мать учения».

[2] Как их ввести – см. совет 14, совет 18 и совет 19.

[3] Наши пары скобок дополнительно отличаются цветом.