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

Ф

едеральное агентство по образованию

Государственное образовательное учреждение высшего профессионального образования

ВОЛГОГРАДСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ

(ВолгГТУ)

Кафедра вычислительной техники

Семестровая работа по вычислительной математике

на тему:

Аппроксимация функций

Выполнил:

студент группы ИВТ – 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

График:

Вывод:

Аппроксимация функции методом наименьших квадратов является наиболее простой и легко реализуемой, но даёт лишь приближённый результат и не строго проходит через все точки. Аппроксимация сплайнами имеет громоздкие расчеты и большую вероятность ошибки при ручном счёте, но является абсолютно точным методом. Получаемая функция точно проходит через все точки. Однако МНК «сглаживает» функцию, выбирая промежуточные значения, что иногда может оказаться более выгодным решением.