Skip to content

Аппроксимация в 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)

Аппроксимация в Matlab
Вывод:
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, если остались вопросы, задавайте их в комментариях.

Скачать исходник первой задачи
Скачать исходник второй задачи

Опубликовано вMatlab

Будьте первым, кто оставит комментарий

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