Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Система компьютерной математики Octave. Лабораторный практикум
.pdf
В области имеются два цементных завода и три потребителя их продукции –
три крупных домостроительных комбината. В таблице указаны суточные объемы производства цемента, суточные потребности в нем комбинатов и стоимость перевозки 1 т цемента от каждого завода к каждому комбинату.
Заводы
Стоимость перевозки 1 т цемента, руб. Производство
Комбинат 1 Комбинат 2 Комбинат 3
цемента, т
1 100 150 250 40
2 200 300 300 60
Потребности, т 50 20 30
Требуется составить план суточных перевозок цемента с целью минимизации транспортных расходов.
*Дополнительно исследовать чувствительность оптимального решения
к изменению параметров задачи.
Лабораторная работа № 5
ИНТЕРПОЛЯЦИЯ И АППРОКСИМАЦИЯ
Цель работы: изучить базовые возможности Octave по обработке экспери-
ментальных данных.
Пусть функция y=f(x) задана (или экспериментально определена) только
при некоторых значениях переменной x. Будем называть эти значения базовыми или узловыми точками. Для приближенного определения функции
в произвольных точках используются методы интерполяции и аппроксимации.
Принципиальное отличие этих методов заключается в том, что при интерполяции значение интерполирующей функции в узловых точках совпадает со значениями табличной функции f(x) в тех же точках. В то же время значения аппроксимирующей функции в узловых точках обычно не совпадают со значениями
табличной функции f(x) в тех же точках.
Наиболее простым методом интерполяции является метод ближайшего соседа (или ступенчатая интерполяция) – метод интерполяции, при котором
в качестве промежуточного значения выбирается ближайшее известное значение функции. Однако точность этого метода невелика.
Следующим по точности методом является метод линейной интерполяции:
известные точки табличной функции последовательно соединяются отрезками
прямой линии. В случае, если значения табличной функции заданы только в
двух точках, это единственный способ интерполяции. При большем числе точек
можно использовать интерполяцию более высокого порядка, в частности интерполяцию кусочно-кубическими многочленами и кубическими сплайнами. В
этом случае достигается непрерывная дифференцируемость ("гладкость") интерполяционной функции.
70

Пакет Octave содержит целый ряд встроенных функций, использующих различные методы интерполяции таблично заданных функций одной и нескольких
переменных.
Пусть табличная функция задана в узловых точках парой векторов X, Y.
Обозначим набор точек, в которых мы будем вычислять значения интерполирующей функции, через Xi. Тогда функция
interpol1(X, Y, Xi, 'метод')
вернет вектор Yi – значения интерполирующей функции в точках, заданных
вектором Xi. Параметр "метод" может принимать следующие значения:
'nearest'
– значение вектора Yi в точке интерполяции берется равным
значению табличной функции в ближайшей узловой точке;
'linear'
– значение вектора Yi в точке интерполяции линейно зависит от
значений табличной функции в двух ближайших (соседних) узловых точках;
'cubic'
– значение вектора Yi определяется с помощью кусочнокубического многочлена, построенного на каждом отрезке, ограниченном соседними узловыми точками. Этот метод обеспечивает непрерывность интерполяционной функции и ее первой производной;
'spline'
– значение вектора Yi определяется с помощью кубического
сплайна, построенного на наборе узловых точек. Этот метод обеспечивает непрерывность интерполяционной функции и ее первой и второй производных.
Выберем в качестве таблично заданной функцию Y = sin(X), где X есть век-
тор 0:pi/3:2*pi, а в качестве набора точек интерполяции – вектор Xi =
0:pi/20:2*pi.
По умолчанию (если не указан метод интерполяции) используется линейная
интерполяция. Напишем и выполним программу:
x=0:pi/3:2*pi;
y=sin(x);
xi=0:pi/20:2*pi;
yi=interp1(x,y,xi,'linear'); % метод по умолчанию
hold on
plot(xi,yi,'linewidth',2)
plot(xi,sin(xi),'linewidth',2)
plot(x,sin(x),'ok','linewidth',2)
hold off
Получим следующую картинку (красный график – функция y=sin(x), вычисленная во всех точках интерполяции по исходной формуле, синий график –
результат работы функции interp1):
71

Изменим метод интерполяции на ступенчатую интерполяцию:
yi=interp1(x,y,xi,'nearest');
Получим еще менее точное приближение к исходной функции:
Наиболее точный результат обеспечивает метод интерполяции кубическими
сплайнами:
yi=interp1(x,y,xi,'spline');
На рисунке ниже видно, что график интерполяционной функции практически совпадает с исходной функцией.
72

Рассмотрим теперь пример интерполяции функции двух переменных. Пусть
функция
),( yxyxf +=
22
, график которой есть конус, известна на прямо-
угольной сетке узловых точек. Для построения интерполяционной функции используем встроенную функцию
Zi = interp2(X, Y, Z, Xi, Yi, 'метод');
interp2
. Синтаксис вызова функции:
где X, Y – сетка узловых точек;
Z – значения исходной функции в узловых точках;
Xi, Yi – набор точек интерполяции;
'метод' – используемый метод, значения этого параметра те же, что и
в случае одномерной интерполяции функцией interp1;
Zi – возвращаемый двумерный массив значений функции в точках интер-
поляции.
Порядок действий:
1) Построим сетку узловых точек с помощью функции
[x,y] = meshgrid( -2:2 );
Так как функции
meshgrid
в данном случае передается только один параметр,
meshgrid
:
то указанный диапазон используется и для переменной x, и для переменной y.
2) Затем вычисляем значение исходной функции в узловых точках:
z = sqrt(x.^2 + y.^2);
3) Теперь строим сетку интерполяционных узлов и вычисляем в них значе-
ния интерполяционной функции
[xi, yi] = meshgrid( -2:0.2:2 );
zi = interp2(x,y,z, xi,yi);
4) Визуализируем результаты (слева используется сетка узловых точек,
справа – интерполяционная сетка):
subplot(1,2,1)
surf(x,y,z)
subplot(1,2,2)
surf(xi,yi,zi)
73

Результат интерполяции (по умолчанию используется метод
linear
):
Метод
linear
использует билинейную интерполяцию на каждом элемен-
тарном прямоугольнике.
Сравним полученную картинку (слева) с результатом интерполяции бикубическим сплайном (справа):
Из рисунка видно, что в вершине конуса линейная интерполяция дает правильные результаты, а сплайновая – нет.
Замечание. Функция
одном рисунке. Синтаксис функции
subplot
позволяет разместить несколько графиков на
subplot(rows, cols, index)
указывает место графика в прямоугольной области, условно поделенной на rows строк
и cols столбцов. Сквозная нумерация мест идет слева направо и сверху вниз.
Для аппроксимации таблично заданной функции пользователь может ис-
пользовать функции
polyfit(x,y,n)
, которая возвращает коэффициенты полинома степени n, аппроксимирующего исходную функцию y=f(x) методом
наименьших квадратов, и
polyval(p,x)
, которая возвращает значения поли-
нома p(x) в точках, заданных вектором x.
74

Пример 1. Пусть исходная функция задана таблицей:
x 1 2 3 4 5
y 8.3 6.4 5.2 3.1 -0.7
Аппроксимируем значения функции полиномом первой степени (линейная
аппроксимация):
x = [1, 2, 3, 4, 5];
y = [8.3, 6.4, 5.2, 3.1, -0.7];
n = 1;
p=polyfit(x, y, n)
В командное окно будут выведены коэффициенты аппроксимирующего по-
линома
p =
-2.1300 10.8500
Продолжим программу. Построим в одном окне график аппроксимирующей
функции с мелким шагом и точки, соответствующие табличной функции:
w=1:0.01:5;
pw=polyval(p,w);
hold on
plot(w,pw,'linewidth',2)
plot(x,y,'ok','linewidth',2)
grid on
hold off
На графике показан полученный результат:
75

Чтобы получить квадратичную и кубическую аппроксимацию таблично за-
данной функции, достаточно изменить значение параметра n.
Ниже приведены графики аппроксимирующих многочленов второго
и третьего порядка.
Коэффициенты аппроксимирующих полиномов:
при n = 2:
при n = 3:
-0.33571 -0.11571 8.50000
-0.20000 1.46429 -4.83571 11.86000
Попробуем теперь выяснить, какая из приведенных аппроксимаций лучше.
Для этого вычислим в программе среднее значение квадрата отклонения значений аппроксимирующей функции от таблично заданных значений:
px=polyval(p,x)
S=sum((y-px).^2)/5
Получим:
– для n = 1 : S = 2.1630/5 = 0.4326
– для n = 2 : S = 0.58514/5 = 0.11703
– для n = 3 : S = 0.0091429/5 = 0.0018286
При n = 4 S практически равно нулю, так как задание пяти точек однозначно
определяет полином четвертой степени, проходящий точно через эти точки.
Следовательно, в этом случае мы имеем не аппроксимацию, а интерполяцию
таблично заданной функции.
76

xxf
sin)(
=
Полученные данные свидетельствуют о том, что, повышая степень аппроксимирующего полинома, мы также повышаем точность аппроксимации. Однако
этот вывод верен лишь отчасти. Если значения таблично заданной функции, как
это часто бывает на практике, содержат значительную погрешность, то при повышении степени полинома чересчур точное следование табличным данным
может дать неверный результат.
Чтобы добавить к точным данным некоторую погрешность, используем генератор псевдослучайных чисел. Имеющиеся в Octave возможности:
1) функция
rand(n,m)
– возвращает матрицу nxm вещественных псевдо-
случайных чисел, равномерно распределенных в диапазоне (0;1);
2) функция
randn(n,m)
– возвращает матрицу nxm вещественных псевдо-
случайных чисел, распределенных нормально со следующими параметрами:
– математическое ожидание m = 0;
– среднеквадратичное отклонение s = 1.
Обычно погрешность экспериментальных данных распределена по нормальному закону. Чтобы получить нормальное распределение с произвольными
m и s, нужно воспользоваться формулой
Пример 2. Рассмотрим в качестве табличной функцию
чайной погрешностью и аппроксимируем ее полиномом второго порядка. Про
грамма
:
x=0:pi/6:pi;
s=0.1;
y=sin(x)+s*randn(1,length(x));
p=polyfit(x,y,2)
w=0:pi/60:pi;
yw=polyval(p,w);
hold on
m+s*randn(n,m)
.
со слу
-
-
plot(w,yw,'linewidth',2)
plot(x,y,'o','linewidth',2)
Результат
p =
-0.401278 1.255306 -0.037232
и его график (точками обозначены значения аппроксимируемой функции
–
коэффициенты аппроксимирующего полинома
77
).

−
=
Следует понимать, что при повторном запуске результаты расчета и сам
график будут немного другими из-за случайного характера погрешности исходных данных. Если убрать погрешность, то коэффициенты аппроксимирующего полинома немного изменятся. В этом случае получим
.
p =
-0.399328 1.254526 -0.014240
В заключение рассмотрим еще один метод аппроксимации – аппроксимацию многочленами (полиномами) Чебышёва.
Многочлен Чебышёва первого рода Tn(x) есть многочлен степени n, который меньше всего отклоняется от нуля на отрезке [-1; 1]. Многочлены Чебышёва играют важную роль в теории приближений, поскольку корни многочленов
Чебышёва первого рода используются в качестве узлов при интерполяции
функций алгебраическими многочленами.
Для вычисления многочленов Чебышёва n-ой степени используются соотношения:
T0 = 1
T1 = x
при n>1
)()(2)(
xTxxTxT
21
nnn −−
Программная реализация.
Сначала задаём T0 и T1:
p = [1];
q = [1,0];
Затем для заданного n (например, для n = 5) вычисляем полином Чебышёва
n-ой степени:
n = 5;
78

for i=1:n
next=[[2*q, 0]-[0, 0, p]];
p = q;
q = next;
end
Результат – вектор p, содержащий коэффициенты найденного полинома.
Точки интерполяции есть корни полинома p. Вычислим их:
xp = roots(p)
Получим
xp =
-0.95106
-0.58779
0.95106
0.58779
0.00000
Продолжим программу:
yp=cos(pi*xp);
R=polyfit(xp,yp,n);
w=-1:0.01:1;
yw=polyval(R,w);
Нанесем на график:
– точки интерполяции (xp, yp);
– график интерполяционного полинома (сплошная синяя линия);
– график исходной функции (пунктирная красная линия):
hold on
plot(xp,yp,'ok','linewidth',2)
plot(w,yw,'-b','linewidth',2)
plot(w,cos(pi*w),':r','linewidth',2)
grid on
Теперь заменим точки интерполяции равномерной сеткой:
n = 5
x=-1:2/(n-1):1;
y=cos(pi*x);
R=polyfit(x,y,n);
w=-1:0.01:1;
yw=polyval(R,w);
hold on
plot(x,y,'ok','linewidth',2)
plot(w,yw,'-b','linewidth',2)
plot(w,cos(pi*w),':r','linewidth',2)
grid on
Разместив рисунки рядом, мы увидим, что во втором случае погрешность
интерполяции на концах отрезка существенно больше.
79
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
