Реферат: Метод Симпсона на компьютере

<span Times New Roman",«serif»">МОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ СТРОИТЕЛЬНЫЙУНИВЕРСИТЕТ

КУРСОВАЯРАБОТА

«Программаприближенного вычисления определенного интеграла с помощью ф – лы Симпсона накомпьютере»

Выполнил:

 студент ф – таЭОУС – 1 – 12

Валюгин А. С.

Принял:

Зоткин С. П.

Москва2001

1.<span Times New Roman"">    

Введение

Определенный интеграл от функции,имеющей неэлементарную первообразную, можно вычислить с помощью той или иной приближеннойформулы. Для решения этой задачи на компьютере, средипрочих, можно воспользоваться формуламипрямоугольников, трапецийили формулой Симпсона. В данной работе рассматриваетсяименно последняя.

Рассмотрим функцию y= f(x).Будем считать, что на отрезке [a, b] она положительна и непрерывна.Найдем площадь криволинейной трапеции aABb(рис. 1).

<img src="/cache/referats/9484/image002.gif" v:shapes="_x0000_i1025">

рис. 1

Для этого разделим отрезок [a, b] точкой  c= (a+ b) / 2пополам и в точке C(c, f(c)) проведем касательную к линии y= f(x).После этого разделим [a, b]  точками  pи qна 3 равные части и проведем черезних прямые x= pи x= q.Пусть Pи Q– точки пересечения этих прямых скасательной. Соединив Aс Pи Bс Q, получим 3 прямолинейные трапеции aAPp, pPQq,qQBb.Тогда площадь трапеции aABbможно приближенно посчитать по следующей формуле

I <span Times New Roman"; mso-hansi-font-family:«Times New Roman»;mso-char-type:symbol;mso-symbol-font-family: Symbol">»

(aA + pP) / 2 * h+ (pP + qQ) / 2 * h + (qQ + bB) / 2 * h, гдеh = (b – a) / 3.

Откуда получаем

I <span Times New Roman";mso-hansi-font-family:«Times New Roman»; mso-ansi-language:EN-US;mso-char-type:symbol;mso-symbol-font-family:Symbol">»

(b – a) / 6 * (aA+ 2 * (pP + qQ) + bB)

заметим, что aA= f(a),bB= f(b),а  pP+ qQ= 2 * f(c),в итоге получаем малую фор – лу Симпсона

<div v:shape="_x0000_s1056">

I <span Times New Roman";mso-hansi-font-family:«Times New Roman»; mso-char-type:symbol;mso-symbol-font-family:Symbol">»

(b – a) / 6 * (f(a) + 4 * f(c) + f(b))    (1)


           

Малая формула Симпсона дает интегралс хорошей точностью, когда график подинтегральной функции мало изогнут, вслучаях же, когда дана более сложная функция малая формула Симпсона непригодна.Тогда, чтобы посчитать интеграл заданной функции нужно разбить отрезок [a, b] на nчастей и к каждому из отрезковприменить формулу (1). После указанных выше действий получится “большая” формула Симпсона, которая имеет вид,

<div v:shape="_x0000_s1057">

I <span Times New Roman"; mso-hansi-font-family:«Times New Roman»;mso-char-type:symbol;mso-symbol-font-family: Symbol">»

h / 3 * (Yкр+ 2 * Yнеч+ 4 * Yчет)    (2)

           

 

где Yкр= y1+ yn,Yнеч= y3+ y5+ … + yn – 1,  Yчет= y2+ y4+ … + yn – 2,аh = (b – a) / n.

        Задача.Пусть нужно проинтегрироватьфункцию f(x) = x³(x - 5)² на отрезке [0, 6](рис.2). На этом отрезке функция непрерывна и принимает только неотрицательныезначения, т. е. знакопостоянна.

<img src="/cache/referats/9484/image004.gif" v:shapes="_x0000_i1026">

рис. 2

Для выполнения поставленной задачисоставлена нижеописанная программа, приближенно вычисляющая определенный интеграл с помощью формулыСимпсона. Программа состоит из трех функций main, fи integral. Функция mainвызывает функцию integralдля вычисления интеграла ираспечатывает на экране результат. Функция fпринимает аргумент xтипа floatи возвращает значение интегрируемойфункции в этой точке. Integral– основная функция программы: онавыполняет все вычисления, связанные с нахождением определенного интеграла. Integralпринимает четыре параметра: пределыинтегрирования типа float, допустимую относительную ошибку типа floatи указатель на интегрируемуюфункцию. Вычисления выполняются до тех пор, пока относительная ошибка,вычисляемая по формуле

 

| (In/2– In) / In|,

где Inинтеграл при числе разбиений n, не будет меньше требуемой. Например, допустимаяотносительная ошибка e= 0.02 это значит, что максимальная погрешность ввычислениях будет не больше, чем In* e= 0.02 * In.  Функция реализована с экономией вычислений, т. е.учитывается, что Yкрпостоянная, а Yнеч= Yнеч+ Yчет, поэтому эти значения вычисляются единожды. Высокаяточность и скорость вычисления делают использование программы на основе формулыСимпсона более желательным при приближенном вычислении интегралов, чемиспользование программ на основе формулы трапеции или метода прямоугольников.

            Нижепредлагается блок – схема, спецификации,листинг иручной счетпрограммы на примере поставленной выше задачи. Блок – схемапозволяет отследить и понять особенности алгоритмапрограммы, спецификациидают представление о назначениикаждой переменной в основной функции integral, листинг-  исходный код работающей программы скомментариями, а ручной счетпредоставляет возможностьпроанализировать результаты выполнения программы.

2.<span Times New Roman"">    

Блок – схема программы

Вводa, b, e, f(x)

n = 4, h = (b – a) / n

s_ab = f(a) + f(b)

s_even = 0, s_res = 0

i = 2, n – 1, 2

s_even = s_even + f(a + i * h)

s_odd = 0, s_pres = s_res

i = 1, n – 1, 2

s_odd = s_odd + f(a + i * h)

s_res = h / 3 * (s_ab + 2 * s_even + 4 * s_odd)

s_even = s_even + s_odd, n = n / 2, h = h / 2

<img src="/cache/referats/9484/image005.gif" v:shapes="_x0000_s1026 _x0000_s1027 _x0000_s1028 _x0000_s1029 _x0000_s1030 _x0000_s1031 _x0000_s1032 _x0000_s1033 _x0000_s1034 _x0000_s1035 _x0000_s1036 _x0000_s1037 _x0000_s1038 _x0000_s1039 _x0000_s1042 _x0000_s1043">


| (s_pres – s_res) / s_res | > e

<img src="/cache/referats/9484/image006.gif" v:shapes="_x0000_s1040">                                                                                                         ДА

<img src="/cache/referats/9484/image007.gif" " v:shapes="_x0000_s1041"> <img src="/cache/referats/9484/image008.gif" v:shapes="_x0000_s1045">


                                                                         НЕТ

Выводs_res

<img src="/cache/referats/9484/image009.gif" " v:shapes="_x0000_s1047">


                                                                                              

3.<span Times New Roman"">    

Спецификации

Имя переменной

Тип

Назначение

n

int

Число разбиений отрезка [a, b]

i

int

Счетчикциклов

a

float

Нижний предел интегрирования

b

float

Верхний предел интегрирования

h

float

Шаг разбиения отрезка

e

float

Допустимая относительная ошибка

f

float(*)

Указатель на интегрируемую фун — цию

s_ab

float

Сумма значений фун – ции в точках aи b

s_even

float

Сумма значений фун – ции в нечетных точках

s_odd

float

Сумма значений фун – ции в четных точках

s_res

float

Текущий результат интегрирования

s_pres

float

Предыдущий результат интегрирования

4.<span Times New Roman"">    

Листинг программы

<span Lucida Console";mso-bidi-font-family:Arial;font-style:normal">

<span Lucida Console";mso-bidi-font-family:Arial;mso-ansi-language: EN-US;font-style:normal">#include <stdio.h> 

<span Lucida Console";mso-bidi-font-family:Arial;mso-ansi-language: EN-US;font-style:normal">#include <math.h>

<span Lucida Console"; mso-bidi-font-family:Arial;mso-ansi-language:EN-US;font-style:normal">

<span Lucida Console"; mso-bidi-font-family:Arial;font-style:normal">/* Прототип фун – ции,вычисляющей интеграл */

<span Lucida Console";mso-bidi-font-family:Arial;mso-ansi-language: EN-US;font-style:normal">float integral(float, float, float, float (*)(float));

<span Lucida Console";mso-bidi-font-family:Arial;font-style:normal">/*Прототип фун – ции, задающей интегрируемую фун – цию */

<span Lucida Console"; mso-bidi-font-family:Arial;mso-ansi-language:EN-US;font-style:normal">

<span Lucida Console";mso-bidi-font-family:Arial;mso-ansi-language: EN-US;font-style:normal">float f(float);

<span Lucida Console"; mso-bidi-font-family:Arial;mso-ansi-language:EN-US;font-style:normal">

<span Lucida Console"; mso-bidi-font-family:Arial;mso-ansi-language:EN-US;font-style:normal">main()

<span Lucida Console";mso-bidi-font-family:Arial;mso-ansi-language: EN-US;font-style:normal">{

<span Lucida Console";mso-bidi-font-family:Arial;mso-ansi-language: EN-US;font-style:normal">       floatresult;

<span Lucida Console"; mso-bidi-font-family:Arial;mso-ansi-language:EN-US;font-style:normal">

<span Lucida Console"; mso-bidi-font-family:Arial;mso-ansi-language:EN-US;font-style:normal">       result = integral(0, 6, .1, f);

<span Lucida Console";mso-bidi-font-family:Arial;mso-ansi-language: EN-US;font-style:normal">       printf("%f",result);

<span Lucida Console"; mso-bidi-font-family:Arial;mso-ansi-language:EN-US;font-style:normal">

<span Lucida Console"; mso-bidi-font-family:Arial;mso-ansi-language:EN-US;font-style:normal">       return 0;

<span Lucida Console";mso-bidi-font-family:Arial;font-style:normal">}

<span Lucida Console"; mso-bidi-font-family:Arial;font-style:normal">

<span Lucida Console"; mso-bidi-font-family:Arial;font-style:normal">/* Реализация фун – ции, задающейинтегрируемую фун – цию

<span Lucida Console";mso-bidi-font-family: Arial;mso-ansi-language:EN-US;font-style:normal">*/

<span Lucida Console";mso-bidi-font-family:Arial;mso-ansi-language: EN-US;font-style:normal">float f(float x)

<span Lucida Console";mso-bidi-font-family:Arial;mso-ansi-language: EN-US;font-style:normal">{

<span Lucida Console";mso-bidi-font-family:Arial;font-style:normal">

<span Lucida Console";mso-bidi-font-family:Arial;font-style:normal">       /* Функция

f(x) = x³(x - 5)²  <span Lucida Console";mso-bidi-font-family: Arial;font-style:normal">*/

<span Lucida Console";mso-bidi-font-family:Arial;font-style:normal">      

<span Lucida Console";mso-bidi-font-family: Arial;mso-ansi-language:EN-US;font-style:normal">return pow(x, 3) * pow(x — 5,2);

<span Lucida Console";mso-bidi-font-family:Arial;font-style:normal">}

<span Lucida Console"; mso-bidi-font-family:Arial;font-style:normal">

<span Lucida Console"; mso-bidi-font-family:Arial;font-style:normal">/* Реализация фун – ции,вычисляющей интеграл */

<span Lucida Console";mso-bidi-font-family:Arial;mso-ansi-language: EN-US;font-style:normal">float integral(float a, float b, float e, float(*f)(float))

<span Lucida Console";mso-bidi-font-family:Arial;mso-ansi-language: EN-US;font-style:normal">{

<span Lucida Console";mso-bidi-font-family:Arial;mso-ansi-language: EN-US;font-style:normal">       int

<span Lucida Console"; mso-bidi-font-family:Arial;font-style:normal"> <span Lucida Console"; mso-bidi-font-family:Arial;mso-ansi-language:EN-US;font-style:normal">n<span Lucida Console"; mso-bidi-font-family:Arial;font-style:normal"> = 4, <span Lucida Console"; mso-bidi-font-family:Arial;mso-ansi-language:EN-US;font-style:normal">i<span Lucida Console"; mso-bidi-font-family:Arial;font-style:normal">; /* Начальное число разбиений 4*/

<span Lucida Console";mso-bidi-font-family:Arial;font-style:normal">      

<span Lucida Console";mso-bidi-font-family: Arial;mso-ansi-language:EN-US;font-style:normal">float<span Lucida Console"; mso-bidi-font-family:Arial;font-style:normal"> <span Lucida Console"; mso-bidi-font-family:Arial;mso-ansi-language:EN-US;font-style:normal">s<span Lucida Console"; mso-bidi-font-family:Arial;font-style:normal">_<span Lucida Console"; mso-bidi-font-family:Arial;mso-ansi-language:EN-US;font-style:normal">ab<span Lucida Console"; mso-bidi-font-family:Arial;font-style:normal"> = <span Lucida Console"; mso-bidi-font-family:Arial;mso-ansi-language:EN-US;font-style:normal">f<span Lucida Console"; mso-bidi-font-family:Arial;font-style:normal">(<span Lucida Console"; mso-bidi-font-family:Arial;mso-ansi-language:EN-US;font-style:normal">a<span Lucida Console"; mso-bidi-font-family:Arial;font-style:normal">) + <span Lucida Console"; mso-bidi-font-family:Arial;mso-ansi-language:EN-US;font-style:normal">f<span Lucida Console"; mso-bidi-font-family:Arial;font-style:normal">(<span Lucida Console"; mso-bidi-font-family:Arial;mso-ansi-language:EN-US;font-style:normal">b<span Lucida Console"; mso-bidi-font-family:Arial;font-style:normal">); /* Сумма значений фун – ции в <span Lucida Console"; mso-bidi-font-family:Arial;mso-ansi-language:EN-US;font-style:normal">a<span Lucida Console"; mso-bidi-font-family:Arial;font-style:normal"> и <span Lucida Console"; mso-bidi-font-family:Arial;mso-ansi-language:EN-US;font-style:normal">b<span Lucida Console"; mso-bidi-font-family:Arial;font-style:normal"> */

<span Lucida Console";mso-bidi-font-family:Arial;mso-ansi-language: EN-US;font-style:normal">float h = (b – a) / n; /*

<span Lucida Console"; mso-bidi-font-family:Arial;font-style:normal">Вычисляем<span Lucida Console"; mso-bidi-font-family:Arial;mso-ansi-language:EN-US;font-style:normal"> <span Lucida Console"; mso-bidi-font-family:Arial;font-style:normal">шаг<span Lucida Console"; mso-bidi-font-family:Arial;mso-ansi-language:EN-US;font-style:normal"> */

<span Lucida Console";mso-bidi-font-family:Arial;mso-ansi-language: EN-US;font-style:normal">       floats_even = 0,  s_odd;

<span Lucida Console";mso-bidi-font-family:Arial;mso-ansi-language: EN-US;font-style:normal">       floats_res = 0, s_pres;

<span Lucida Console"; mso-bidi-font-family:Arial;font-style:normal">

<span Lucida Console"; mso-bidi-font-family:Arial;font-style:normal">       /*Сумма значений фун – ции в нечетных точках */

<span Lucida Console";mso-bidi-font-family:Arial;font-style:normal">      

<span Lucida Console";mso-bidi-font-family: Arial;mso-ansi-language:EN-US;font-style:normal">for (i = 2; i < n; i += 2){

<span Lucida Console";mso-bidi-font-family:Arial;mso-ansi-language: EN-US;font-style:normal">             s

<span Lucida Console"; mso-bidi-font-family:Arial;font-style:normal">_<span Lucida Console"; mso-bidi-font-family:Arial;mso-ansi-language:EN-US;font-style:normal">even<span Lucida Console"; mso-bidi-font-family:Arial;font-style:normal"> += <span Lucida Console"; mso-bidi-font-family:Arial;mso-ansi-language:EN-US;font-style:normal">f<span Lucida Console"; mso-bidi-font-family:Arial;font-style:normal">(<span Lucida Console"; mso-bidi-font-family:Arial;mso-ansi-language:EN-US;font-style:normal">a<span Lucida Console"; mso-bidi-font-family:Arial;font-style:normal"> + <span Lucida Console"; mso-bidi-font-family:Arial;mso-ansi-language:EN-US;font-style:normal">i<span Lucida Console"; mso-bidi-font-family:Arial;font-style:normal"> * <span Lucida Console"; mso-bidi-font-family:Arial;mso-ansi-language:EN-US;font-style:normal">h<span Lucida Console"; mso-bidi-font-family:Arial;font-style:normal">);   

<span Lucida Console";mso-bidi-font-family:Arial;mso-ansi-language: EN-US;font-style:normal">}

<span Lucida Console";mso-bidi-font-family:Arial;mso-ansi-language: EN-US;font-style:normal">       do {

<span Lucida Console";mso-bidi-font-family:Arial;mso-ansi-language: EN-US;font-style:normal">             s_odd= 0;

<span Lucida Console";mso-bidi-font-family:Arial;mso-ansi-language: EN-US;font-style:normal">             s_pres= s_res;

<span Lucida Console";mso-bidi-font-family:Arial;font-style:normal">

<span Lucida Console"; mso-bidi-font-family:Arial;font-style:normal">            

<span Lucida Console"; mso-bidi-font-family:Arial;font-style:normal">/* Сумма значений фун – ции вчетных точках */

<span Lucida Console"; mso-bidi-font-family:Arial;font-style:normal">      

<span Lucida Console"; mso-bidi-font-family:Arial;mso-ansi-language:EN-US;font-style:normal">for (i =1; i < n; i += 2) {

<span Lucida Console";mso-bidi-font-family:Arial;mso-ansi-language: EN-US;font-style:normal">                    s_odd+= f(a + i * h);

<span Lucida Console";mso-bidi-font-family:Arial;mso-ansi-language: EN-US;font-style:normal">}

<span Lucida Console";mso-bidi-font-family:Arial;font-style:normal">

<span Lucida Console"; mso-bidi-font-family:Arial;font-style:normal">      

<span Lucida Console"; mso-bidi-font-family:Arial;mso-ansi-language:EN-US;font-style:normal">/* <span Lucida Console"; mso-bidi-font-family:Arial;font-style:normal">Подсчет результата<span Lucida Console"; mso-bidi-font-family:Arial;mso-ansi-language:EN-US;font-style:normal"> */

<span Lucida Console";mso-bidi-font-family:Arial;mso-ansi-language: EN-US;font-style:normal">             s_res= h / 3 * (s_ab + 2 * s_even + 4 * s_odd);

<span Lucida Console";mso-bidi-font-family:Arial;font-style:normal">/*Избегаем деления на ноль */

<span Lucida Console";mso-bidi-font-family:Arial;font-style:normal">            

<span Lucida Console"; mso-bidi-font-family:Arial;mso-ansi-language:EN-US;font-style:normal">if (s_res== 0) s_res = e;

<span Lucida Console";mso-bidi-font-family:Arial;mso-ansi-language: EN-US;font-style:normal">             s_even+= s_odd;

<span Lucida Console";mso-bidi-font-family:Arial;mso-ansi-language: EN-US;font-style:normal">             n *=2;

<span Lucida Console";mso-bidi-font-family:Arial;mso-ansi-language: EN-US;font-style:normal">             h /=2;

<span Lucida Console"; mso-bidi-font-family:Arial;font-style:normal">}

<span Lucida Console"; mso-bidi-font-family:Arial;mso-ansi-language:EN-US;font-style:normal">while<span Lucida Console"; mso-bidi-font-family:Arial;font-style:normal"> (<span Lucida Console"; mso-bidi-font-family:Arial;mso-ansi-language:EN-US;font-style:normal">fabs<span Lucida Console"; mso-bidi-font-family:Arial;font-style:normal">((<span Lucida Console"; mso-bidi-font-family:Arial;mso-ansi-language:EN-US;font-style:normal">s<span Lucida Console"; mso-bidi-font-family:Arial;font-style:normal">_<span Lucida Console"; mso-bidi-font-family:Arial;mso-ansi-language:EN-US;font-style:normal">pres<span Lucida Console"; mso-bidi-font-family:Arial;font-style:normal"> — <span Lucida Console"; mso-bidi-font-family:Arial;mso-ansi-language:EN-US;font-style:normal">s<span Lucida Console"; mso-bidi-font-family:Arial;font-style:normal">_<span Lucida Console"; mso-bidi-font-family:Arial;mso-ansi-language:EN-US;font-style:normal">res<span Lucida Console"; mso-bidi-font-family:Arial;font-style:normal">) / <span Lucida Console"; mso-bidi-font-family:Arial;mso-ansi-language:EN-US;font-style:normal">s<span Lucida Console"; mso-bidi-font-family:Arial;font-style:normal">_<span Lucida Console"; mso-bidi-font-family:Arial;mso-ansi-language:EN-US;font-style:normal">res<span Lucida Console"; mso-bidi-font-family:Arial;font-style:normal">) > <span Lucida Console"; mso-bidi-font-family:Arial;mso-ansi-language:EN-US;font-style:normal">e<span Lucida Console"; mso-bidi-font-family:Arial;font-style:normal">);/* Выполнять до тех  пор, пока результат не будет удовлетворятьдопустимой ошибке */

<span Lucida Console";mso-bidi-font-family:Arial;mso-ansi-language: EN-US;font-style:normal">

<span Lucida Console";mso-bidi-font-family:Arial;mso-ansi-language: EN-US;font-style:normal">return

<span Lucida Console";mso-bidi-font-family: Arial;font-style:normal"> <span Lucida Console";mso-bidi-font-family: Arial;mso-ansi-language:EN-US;font-style:normal">fabs<span Lucida Console"; mso-bidi-font-family:Arial;font-style:normal">(<span Lucida Console"; mso-bidi-font-family:Arial;mso-ansi-language:EN-US;font-style:normal">s<span Lucida Console"; mso-bidi-font-family:Arial;font-style:normal">_<span Lucida Console"; mso-bidi-font-family:Arial;mso-ansi-language:EN-US;font-style:normal">res<span Lucida Console"; mso-bidi-font-family:Arial;font-style:normal">); /* Возвращаем результат */

<span Lucida Console"; mso-bidi-font-family:Arial;font-style:normal">}

                                                           

5.<span Times New Roman"">    

Ручной счет

Таблицаконстантных значений для n= 8

Имя переменной

Значение

a

b

6

e

.1

s_ab

216

h

.75

Подсчетs_even

i

a + i * h

f(a + i * h)

s_even

2

1.5

41.34375

41.34375

4

3

108

149.34375

6

4.5

22.78125

172.125

Подсчетs_odd

i

a + i * h

f(a + i * h)

s_odd

1

.75

7.62012

7.62012

3

2.25

86.14158

93.7617

5

3.75

82.3973

176.159

7

5.25

9.044

185.203

Подсчетs_res

<span Times New Roman";mso-hansi-font-family:«Times New Roman»; mso-ansi-language:EN-US;mso-char-type:symbol;mso-symbol-font-family:Symbol">ò

f(x) dx

s_res = h / 3 * (s_ab + 2 * s_even + 4 * s_odd)

Абсолютнаяошибка

324

325.266

1.266

еще рефераты
Еще работы по программированию, базе данных