Решение задач аппроксимации и интерполяции в среде MatLAB. Интерполяция на неравномерной сетке
Аппроксимация
Сущность этого метода состоит в том, что табличные данные аппроксимируют кривой, которая не обязательно должна пройти через все узловые точки, а должна как бы сгладить все случайные помехи табличной функции.
МНК (Метод Наименьших Квадратов)
В этом методе при сглаживании опытных данных аппроксимирующую кривую стремятся провести так, чтобы её отклонения от табличных данных по всем узловым точкам были минимальными.
Суть МНК заключается в следующем: для табличных данных, полученных в результате эксперимента, отыскать аналитическую зависимость, сумма квадратов уклонений которой от табличных данных во всех узловых точках была бы минимальной.
Аппроксимация в Matlab по МНК осуществляется с помощью функции polyfit. Функция p = polyfit(x, y, n) находит коэффициенты полинома p(x) степени n, который аппроксимирует функцию y(x) в смысле метода наименьших квадратов. Выходом является строка p длины n+1, содержащая коэффициенты аппроксимирующего полинома.
Пример (аппроксимация с помощью встроенных MATLAB функций):
Осуществить аппроксимацию в 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
Интерполяция
Интерполяция (интерполирование) — процесс нахождения промежуточных значений по ряду данных, для восполнения пробелов между точными значениями приближенными. Точные значения так же называют узловыми точками.