Перейти к содержимому

Как сгладить график в маткаде

  • автор:

4.10. Сглаживание функций

Задача сглаживания таблично заданных функций часто возникает при обработке экспериментальных данных, поскольку при проведении эксперимента возможны разного рода погрешности, влияние не учитываемых факторов и т.п. Для сглаживания данных в Mathcad есть несколько функций, использующих разные алгоритмы. Одна из них — ksmooth(vx,vy,b) возвращает n- мерный вектор сглаженных значений вектора vy , вычисленных на основе распределения Гаусса. vx и vy — n-мерные векторы действительных чисел. Полоса пропускания b управляет степенью сглаживания.

Задача : Выполнить сглаживание таблично заданной функции (табл. 4.6) и построить графики.

Как сгладить график в маткаде

БлогNot. Сглаживающий сплайн в MathCAD

Сглаживающий сплайн в MathCAD

В отличие от интерполяционного сплайна, проходящего через известные точки i,fi> и уже реализованного в MathCAD с помощью встроенных функций interp и cspline , сглаживающий сплайн через измерения проходить не обязан. Зато он гораздо гибче и способен, при соответствующей настройке, компенсировать «аномальные» измерения или просто «загладить» данные не хуже МНК (точней, лучше — единичный «выброс» fi не «потянет» вверх или вниз весь сглаживающий сплайн, в отличие от полинома МНК со степенным базисом).

Постановка задачи следующая: пусть на сетке x1<x2<. <xN заданы измеренные значения f1, f2, . , fN некоторой функции f(x) . Требуется найти дважды непрерывно дифференцируемую функцию s(x) , которую на каждом интервале [xi,xi+1] можно представить в виде

где h=x-xi — расстояние до ближайшего слева узла сетки, c3,i , c2,i , c1,i , i = 1, 2, . N — 1 — коэффициенты сглаживающего сплайна на i-ом интервале по оси x , а yi — значения сглаживающего сплайна, вычисленные в узлах сетки xi , i = 1, 2, . N .

  • вещественный массив df длины N , dfi>0 , задаёт значения весов в узлах интерполяции, чем больше вес узла, тем сильнее будет заглаживаться функция в его окрестностях. При отсутствии дополнительной априорной информации о восстанавливаемой зависимости можно принять значения dfi одинаковыми, например, равными 1 ;
  • «глобальный» параметр сглаживания — вещественное значение sm (обозначается также α), sm>0 , задаёт общую меру сглаживания данных — с его ростом она увеличивается.

Выбор этих параметров, вообще говоря, представляет собой отдельную задачу.

В предлагаемом решении построение сглаживаюшего сплайна реализовано с помощью двух функций.

Функция SmoothSpline(x,f,df,sm) возвращает объект, состоящий из матрицы c коэффициентов сглаживающего сплайна размерностью 3*(N-1) и вектора y значений сглаживающего сплайна в узлах сетки (размерностью N ). Код функции здесь не привожу из-за её громоздкости — полторы страницы. Его можно увидеть, скачав приложенный файл, а вызвать функцию можно так:

вызов функции SmoothSpline
вызов функции SmoothSpline

Обратите внимание, что третье измерение «аномально», а остальные представляют собой значения f(xi)=xi 2 . Соответственно, завышен вес df3 (здесь и далее элементы матриц и векторов нумеруются с единицы, поэтому файл MathCAD начинается определением системной переменной ORIGIN:=1 ).

Также показан неплохой (для небольших значений N ) способ выбора значения параметра сглаживания sm .

Функция реагирует на ошибки в исходных данных — такие, как количество узлов сетки, меньшее двух, и отсутствие строгой упорядоченности по возрастанию значений xi .

Функция дополнительно использует только служебный вещественный массив r размерностью 7*(N+2) , то есть, достаточно экономична по памяти.

Тест и результат по нему сверен с материалами научно-исследовательского вычислительного центра МГУ, всё совпало 🙂

Вторая функция — GetSmoothSpline(x,dx,y,c) занимается построением сглаживающего сплайна по известной матрице коэффициентов c и значениям сплайна yi в узлах сетки xi , аргумент x внутри функции меняется от x1 до xlength(x) с шагом dx . Функция вернёт матрицу из двух вектор-столбцов — в первом будут содержаться значения аргумента, во втором — вычисленные значения сплайна. Воспользоваться функцией и затем наглядно вывести результаты сглаживания можно, например, так:

вызов функции GetSmoothSpline
вызов функции GetSmoothSpline

В качестве второго примера покажем, как сглаживающий сплайн умеет справляться с «аномальными» измерениями, возникающими в результате деятельности врагов народа каких-либо сбоев и не вписывающимися в «общую картину».

Данные на этот раз сгенерируем программно, просто «сняв» их с кусочка синусоиды, затем пару измерений сделаем сильно отличающимися от остальных:

данные с "аномальными" измерениями
данные с "аномальными" измерениями

Вот как справился сглаживающий сплайн с этими двумя геями «выбросами»:

обработка данных с аномальными измерениями, сглаживающий сплайн
обработка данных с аномальными измерениями, сглаживающий сплайн

Видно, что отклонений он почти не заметил.

Ну а хотите ещё лучше — обоснованно выбирайте веса узлов и параметр сглаживания.

Разумеется, сглаживающий сплайн не всесилен — например, если «перемельчить» сетку и переборщить с количеством «аномалий», он может пойти «вразнос», тогда для обработки таких данных придётся привлекать аппарат, способный учесть качественные априорные ограничения («а вот на этом интервале функция должна возрастать!»). Такой аппарат известен как дескриптивные сплайны, но статей о них я не писал уже давно, может, когда-нибудь 🙂

Иллюстрированный самоучитель по MathCAD 11

Сглаживание и фильтрация. Встроенные функции для сглаживания.

При анализе данных часто возникает задача их фильтрации, заключающаяся в устранении одной из составляющих зависимости y(xi). Наиболее часто целью фильтрации является подавление быстрых вариаций y(xi), которые чаще всего обусловлены шумом. В результате из быстроосциллирующей зависимости y(xi) получается другая, сглаженная зависимость, в которой доминирует более низкочастотная составляющая.

Наиболее простыми и эффективными рецептами сглаживания (smoothing) можно считать регрессию различного вида (см. разд. 15.2). Однако регрессия часто уничтожает информативную составляющую данных, оставляя лишь наперед заданную пользователем зависимость.

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

Несколько примеров программной реализации различных вариантов фильтрации приведены в данном разделе.

Встроенные функции для сглаживания

В Mathcad имеется несколько встроенных функций, реализующих различные алгоритмы сглаживания данных.

  • medsmooth(y,b) – сглаживание алгоритмом "бегущих медиан";
  • ksmooth(x,y,b) – сглаживание на основе функции Гаусса;
  • supsmooth(x,y) – локальное сглаживание адаптивным алгоритмом, основанное на анализе ближайших соседей каждой пары данных;
    • х – вектор действительных данных аргумента (для supsmooth его элементы должны быть расположены в порядке возрастания);
    • у – вектор действительных значений того же размера, что и х;
    • b – ширина окна сглаживания.

    Все функции имеют в качестве аргумента векторы, составленные из массива данных, и выдают в качестве результата вектор сглаженных данных того же размера. Функция medsmooth предполагает, что данные расположены равномерно.

    Подробную информацию об алгоритмах, заложенных в функции сглаживания, Вы найдете в справочной системе Mathcad в статье Smoothing (Сглаживание), находящейся в разделе Statistics (Статистика).

    Часто бывает полезным совместить сглаживание с последующей интерполяцией или регрессией. Соответствующий пример приведен в листинге 15.16 для функции supsmooth. Результат работы листинга показан на рис. 15.18 (кружки обозначают исходные данные, крестики – сглаженные, пунктирная кривая – результат сплайн-интерполяции). Сглаживание тех же данных при помощи "бегущих медиан" и функции Гаусса с разным значением ширины окна пропускания показаны на рис. 15.19 и 15.20, соответственно.

    Листинг 15.16. Сглаживание с последующей сплайн-интерполяцией:

    Рис. 15.18. Адаптивное сглаживание (листинг 15.16)

    Рис. 15.19. Сглаживание "бегущими медианами"

    Рис. 15.20. Сглаживание при помощи функции ksmooth

    Умные люди подскажите как мне в маткаде сгладить ступенчатую функцию?

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

    cspline(vx,vy) Returns a vector of second derivatives for data vectors vx and vy. This vector becomes the first argument of the interp function. The resultant spline curve is cubic at the endpoints.

    pspline(vx,vy) Same as cspline, except that the resultant spline curve is parabolic at the endpoints.

    lspline(vx,vy) Same as cspline, except that the resultant spline curve is linear at the endpoints.

    interp(vs,vx,vy,x) Returns a spline interpolated value of vy at a point x.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *