
Аппроксимация функций метод наименьших квадратов(МНК), Интерполяция сплайнами / Интерполяция, сема, экспоненциальная
.doc
Ф
Государственное образовательное учреждение высшего профессионального образования
ВОЛГОГРАДСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
(ВолгГТУ)
Кафедра вычислительной техники
Семестровая работа по вычислительной математике
на тему:
Аппроксимация функций
Выполнил:
студент группы ИВТ – 260
Сова А.В.
Руководитель работы:
доцент Скворцов М. Г.
Волгоград 2008г.
Задание 1:
Аппроксимация экспериментальных данных с использованием метода наименьших квадратов:
Xi |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
Yi |
6 |
9,3 |
10,2 |
11,5 |
12 |
12,7 |
13,2 |
14,1 |
15,4 |
15,7 |
15,6 |
16,1 |
17 |
Необходимо найти вид кривой (экспоненциальную зависимость между Хi и Yi), описывающую указанные экспериментальные данные.
1. Составим таблицу:
X |
Y |
X2 |
ln Y |
X*ln Y |
2 |
6 |
4 |
1.791759 |
3.583518 |
3 |
9,3 |
9 |
2.230014 |
6.690042 |
4 |
10,2 |
16 |
2.322388 |
9.289552 |
5 |
11,5 |
25 |
2.442347 |
12.211735 |
6 |
12 |
36 |
2.484907 |
14.909442 |
7 |
12,7 |
49 |
2.541602 |
17.612140 |
8 |
13,2 |
64 |
2.580217 |
20.641736 |
9 |
14,1 |
81 |
2.646175 |
23.815575 |
10 |
15,4 |
100 |
2.734368 |
27.343680 |
11 |
15,7 |
121 |
2.753661 |
30.290271 |
12 |
15,6 |
144 |
2.747271 |
32.967252 |
13 |
16,1 |
169 |
2.778819 |
36.124647 |
14 |
17 |
196 |
2.833213 |
39.664982 |
104
1014
275.144572
32.886741
Экспоненциальная зависимость имеет вид:
Y=B*e^(A*X)
Где
;
;
После расчётов находим:
A= 0.067196183
B= 7.3314981
То есть функция имеет вид:
Y = 7.3314981*e 0.067196183*x
2. График
Блок-схема:
Код программы
#include "stdafx.h"
#include <math.h>
int main()
{
float A,B,x,y,N;
float sum_x,sum_xx,sum_lny,sum_xlny;
sum_x=sum_xx=sum_lny=sum_xlny=0;
//sum_x---сумма аргументов
//sum_xx---сумма квадратов аргументов
//sum_lny---сумма натуральных логарифмов
//экспериментальных значений функции
//sum_xlny---сумма х*ln(y)
printf("Введите количество точек N = ");
scanf("%f",&N);
for (int i=N; i>0; i--)
{
scanf("%f",&x);
scanf("%f",&y);
sum_x=sum_x+x;
sum_lny=sum_lny+log(y);
sum_xx=sum_xx+x*x;
sum_xlny=sum_xlny+x*log(y);
};
A=(N*sum_xlny-sum_lny*sum_x)/(N*sum_xx-sum_x*sum_x);
B=(sum_xx*sum_lny-sum_x*sum_xlny)/(N*sum_xx-sum_x*sum_x);
B=exp(B);
printf("\nФункция %f*e^(%f*x)",B,A);
return 0;
}
Задание 2.
Интерполяция сплайнами
Функция задана таблицей:
X |
-0.1 |
-0.08 |
-0.06 |
-0.04 |
Y |
6 |
2.7 |
14 |
12 |
Решение:
Требуется найти значения коэффициентов D1,B1,C1, D2,B2,C2, D3,B3,C3 ,
определяющих кубический сплайн S(x) на трех различных отрезках:
S(x)=ai+bi(x-xi-1)+ci(x-xi-1)2+di(x-xi-1)3
S1(x)= 6+ B1*(x+0.1)+ C1*(x+0.1)2+ D1*(x+0.1)3 на -0.1 <= x <= -0.08
S2(x)= 2.7+ B2*(x+0.08)+ C2*(x+0.08)2+ D2*(x+0.08)3 на -0.08 <= x <= -0.06
S3(x)= 14+ B3*(x+0.06)+ C3*(x+0.06)2+ D3*(x+0.06)3 на -0.06 <= x <= -0.04
Составляем систему уравнений:
Из необходимости совпадений в точках значений S(x) и f(x)
bi*hi + ci*hi2 + di*hi3 = yi – y(i-1)
1) 0.02* B1 + 0.0004*С1 + D1*0.000008= - 3.3
2) 0.02* B2 + 0.0004*С2 + D2*0.000008= 11.3
3) 0.02* B3 + 0.0004*С3 + D3*0.000008= -2
Из непрерывности S’(x) и S’’(x) во всех точках:
b(i+1) – bi – 2*ci*hi - 3*di*hi2 = 0
c(i+1) – ci – 3*di*hi = 0
4) B2 - B1 - 0.04*С1 - D1*0.0012=0
5) B3 - B2 - 0.04*С2 - D2*0.0012= 0
6) С2 - С1 - D1*0.06= 0
7) С3 - С2 - D2*0.06= 0
Из условия нулевой кривизны сплайна на концах:
d1 = 0
cn + 3*dn*hn = 0
8) D1=0
9) С3 + D3*0.06 = 0
Составим матрицу:
B1 |
B2 |
B3 |
C1 |
C2 |
C3 |
D1 |
D2 |
D3 |
Св.член |
0.02 |
0 |
0 |
0.0004 |
0 |
0 |
0.000008 |
0 |
0 |
-3.3 |
0 |
0.02 |
0 |
0 |
0.0004 |
0 |
0 |
0.000008 |
0 |
11.3 |
0 |
0 |
0.02 |
0 |
0 |
0.0004 |
0 |
0 |
0.000008 |
- 2 |
-1 |
1 |
0 |
-0.04 |
0 |
0 |
-0.0012 |
0 |
0 |
0 |
0 |
-1 |
1 |
0 |
-0.04 |
0 |
0 |
-0.0012 |
0 |
0 |
0 |
0 |
0 |
-1 |
1 |
0 |
-0.06 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
-1 |
1 |
0 |
-0.06 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
0.06 |
0 |
Система может быть решена на ЭВМ программой, использующей метод Гаусса:
B1 = -731.053
B2 = 401.053
B3 = 326.8421
C1 = 28302.632
C2 = 28302.632
C3 = -32013.158
D1 = 0
D2 = -1005263.158
D3 = 533552.6316
Полученные коэффициенты определяют искомый сплайн:
S1(x) = 6 - 731.053*(x+0.1) + 28302.632*(x+0.1)2;
S1(x)= 28302.632*x2 + 4929.473*x + 215.921;
S1’(x) = 56605.264*x + 4929.473
на -0.1 <= x <= -0.08
S2(x) = 2.7 + 401.053*(x+0.08) + 28302.632*(x+0.08)2 -1005263.158*(x+0.08)3
S2(x) = - 1005263.158*x3 – 212960.518*x2 – 14371.579*x – 298.770
S2’(x) = - 3015789.474*x2 - 425921.04*x – 14371.579
на -0.08 <= x <= -0.06
S3(x)= 14 + 326.8421*(x+0.06) - 32013.158*(x+0.06)2 + 533552.6316*(x+0.06)3
S3(x)= 533552.632*x3 + 64026.315*x2 + 2247.592*x +33.61
S3’(x) = 1600657.896*x2 + 128052.632*x + 2247.631
на -0.06 <= x <= -0.04
Таблица значений:
x |
-0.1 |
-0.08 |
-0.06 |
-0.04 |
F(x) |
6 |
2.7 |
14 |
12 |
S1(x) |
6 |
2.7000005 |
- |
- |
S2(x) |
- |
2.7 |
14 |
- |
S3(x) |
- |
- |
14 |
12 |
S1’(x) |
-731.053 |
401.052 |
- |
- |
S2’(x) |
- |
401.052 |
326.841 |
- |
S3’(x) |
- |
- |
326.841 |
-313.422 |
График:
Вывод:
Аппроксимация функции методом наименьших квадратов является наиболее простой и легко реализуемой, но даёт лишь приближённый результат и не строго проходит через все точки. Аппроксимация сплайнами имеет громоздкие расчеты и большую вероятность ошибки при ручном счёте, но является абсолютно точным методом. Получаемая функция точно проходит через все точки. Однако МНК «сглаживает» функцию, выбирая промежуточные значения, что иногда может оказаться более выгодным решением.