Как сгладить график в MATLAB?
У меня есть около 9000 точек, которые отображены на графике:

На самом деле, график не такой плавный, как я хотел. Есть ли какой-то способ сгладить график до необходимой степени?
Или какая-то форма порога, чтобы я мог выборочно сгладить слишком заметные части?
Поделиться Источник 04 октября 2009 в 09:03
5 ответов
Если у вас есть Инструментарий для подбора фигур, вы можете использовать функцию smooth . Метод по умолчанию является скользящим средним размера 5 (метод может быть изменен). Пример:
% some noisy signal Fs = 200; f = 5; t = 0:1/Fs:1-1/Fs; y = sin(2*pi*f*t) + 0.6*randn(size(t)); subplot(411) plot(y), title('Noisy signal') % smoothed signal subplot(412) plot( smooth(y, 5, 'moving') ), title('smooth') ylim([-2 2])
Если нет, вы можете использовать свою собственную оконную функцию, используя функцию filter из core MATLAB:
% equivalent to a moving average window wndwSize = 5; h = ones(1,wndwSize)/wndwSize; subplot(413) plot( filter(h, 1, y) ), title('filter + square window') % Guassian h = pdf('Normal',-floor(wndwSize/2):floor(wndwSize/2),0,1); subplot(414) plot( filter(h, 1, y) ), title('filter + Guassian window')

Поделиться 04 октября 2009 в 11:11
Простой (специальный) способ — просто взять взвешенное среднее (получаемое по alpha ) в каждой точке с соседями:
data(2:n-1) = alpha*data(2:n-1) + (1-alpha)*0.5*(data(1:n-2)+data(3:n))
или некоторые вариации. Да, чтобы быть более сложным, вы можете сначала преобразовать свои данные Фурье, а затем отсечь высокие частоты. Что-то вроде:
f = fft(data) f(n/2+1-20:n/2+20) = zeros(40,1) smoothed = real(ifft(f))
Это вырезает 20 самых высоких частот. Будьте осторожны, вырезая их симметрично, иначе обратное преобразование больше не является реальным. Вам нужно тщательно выбрать частоту отсечения для правильного уровня сглаживания. Это очень простой вид фильтрации (фильтрация в частотном домене), поэтому вы можете попробовать мягко вырезать частоты высокого порядка, если искажение неприемлемо.
Поделиться 04 октября 2009 в 09:16
FFT не плохая идея, но, вероятно, здесь она излишна. Скользящие или скользящие средние дают в целом плохие результаты и должны быть избеганы для чего-то, кроме поздней домашней работы (и белого шума).
Я бы использовал фильтрацию Савицкого-Голей (в Matlab sgolayfilt(. )). Это даст вам лучшие результаты для того, что вы ищете — некоторое локальное сглаживание при сохранении формы кривой.
Поделиться 05 ноября 2009 в 07:11
Иногда вам следует избегать использования мобильного среднего, так как он не является надежным для внешних пользователей. Мобильный медиан предпочтительнее в таких случаях.
Поделиться 14 июля 2011 в 14:36
Сначала я бы попробовал отобразить скользящее среднее на нескольких точках, например, 5 или 10. Таким образом, одно несоответствие значений оказывает небольшое влияние на график. Конечно, это зависит от того, насколько точным вам нужен график.
сглаживание 2D-графика в MATLAB
Мой вопрос, как я могу его сгладить? Не нашел способа сделать то, что я хочу в документации.
person Seatless schedule 20.05.2013 source источник
Ответы (2)
Возможно, вы могли бы использовать spline следующим образом
x1 = 0:.1:25; y1 = spline(x,y,x1); plot(x,y,x1,y1);
person fpe schedule 20.05.2013
Это то, что я искал. Спасибо. — person Seatless; 20.05.2013
Обратите внимание, что это НЕ сглаживает, как вы просили. — person ; 20.05.2013
Вы можете использовать кубический сглаживающий сплайн
p = 1e-2; % initialize smoothing constant fn = csaps(x, y, p); % get ppform of the cubic smoothing spline y1 = ppval(fn, x); % evaluate piecewise polynomial
Для сравнения:
plot(x,y); hold on; plot(x, y1, '-r');
person fnery schedule 20.05.2013
Да. Это один хороший вариант. Можно также просто сделать размытие по Гауссу, используя conv для выполнения этой работы. — person ; 20.05.2013
Следует отметить, что csaps требует установки Curve Fitting Toolbox. — person Eitan T; 20.05.2013
Как сгладить график из малого числа точек и нанести на него эти точки?

Нанести точки на график
Здраствуйте) у меня такой вопрос. есть программа, которая определяет попадание точек в заданную.

Как сгладить график функции?
Помогите сделать график более гладким. figure(2) y2=2*log(x).*sin(x); plot(x,y2,’b’), grid.

Сформировать массив их 120 эл-тов. Найти все простые числа. Построить график и нанести на числовую ось.
Сформировать с помощью функции RND массив их 120 элементов. Найти все простые числа. Построить.
Как сгладить график построенный по точкам в Mathcad Prime
Помогите научиться сглаживать графики в Mathcad Prime.
5236 / 3564 / 378
Регистрация: 02.04.2012
Сообщений: 6,471
Записей в блоге: 17

Сообщение было отмечено как решение
Решение
Чтоб нанести точки нужно указать в plot тип маркера точек:
plot(R,d,’or’) — линий не будет,а точки будут отображены красными кружками.
Можно вместо «o» написать «.», «*» и много чего еще, чего я не помню но есть в help-е
Чтобы сделать сглаживание пожалуй можно применить spline-интерполяцию:
1 2 3 4 5 6 7
clear, clc R = [0 75 200 300 430]; d = [8.5 16 29.7 63.7 79.6]; x = linspace(min(R),max(R),100); y = spline(R,d,x); % кажется так plot(R,d,'or', x,y,'-b') grid on
Аппроксимация в Matlab

Приветствую! Сегодня продолжаем говорить об обработке экспериментальных данных. Сегодняшняя статья — продолжение предыдущей темы: Интерполяция в Matlab. Настоятельно советую с ней ознакомиться перед чтением данной статьи. По сути аппроксимация в Matlab очень похожа на интерполяцию, однако, для её реализации используются другие правила и функции.
Аппроксимация

Относительно интерполяции, аппроксимация получила более широкое распространение. Сущность этого метода состоит в том, что табличные данные аппроксимируют кривой, которая не обязательно должна пройти через все узловые точки, а должна как бы сгладить все случайные помехи табличной функции.
МНК (Метод Наименьших Квадратов)
Одним из самых популярных методов аппроксимации в Matlab и в других средах, это Метод Наименьших Квадратов ( МНК ). В этом методе при сглаживании опытных данных аппроксимирующую кривую стремятся провести так, чтобы её отклонения от табличных данных по всем узловым точкам были минимальными. Суть МНК заключается в следующем: для табличных данных, полученных в результате эксперимента, отыскать аналитическую зависимость, сумма квадратов уклонений которой от табличных данных во всех узловых точках была бы минимальной. Аппроксимация в Matlab по МНК осуществляется с помощью функции polyfit. Функция p = polyfit(x, y, n) находит коэффициенты полинома p(x) степени n, который аппроксимирует функцию y(x) в смысле метода наименьших квадратов. Выходом является строка p длины n+1, содержащая коэффициенты аппроксимирующего полинома.
Примеры задач
Разберём задачу, в которой разрешается использование встроенных матлабовских функций. Осуществить аппроксимацию в Matlab табличных данных x = [0, 0.1 , 0.2, 0.3, 0.5] и y = [3, 4.5, 1.7, 0.7, -1] . Применяя метод наименьших квадратов, приблизить ее многочленами 1-ой и 2-ой степени. Для каждого определить величину среднеквадратической ошибки. Построить (на одном листе) графики и заданной таблично функции (ломанная линия) и приближающих ее многочленов 1-ой и 2-ой степени.
x = [0, 0.1 , 0.2, 0.3, 0.5]; y = [3, 4.5, 1.7, 0.7, -1]; grid on plot(x, y, '*r'); xi = min(x):0.1:max(x); N = 1; % степень coeff1 = polyfit(x, y, N); y2 = 0; for k=0:N y2 = y2 + coeff1(N-k+1) * xi.^k; end hold on; plot(xi, y2, 'r'); N = 2; coeff2 = polyfit(x, y, N); y3 = 0; for k=0:N y3 = y3 + coeff2(N-k+1) * xi.^k; end hold on; plot(xi, y3, 'g'); std(y-(coeff1(1)*x+coeff1(2))) std(y-(coeff2(1)*x.^2+coeff2(2)*x+coeff2(3)))

Вывод:
ans = 0.9253
ans = 0.8973 Однако, встречаются задачи, где требуется реализовать аппроксимацию в Matlab без использования специальных функций.
Найти у(0.25) путём построения аппроксимирующего полинома методом наименьших квадратов согласно данным:
x: 0, 0.1, 0.2, 0.3, 0.5
y: 3, 4.5, 1.7, 0.7, -1
p: 0.5, 0.8, 1.6, 0.8, 0.1
Построить этот полином без учёта весовых коэффициентов с использованием определителя Вандермонда и стандартных операторов.
%Задаем массивы данных: x = [0; 0.1; 0.2; 0.3; 0.5]; y = [3;4.5;1.7;0.7;-1]; %Строим матрицу W – матрицу Вандермонда с вырезанным первым столбцом: W = vander(x); W = W(1:5,2:5); %Вычисляем элементы матрицы А как произведение транспонированной матрицы W и просто матрицы W A = W'*W; %Вычисляем элементы вектора b b = W'*y; %Решая систему уравнений Aa = b, находим значения вектор-столбца a: a = inv(A)*b %Это будут коэффициенты аппроксимирующего полинома. %Проверяем, используя методы MATLAB = функцию polyfit: qq = polyfit(x,y,3) %Получаем аппроксимированные значения y: x1 = [-0.2:0.001:0.7]; y1 = a(1)*x1.^3 + a(2)*x1.^2 + a(3)*x1 + a(4); %Строим график функции plot(x,y,'*'); hold on; grid on; plot(x1,y1,'Color','r'); %Находим значение в точке x = 0.25 x2 = 0.25; y2 = a(1)*x2^3 + a(2)*x2^2 + a(3)*x2 + a(4)

Вывод:
a =
228.1447
-176.0984
22.7745
3.1590
qq = 228.1447 -176.0984 22.7745 3.1590
y2 = 1.4113 Как видите встроенные функции для аппроксимации в Matlab укорачивают алгоритм почти вдвое. Существует также возможность реализации всего алгоритма через одну функцию, но для преподавателей студентов она скорее всего будет не приемлема. С помощью функции lsqcurvefit(fun,x0,xdata,ydata), где:
xdata,ydata– табличные значения аппроксимируемой функции;
x0 –стартовое значение параметров функции;
fun – функция аппроксимации, задаваемая пользователем С аналитически-теоретической стороны, существуют такие виды аппроксимации:
- Аппроксимация ортогональными классическими полиномами.
- Аппроксимация каноническим полиномом
Но на практике их реализацию требуют редко.
Вот и вся основная информация по аппроксимации в Matlab, если остались вопросы, задавайте их в комментариях.