Для выполнения полиномиальной аппроксимации в системе Scilab используется функция
[a,err]=datafit(R,z,a0),
где: R– функция, с помощью которой можно вычислить разность между заданными и расчетными значениями (y-f(x,a0,a1,…,ak )) аппроксимируемой и аппроксимирующей функциями в узловых точках;
z – матрица исходных данных (первая строка – массив х, вторая строка – массивy);
a 0 – вектор начальных коэффициентов (нулевой вектор из k элементов);
a – вектор коэффициентов полинома степени k аппроксимирующей функции (a0,a1,…,ak);
err– сумма квадратов отклонений аппроксимируемой и аппроксимирующей функции.
Функция datafitвозвращает вектор коэффициентов полинома степени k, который с наименьшей среднеквадратической погрешностью аппроксимирует таблично заданную функцию. Результатом является вектор строка длиной k+1, содержащий коэффициенты полинома в порядке увеличения степеней. Как правило, степень полинома много меньше количества узлов (k<<n).
Перед проведением интерполяции с использованием функции datafit, элементы вектора начальных коэффициентов полинома следует обнулить.
На рис. 2.2.2-1 приведен пример линейной аппроксимации таблично заданной функции. Функция R(a,z) определяет разности между исходной и аппроксимирующей функцией, а сумма квадратов отклонений возвращается через переменную err.
--> // Загрузка и выполнение файла-сценарияРИС2221
--> clear
-->exec('РИС2221.sce', 0);
err =
17.371602
a =
-7.6955977
7.412379
--> y1 = poly(a', 'x', 'c')
y1 =
-7.6955977 +7.412379x// Линейный полином y 1
-->y1x = horner(y1, x) // Значение полинома y 1 в точках х
y1x =
2.0887426 2.6817329 3.4229708 4.3124562 4.9054466 5.6466845 6.3879223
7.1291602 7.9445219 8.611636 9.5011215 8.9081312 10.909474
--> plot(x, y1x, 'mx');
--> mtlb_hold('on');
--> plot(x, y, 'o');
Рис. 2.2.2-1. Линейная аппроксимация функцией datafit
Заголовок, оси и легенду!!! Лучше линией с кружочком или крестиком!
Рассмотрим пример кубической аппроксимации (рис.2.2.2-2).
--> // Загрузка и выполнение сценария РИС2222 – кубической аппроксимации --> --> clear -->exec('РИС2222.sce', 0); err = 1.745866 a = [-47.407916 87.939048 -51.081064 10.199285] -->P3 = poly(a', 'x', 'c') P3 = -47.407916 +87.939048x -51.081064x2 +10.199285x3 // Кубический полином y 3 -->y3x = horner(P3, x) // Значение полинома P 3 в точках х y3x = 3.1260106 3.5747038 3.9908489 4.3587432 4.5732778 4.8619532 5.23053 5.740204 6.5368498 7.4276265 9.0321418 7.9052934 12.787137 --> plot(x, y3x, 'mx'); mtlb_hold('on'); plot(x, y, 'o'); |
Рис. 2.2.2-2. Кубическая аппроксимация функцией datafit
Если коэффициенты аппроксимирующего полинома известны, то его можно описать как встроенную функцию def (рис.2.2.2-3). Тогда для проведения дальнейших расчетов при вычислении значений функции в нужных точках достаточно обратиться к этой функции.
--> // Получение двух аппроксимирующих функций в явном виде --> a=[-7.6955977 7.412379]; --> c=[-47.407916 87.939048 -51.081064 10.199285]; --> deff('y=f1(x)','y=a(1)+a(2).*x'); --> deff('y=f3(x)','y=c(1)+c(2).*x+c(3).*x.^2+c(4).*x.^3'); --> [f1(1.85),f3(1.85)] ans = 6.01728688.7324291 6.0173035 5.024308 |
Рис. 2.2.2-3. Вычисление значений функций в точке x=1.85 с использованием линейной и кубической аппроксимации
Как уже было отмечено выше, интерполяция является частным случаем аппроксимации, поэтому очевидно, что для случая, когда степень аппроксимирующего многочлена на единицу меньше количества узловых точек
(k=n-1), в силу единственности полинома степени n-1, функция datafit решает задачу интерполяции.
В следующем примерена рис. 2.2.2-4., используя в качестве узлов интерполяцииx=1,2,4,5, требуется построить полином, задав в качестве интерполирующий функции, функцию вида y(x)=sin(x), и проверить точность полученного значения полинома в точке a=2.5.
--> // Загрузка сценария РИС2224– интерполяция в точке и его выполнение --> clear -->exec('Рис2224.sce', 0) err = 6.230D-10 c = -0.8515488 2.7612598 -1.196154 0.1279213 P3 = -0.8515488 +2.7612598x -1.196154x2 +0.1279213x3 --> P3x = horner(P3, 2.75) P3x = 0.3563652 --> y = sin(2.75) y = 0.381661 |
Рис. 2.2.2-4. Интерполяция в точке с использованием функции datafit
Для этого, поскольку интерполируемая функция задана аналитически, сначала вычислим значения функции y(x) в заданных узлах, а затем сформируем вектор z, заполнив его элементы вычисленными значениями интерполируемой функции. Далее выполним интерполяцию с использованием функции datafit, предварительно обнулив элементы вектора начальных приближений коэффициентов c. В примере получено также и аналитическое выражение интерполирующей функции (полином 3-го порядка), с использованием которого вычислено значение в точке 2.5. Следует отметить, что err - выходной параметр функции datafit, имеет небольшое значение, но не точно равен нулю, что связано с неустранимой ошибкой вычислений. Графики узловых точек и интерполяционного полинома приведены на рис. 2.2.2-4.
В Scilab для линейной сплайн-интерполяции и вычисления значения в заданной точке служит специальная функция interpln, которая имеет формат:
y= interpln (z , x),
гдеz– матрица исходных данных, состоящая из вектора значений узлов и вектора значений в узлах;
х – точка, в которой проводится интерполяция;
y– результат выполнения функции interpln, равный значению линейного сплайна в точке x.
Выполним линейную сплайн-интерполяцию и получим значение функции в точке х=0.58 (рис. 2.2.2-5),используя таблично заданную функцию:
x | -1 | 0 | 1 | 2 |
y(x) | 4 | 2 | 6 | 1 |
---> // Линейная сплайн-интерполяция -->x = [-1 0 1 2]; // Вектор аргументов -->y = [4 2 6 10]; // Вектор значений функции -->z = [x; y]; -->f = interpln(z, 0.58) // Линейная сплайн-интерполяция в точке f = 4.32 |
Рис. 2.2.2-5. Линейная сплайн-интерполяция с использованием функции
interpln в точке х=0.58
Построение кубического сплайна в Scilab состоит из двух этапов. На первом этапе вычисляются коэффициенты сплайна с помощью функции:
koeff= splin (x , y),
где: х – строго возрастающий вектор значений узлов;
y– вектор значений интерполируемой функции в узлах, имеющий тот же размер, что и х;
koeff– выходной параметр, содержащий коэффициенты кубического сплайна.
На втором этапе рассчитывается значения интерполяционного полинома в точках, заданных вектором t:
p=interp(t,x,y,koeff),
где: х и y – имеют тоже назначение, что и в функции splin ;
t – вектор абсцисс, в которых требуется вычислить значения функции;
koeff– параметр, содержащий коэффициенты кубического сплайна;
p – выходной параметр, содержащий вектор ординат, являющихся значениями кубического сплайна в точках t.
Рассмотрим пример использования кубической сплайн-интерполяции на примере приближенного вычисления функции в точках 0.702, 0.512 и 0.698, не совпадающими с узлами таблично заданной функции:
x | 0.43 | 0.48 | 0.55 | 0.62 | 0.7 | 0.75 |
y(x) | 1.635 | 1.732 | 1.876 | 2.033 | 2.228 | 2.359 |
На рис.2.2.2-6 приведены команды, необходимые для проведения интерполяции таблично заданной функции кубическими сплайнами, и вычисление значений функции в заданных точках, а также графики интерполируемой функции и интерполирующей функций.
--> // Загрузка сценария РИС22206 – кубической сплайн-интерполяции --> // в заданных точках и его выполнение --> clear --> exec('РИС22206.sce', 0) ans = 0.702 0.512 0.608 2.2309267 1.7972605 2.0028862 |
Рис. 2.2.2-6. Выполнение кубической сплайн-интерполяции
с использованием функции interpв заданных точках
2.2.3 Контрольные вопросы
1) Как формулируется постановка задачи аппроксимация функции?
2) Как формулируется постановка задачи интерполяция функции?
3) Что такое аппроксимация функции, и в каких случаях она используется?
4) В чем отличие аппроксимации от интерполяции?
5) Какой метод аппроксимации реализован в функции data fit?
6) В чем суть метода наименьших квадратов?
7) Как оценить погрешность в методе наименьших квадратов?
8) Какие способы задания функций известны?
9) Что является результатом выполнения функции datafit?
10) В каком случае функция datafit решает задачу интерполяции и почему?
11) Назначение и формат функции interpln?
12) Что является выходным параметром функции datafit?
13) Каким параметром определяется тип интерполяции в функции
interpln ?
2.3. Приближенное вычисление
производных и интегралов
2.3.1. Постановка задачи вычисления производных
и конечных разностей
Производной функции y = f ( x ) называется одна из функций:
,
которая, при каждом значении независимой переменной х, равна пределу отношения приращения функции к приращению независимой переменной х при стремлении Δ х к нулю.
Процесс вычисления производной называется дифференцированием функции. Дифференцирование происходит в соответствии с правилами дифференцирования. Производная характеризуется порядком, то есть производная от первой производной называется производной второго порядка, от второй – третьего порядка и так далее. Однако такое вычисление производных возможно только тогда, когда функция задана аналитически и при этом достаточно проста. Именно поэтому в случае, если функция задана таблицей значений, для нахождения производной функции в каком-либо узле заданной таблицы обычно используют интерполяционные многочлены невысоких степеней, которые хорошо приближают функцию к окрестности значений этого узла. Для этого обычно используют выражения, основанные на таблице конечных разностей. Наиболее известные из них – формулы Ньютона [22]. Но их применение возможно только, если узлы таблицы являются равноотстоящими.
Чтобы вычислить производные с использованием таблицы конечных разностей, предположим, что решается следующая задача: при заданной таблице значений функции yi=f(xi), где i=0,1,…,n, где шаг изменения xi является постоянным (h =xi-xi-1=const), требуется определить таблицу значений производных в точках xi.
С использованием значений конечных разностей производные функции в точках xi можно определить, как:
Например, когда значения производных вычисляются с использованием правых конечных разностей:
Очевидно, что приведенная выше формула позволяет определить значения производных во всех точках, кроме xn. Вычислить производную в точке xn можно по аналогичной формуле, в которой используются левые конечные разности:
Поскольку использование этих выражений требует вычисления конечных разностей, то точность вычисления производной напрямую зависит от величины шага между узловыми точками таблицы.
Рассмотрим имеющиеся в системе Scilab средства дифференцирования функций, заданных аналитически и таблично, а также средства, позволяющие проводить вычисления конечных разностей.
Дата: 2019-11-01, просмотров: 1757.