Решение задач аппроксимации и интерполяции функций средствами пакета Scilab
Поможем в ✍️ написании учебной работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой

 

Для выполнения полиномиальной аппроксимации в системе 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.