- •Оглавление
- •Введение
- •Краткий обзор системы
- •Знакомство с интерфейсом Scilab
- •Функции, определяемые пользователем и процедуры
- •Циклы
- •Погрешность результата численного решения задачи
- •Приближенные вычисления определенных интегралов
- •Методы прямоугольников
- •Метод трапеций
- •Метод Симпсона
- •Квадратуры Гаусса
- •Методы Монте-Карло
- •Вычисление определенных интегралов в системе Scilab
- •Решение систем линейных алгебраических уравнений
- •Метод Гаусса
- •Формула Крамера
- •Метод простых итераций
- •Метод Зейделя
- •Метод отражений
- •Метод LU-разложений
- •Решение нелинейных алгебраических уравнений
- •Метод половинного деления
- •Метод секущих
- •Метод секущих (с изменяемым углом)
- •Метод Ньютона (касательных)
- •Метод Бернулли
- •Аппроксимация и интерполирование функций
- •Интерполяционный многочлен Лагранжа
- •Интерполяционная формула Ньютона
- •Интерполяционные формулы Гаусса
- •Линейная аппроксимация по методу наименьших квадратов
- •Кусочно-кубические сплайны
- •Анимация на плоскости
- •Анимация в пространстве
- •Метод Рунге-Кутта
- •Метод Эйлера
- •Метод Прогонки
- •Метод Пикара
- •Возможности Scilab для решения ОДУ
- •Список Литературы
73
for k = 1:n do
y = y+diffN(xx, f, 1, k-1)*Pn; Pn = Pn*(x-xx(k));
end endfunction
xx = [0, 0.25, 0.5, 0.75, 1]; |
//узлы интерполирования |
f = sin(xx); |
//наша функция |
d = 0.6;
printf("Newton: %g %g\n", interpolateNewton(d, xx, f, 5), sin(d)); //вывод результатов
– первое число – приближенное значение
Рис. 2. Результат работы Листинга_5. 2
3) Интерполяционные формулы Гаусса
Пусть узлы |
интерполирования |
x0 , x1 ,K, xn |
- |
равноотстоящие |
и точка |
||||||
интерполирования x |
находится в середине отрезка [a;b] |
“вблизи” узла xk , |
|||||||||
причем |
x > xk . Для |
построения |
интерполяционной |
формулы необходимо |
|||||||
привлекать |
узлы |
интерполирования |
в |
следующем |
порядке: |
||||||
xk , xk + h, |
xk |
− h,K, xk +ih, |
xk −ih . |
Обозначим |
t = |
x − xk |
|
и |
введем конечные |
||
h |
|
||||||||||
разности по формулам: |
|
|
|
|
|
|
|
||||
yk , f (xk − h, xk , xk + h) = |
2 yk −1 |
|
|
|
|
||||||
f (xk ) = yk , |
f (xk , xk + h) = |
|
и т.д. |
|
|||||||
|
|
|
|
h |
|
|
2! h2 |
|
|
|
|
Формула Гаусса для интерполирования вперед имеет вид:
P(xk +th) = yk + |
t |
yk + |
t(t −1) |
2 yk −1 |
+ |
t(t 2 −12 ) |
3 yk −1 +K+ |
|
|
|
|||||
1! |
2! |
|
3! |
|
|||
+ |
t(t 2 −12 )(t 2 − 22 )K(t 2 −(i −1)2 ) |
2i−1 yk −i+1 + |
t(t 2 −12 )(t 2 − 22 )K(t 2 −(i −1)2 )(t −i) |
2i yk −i . |
||||
|
|
|||||||
|
(2i −1)! |
|
|
|
(2i)! |
|
|
|
Если точка интерполирования |
x < xk , |
то |
узлы для |
построения следует |
||||
привлекать в следующем порядке: |
xk , xk |
− h, |
xk + h,K, xk |
−ih, xk +ih . Формула |
||||
Гаусса для интерполирования назад имеет вид:
74
P(xk +th) = yk + |
t |
|
yk −1 |
+ |
t(t +1) |
2 yk −1 |
+ |
t(t 2 −12 ) |
3 yk −2 +K+ |
|
|
|
|||||||
1! |
|
2! |
|
3! |
|
||||
+ t(t 2 −12 )(t 2 − 22 )K(t 2 −(i −1)2 ) 2i−1 yk −i + t(t 2 −12 )(t 2 − 22 )K(t 2 −(i −1)2 )(t +i) 2i yk −i . |
|
(2i −1)! |
(2i)! |
Приведем теперь реализацию данного метода интерполирования в системе Scilab. Найдем приближенное значение функции f (x) = sin x в точке x = 0.6 .
Листинг 5.3.
//Интерполяционная формула Гаусса
function y=diffG(xx, f, i, k) select (k),
case 0 then
y = f(i)
case 1 then y = (f(i+k)-f(i))
else y=(diffG(xx, f, i+1, k-1)-diffG(xx, f, i, k-1)) end
endfunction
function y = interpolateGauss(x, xx, f, n) k = -1;
for i = 1:n-1 do
if (x >= xx(i) & x <= xx(i+1)) then k = i;
end;
end;
if (k < 0) then
y = "nan"; return;
end;
t = (x - xx(k))/(xx(k+1)-xx(k)); y = 0;
Pn = 1.0; fac = 0; i = 0;
while(2*i+k+1 < n & k-i >= 0) do
y = y + diffG(xx, f, k-i, 2*i)*Pn; fac = fac+1;
Pn = Pn*(t+i)/(fac);
y = y + diffG(xx, f, k-i, 2*i+1)*Pn; fac = fac+1;
Pn = Pn*(t-i)/(fac); i = i+1;
end endfunction
xx = [0, 0.25, 0.5, 0.75, 1]; |
//узлы интерполирования |
f = sin(xx); |
//наша функция |
|
75 |
d = 0.6; |
|
printf("Gauss: %g %g\n", interpolateGauss(d, xx, f, 5), sin(d)); |
//вывод результатов – |
первое число – приближенное значение |
|
Рис. 3. Результат работы листинга_5. 3
4)Линейная аппроксимация по методу наименьших квадратов
Данный метод применяется для решения следующих задач:
• Необходимо определить величины x1 , x2 ,K, xN , которые нельзя
определить непосредственно, но известно, что они линейно зависимы, а коэффициенты этой зависимости можно получить в результате измерений. Таким образом, мы имеем переопределенную систему линейных алгебраических уравнений. Решение этой системы может быть получено решением задачи минимизации. Выполняя дифференцирование минимизируемой функции, приходим к линейной системе, которая будет иметь N уравнений и N неизвестных;
•Требуется дать приближенное аналитическое описание по таблично заданным данным. Из каких-либо соображений подбирается аппроксимирующая функция, а параметры этой функции подбираются так, чтобы сумма квадратов отклонений вычисляемых значений аппроксимирующей функции от заданных, была минимальной.
Для того чтобы определить, насколько далеко от данных лежит кривая
y= f (x) , можно воспользоваться следующими нормами:
¾E1 ( f ) = max f (xk ) − yk - максимальная ошибка,
1≤k ≤N
|
|
1 |
N |
|
|
||
¾ |
E2 ( f ) = |
∑ |
|
f (xk ) − yk |
|
- средняя ошибка, |
|
|
|
||||||
|
|
|
|||||
|
|
N k =1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
76 |
|
|
|
|
|
|
|
|
|
|
|
1 |
|
N |
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
¾ E3 ( f ) = ( |
|
|
∑ |
|
f (xk ) −y k |
|
2 )1/ 2 - среднеквадратичная ошибка. |
||||||||||||||
|
|
|
|
|
|
|
||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||
|
Пусть |
заданы |
|
|
|
|
N k =1 |
|
|
|
|
|
|
|
|
|
||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||
|
N |
точек |
|
с |
различными абсциссами |
{xk }. Величина |
||||||||||||||||||||
|
среднеквадратичной |
ошибки |
будет |
минимальной, когда |
каждая |
частная |
||||||||||||||||||||
|
|
|
|
|
|
|
|
|
1 |
|
|
|
N |
|
|
|
|
|
|
|
|
|||||
|
производная |
(E3 ( f ))2 = ( |
|
∑ |
|
f (xk ) − yk |
|
2 ) |
по неизвестным (в данном случае |
|||||||||||||||||
|
|
|||||||||||||||||||||||||
|
|
|
||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
N k =1 |
|
|
|
|
|
|
|
|
|
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||
|
неизвестные A и B ) будет обращаться в нуль, т.е. |
A и B являются решением |
||||||||||||||||||||||||
|
нормальной системы уравнений вида: |
|
|
|
|
|
|
|
||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
N |
|
|
|
N |
|
|
|
||||||
|
|
|
|
|
|
|
|
|
(∑xk )A + NB = (∑yk ), |
|
|
|
||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
k =1 |
|
|
|
k =1 |
|
|
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
N |
N |
|
|
|
N |
|
|
|
|||||
|
|
|
|
|
|
|
|
|
(∑xk2 )A + (∑xk )B = (∑xk yk ). |
|
|
|||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
k =1 |
k =1 |
|
|
|
k =1 |
|
|
|
||||||
Пример 5. 3. Пусть в результате экспериментального изучения зависимости y = f (x) |
||||||||||||||||||||||||||
получена таблица значений в пяти точках. |
|
|
|
|
|
|
|
|||||||||||||||||||
|
xi |
0.1 |
0.3 |
|
0.5 |
|
0.8 |
1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
yi |
0.3 |
0.55 |
0.65 |
0.4 |
0.25 |
|
|
|
|
|
|
|
|
|
|
|
|
|
y = P1 (x) = b0 +b1 x |
|
|||||
Найти аппроксимирующий |
полином первого |
порядка |
методом |
|||||||||||||||||||||||
наименьших квадратов. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
y = Ax + B - полинома первой степени: |
|||||||||
|
Записываем матрицы нормальной системы для |
|||||||||||||||||||||||||
n
С= ∑n
xi
i=1
n=5
∑n xi
i=1 ∑n xi2
i=1
|
n |
|
|
∑yi |
|
B = |
i=1 |
|
|
n |
|
|
∑yi xi |
|
i=1 |
|
|
n
∑xi = 0.1 + 0.3 + +0.5 + 0.8 +1 = 2.7
i=1
n
∑xi2 = 0.01+0.09 +0.25 +0.64 +1 =1.99
i=1
n
∑yi = 0.3 +0.55 +0.65 +0.4 +0.25 = 2.15
i=1
n |
|
|
|
|
|
|
|
|
|
|
|
|
∑xi yi = 0.1*0.3 +0.3*0.55 +0.5*0.65 +0.8*0.4 +1*0.25 =1.09 |
||||||||||||
i=1 |
|
|
|
|
|
|
|
|
|
|
|
|
т.е. расчетная система имеет вид |
|
a |
|
|||||||||
|
|
|
5 |
2.7 |
|
|
2.15 |
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
1 |
|
C = |
2.7 |
1.99 |
|
B = |
|
A = |
|
|||||
|
|
|
|
1.09 |
|
a2 |
|
|||||
|
5a |
|
+2.7a |
|
= |
2.15 |
a2 = −0.13 |
a1 = 0.5 |
||||
|
1 |
|
|
2 |
|
=1.09 |
||||||
2.7a1 +1.99a2 |
|
|
|
|
||||||||
тогда искомый полином примет вид |
P1 (x) = 0.5 −0.13x |
|||||||||||
77
5)Интерполирование сплайнами (кусочно-линейное интерполирование)
Иногда интерполирование по всей совокупности точек бывает недостаточным. В этих случаях можно воспользоваться объединением фрагментов графиков полиномов низкой степени и интерполированием между последовательными узлами. Самый простой в использовании – полином первой степени. Он создает ломаную, состоящую из отрезков, которые проходят через две точки. Для представления этой кусочнолинейной кривой используется формула угла наклона отрезка линии в точке:
Sk (x) = yk + |
( yk +1 |
− yk ) |
(x − xk ) , |
(*) |
|
(xk +1 |
− xk ) |
||||
|
|
|
где yk - заданное значение функции, полученное экспериментально в узлах
xk .
Функция |
Sk (x) называется линейным сплайном на отрезке [xk +1 , xk ]. |
|||||||||||
Пример |
5.3. |
Для функции |
y = f (x) , |
заданной |
таблично, |
осуществим |
||||||
кусочно-линейное интерполирование. |
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
x |
0 |
|
0.5 |
1 |
|
2 |
|
3 |
|
4 |
|
5 |
f (x) |
1.5 |
|
0 |
0 |
|
2 |
|
2 |
|
1 |
|
2 |
Осуществим кусочно-линейное интерполирование. Разобьем данную функцию на промежутки, определяемые соседними числами верхней строки таблицы, и на каждом из участков строим линейный сплайн (полином первой степени) по формуле (*):
|
−3x +1.5 |
при |
0 ≤ х ≤ 0.5, |
|
0 |
при |
0.5 ≤ х ≤1, |
S1 |
(x) = 2х− 2 |
при |
1 ≤ х ≤ 2, |
|
2 |
при |
2 ≤ х ≤ 3, |
|
− х+5 |
при |
3 ≤ х ≤ 4, |
|
|
|
|
|
|
при |
4 ≤ х ≤ 5. |
|
х−3 |
Приведем теперь реализацию данного метода интерполирования в системе Scilab. Найдем приближенное значение функции f (x) = sin x в точке x = 0.6 .
Листинг 5.4.
//Кусочно-линейное интерполирование
function y=interpolateLinear(x, xx, f, n) y = "nan";
for i = 1:n-1 do
if (x >= xx(i) & x <= xx(i+1)) then
y = f(i) + (f(i+1) - f(i))/(xx(i+1)-xx(i))*(x-xx(i));
