Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Система компьютерной математики Octave. Лабораторный практикум

.pdf
Скачиваний:
0
Добавлен:
08.09.2026
Размер:
2 Мб
Скачать
☆
В области имеются два цементных завода и три потребителя их продукции – три крупных домостроительных комбината. В таблице указаны суточные объе­мы производства цемента, суточные потребности в нем комбинатов и стои­мость перевозки 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
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]