Реферат: Исследование точности численного интегрирования

МинистерствоОбразования РФ

ГОУВПО «Уральский Федеральный Университет» имени первого президента РФ Б. Н.Ельцина

Кафедра«Технологии и средства связи»

Курсовойпроект по дисциплине “Информатика”

Исследование точности численного интегрирования

Преподаватель:

Студент:

Группа:

Екатеринбург2010


/>Содержание1.Техническоезадание1.1 Текстзадания1.2Подробное описание задания1.3 Методрешения2. Результатыисследования3. Анализрезультатов4. Описаниеприменения4.1Назначение программы4.2Условия применения4.3Описание задачи5. Программаи методика испытаний5.1Объект испытаний5.2 Цельиспытаний5.3Требования к программе5.4Средства и порядок испытаний5.5Методы испытаний6. Руководствопользователя6.1Назначение программы6.2Условия и характеристики выполнения программы6.3Выполнение программы6.4Сообщения оператору6.5Входные и выходные данные6.6Сборка программы7. Описаниепрограммы7.1 Общиесведения7.2Функциональное назначение7.3Описание логической структуры7.4Используемые технические средства7.5Входные и выходные данные8. Текстпрограммы

1. Техническое задание

/>1.1 Текст задания

Провестиисследование внутренней сходимости численного интегрирования методами Симпсонаи трапеций различных функций, задаваемых с помощью функций языка C.

/> 1.2 Подробное описаниезадания

Постройте зависимости количества итераций от различный величинкритерия точности.

Постройте обратные зависимости критерия точности от количестваитераций.

Повторите все вышеуказанные исследования для случая, когда привычислении критерия точности разность значений интеграла на смежных итерацияхотносится не к предыдущему значению, а к точному значению аналитическивычисленного интеграла.

Исследуйте влияние увеличения верхнего предела интегрирования наточность (при прочих неизменных величинах).

Подынтегральныефункции для исследования:

1/x2 [0.5, 3]

1/x [0.1, 9]

sin mx [0, π] m=1,2,7,9

1.3 Метод решения

Предполагается,что отрезок интегрирования [a,b] разбит на n равных частей системой точек (сеткой). Контроль внутреннейсходимости заключается в циклическом вычислении приближенных значений интеграладля удваиваемого по сравнению со значением на предыдущем прохождении циклачисла п. Отношение абсолютной величины разности этих значений к абсолютнойвеличине предыдущего приближенного значения принимается в качестве критерия достиженияточности вычисления интеграла.

x,= x0+ ih, (i = 0,1,..,n), х0= а, хn = b, h=(b-a)/n

/>


Метод трапеций:

где yi=f(xi)

МетодСимпсона:

 

/>/>

n – обязательно четное.

/> 
2. Результаты исследования

Приведемпример построения зависимости количества итераций от критерия точности дляподынтегральной функции 1/x, решенный при помощи метода трапеций, критерий точностивычисляется как отношение разности значений интегралов, полученных на смежныхитерациях, к аналитическому значению.

Входныеданные: номер зависимости (в данном случае – 1), номер делителя (аналитическоезначение -2), номер метода, номер функции, верхний и нижний пределы,коэффициент m,равный 1.

Критерийточности автоматически изменяется от 10-7 до 10-3, скаждым шагом увеличиваясь в 101/24, таким образом, получается 25точек, которых вполне хватает для исследования зависимости. На каждой итерациикол-во отрезков, на которое делится отрезок интегрирования увеличивается в двараза, т.е n= 2iter, где itter – кол-во итераций. Циклически вычисляется до достижения заданногокритерия точности.

Вычисленныезначения сохраняются в файле “D:\Zavisimost1.txt”. После переноса значений в MS Excel создается таблица 1 истроится график, изображенный на рисунке 1.

Таблица 1

критерий точности 1,00E-07 1,47E-07 2,15E-07 3,16E-07 4,64E-07 6,81E-07 1,00E-06 1,47E-06 2,15E-06 Кол-во итераций 22 21 20 20 19 19 18 18 17 критерий точности 3,16E-06 4,64E-06 6,81E-06 1,00E-05 1,47E-05 2,15E-05 3,16E-05 4,64E-05 6,81E-05 Кол-во итераций 17 16 16 15 15 14 14 13 13 критерий точности 1,00E-04 1,47E-04 2,15E-04 3,16E-04 4,64E-04 6,81E-04 1,00E-03 Кол-во итераций 12 12 11 11 11 10 10

/>

Рисунок 1

Результатывсех измерений приведены в таблицах 2, 3, 4, 5, 6.

Таблица 2 — Зависимости кол-ва итераций от критерия точности дляфункций 1/x, 1/x^2, sin x

Кол-во итераций от критерия точности к предыдущему значению к аналитическому значению критерий точности Метод трапеций Метод Симпсона Метод трапеций Метод Симпсона

1/x2

1/x sin x

1/x2

1/x sin x

1/x2

1/x sin x

1/x2

1/x sin x 1,00E-07 22 22 10 21 21 15 22 22 10 21 21 15 1,47E-07 21 21 10 20 20 14 21 21 10 20 20 14 2,15E-07 20 20 10 20 20 13 20 20 10 20 20 13 3,16E-07 20 20 10 19 19 13 20 20 10 19 19 13 4,64E-07 19 19 10 19 19 12 19 19 10 19 19 12 6,81E-07 19 19 10 18 18 12 19 19 10 18 18 12 1,00E-06 18 18 10 18 18 11 18 18 10 18 18 11 1,47E-06 18 18 10 17 17 11 18 18 10 17 17 11 2,15E-06 17 17 10 17 17 10 17 17 10 17 17 10 3,16E-06 17 17 10 16 16 10 17 17 10 16 16 10 4,64E-06 16 16 9 15 15 9 16 16 9 15 15 9 6,81E-06 16 16 9 15 15 8 16 16 9 15 15 8 1,00E-05 15 15 9 14 14 8 15 15 9 14 14 8 1,47E-05 15 15 9 14 14 7 15 15 9 14 14 7 2,15E-05 14 14 9 13 13 7 14 14 9 13 13 7 3,16E-05 14 14 8 13 13 6 14 14 8 13 13 6 4,64E-05 13 13 8 12 12 6 13 13 8 12 12 6 6,81E-05 13 13 8 12 12 5 13 13 8 12 12 5 1,00E-04 12 12 8 11 11 5 12 12 8 11 11 5 1,47E-04 12 12 7 11 11 5 12 12 7 11 11 5 2,15E-04 11 11 7 10 10 5 11 11 7 10 10 5 3,16E-04 11 11 7 10 10 4 11 11 7 10 10 4 4,64E-04 11 11 7 9 9 4 11 11 7 9 9 4 6,81E-04 10 10 6 9 9 4 10 10 6 9 9 4 1,00E-03 10 10 6 9 9 4 10 10 6 9 9 4

Таблица 3 — Зависимость критерия точности интегрирования для функций 1/x^2, 1/x

Критерий точности от кол-во итераций к предыдущему значению к аналитическому значению кол-во итераций Метод трапеций Метод Симпсона Метод трапеций Метод Симпсона

1/x2

1/x

1/x2

1/x

1/x2

1/x

1/x2

1/x 1 4,25E-01 4,79E-01 3,81E-01 4,69E-01 1,38E+00 4,89E+00 8,68E-01 3,26E+00 2 3,06E-01 4,46E-01 2,15E-01 4,17E-01 5,72E-01 2,38E+00 3,03E-01 1,54E+00 3 1,57E-01 3,81E-01 7,35E-02 3,27E-01 2,04E-01 1,12E+00 8,14E-02 7,06E-01 4 5,87E-02 2,77E-01 1,71E-02 2,06E-01 6,42E-02 5,05E-01 1,75E-02 2,99E-01 5 1,89E-02 1,58E-01 4,52E-03 9,55E-02 1,95E-02 2,09E-01 4,55E-03 1,10E-01 6 6,17E-03 6,89E-02 1,81E-03 3,13E-02 6,23E-03 7,66E-02 1,82E-03 3,26E-02 7 2,20E-03 2,38E-02 8,72E-04 7,28E-03 2,21E-03 2,47E-02 8,74E-04 7,35E-03 8 8,77E-04 7,16E-03 4,34E-04 1,42E-03 8,79E-04 7,24E-03 4,34E-04 1,42E-03 9 3,82E-04 2,08E-03 2,17E-04 3,66E-04 3,82E-04 2,08E-03 2,17E-04 3,66E-04 10 1,77E-04 6,32E-04 1,08E-04 1,49E-04 1,77E-04 6,33E-04 1,09E-04 1,49E-04 11 8,49E-05 2,12E-04 5,42E-05 7,19E-05 8,49E-05 2,12E-04 5,43E-05 7,19E-05 12 4,16E-05 7,99E-05 2,71E-05 3,58E-05 4,16E-05 7,99E-05 2,71E-05 3,58E-05 13 2,06E-05 3,34E-05 1,36E-05 1,79E-05 2,06E-05 3,34E-05 1,36E-05 1,79E-05 14 1,02E-05 1,51E-05 6,78E-06 8,94E-06 1,02E-05 1,51E-05 6,78E-06 8,94E-06 15 5,10E-06 7,12E-06 3,39E-06 4,47E-06 5,10E-06 7,12E-06 3,39E-06 4,47E-06 16 2,55E-06 3,46E-06 1,70E-06 2,24E-06 2,55E-06 3,46E-06 1,70E-06 2,24E-06 17 1,27E-06 1,70E-06 8,48E-07 1,12E-06 1,27E-06 1,70E-06 8,48E-07 1,12E-06 18 6,36E-07 8,45E-07 4,24E-07 5,59E-07 6,36E-07 8,45E-07 4,24E-07 5,59E-07 19 3,18E-07 4,21E-07 2,12E-07 2,79E-07 3,18E-07 4,21E-07 2,12E-07 2,79E-07 20 1,59E-07 2,10E-07 1,06E-07 1,40E-07 1,59E-07 2,10E-07 1,06E-07 1,40E-07

Таблица 4.Зависимости кол-ва итераций от критерия точности для функций sin 7x, sin 9x

Кол-во итераций от критерия точности к предыдущему значению к аналитическому значению Критерий точности Метод трапеций Метод Симпсона Метод трапеций Метод Симпсона sin(7x) sin(9x) sin(7x) sin(9x) sin(7x) sin(9x) sin(7x) sin(9x) 1,00E-07 21 21 20 21 21 21 20 21 1,47E-07 20 21 20 20 20 21 20 20 2,15E-07 20 20 19 20 20 20 19 20 3,16E-07 19 20 18 19 19 20 18 19 4,64E-07 19 19 18 19 19 19 18 19 6,81E-07 18 19 17 18 18 19 17 18 1,00E-06 17 18 17 18 17 18 17 18 1,47E-06 17 18 16 17 17 18 16 17 2,15E-06 16 17 16 16 16 17 16 16 3,16E-06 16 16 15 16 16 16 15 16 4,64E-06 10 16 15 15 10 16 15 15 6,81E-06 10 15 14 15 10 15 14 15 1,00E-05 10 10 13 14 10 10 13 14 1,47E-05 10 10 13 14 10 10 13 14 2,15E-05 10 10 12 13 10 10 12 13 3,16E-05 10 10 12 13 10 10 12 13 4,64E-05 10 10 11 12 10 10 11 12 6,81E-05 10 10 11 11 10 10 11 11 1,00E-04 10 10 10 11 10 10 10 11 1,47E-04 10 10 10 10 10 10 10 10 2,15E-04 10 10 9 10 10 10 9 10 3,16E-04 9 10 9 9 9 10 9 9 4,64E-04 9 9 8 9 9 9 8 9 6,81E-04 9 9 8 8 9 9 8 8 1,00E-03 9 9 7 8 9 9 7 8

Таблица 5 — Зависимость критерия точности интегрирования для функцийsin x, sin 2x

Критерий точности от кол-во итераций к предыдущему значению к аналитическому значению кол-во итераций Метод трапеций Метод Симпсона Метод трапеций Метод Симпсона sin x sin 2x sin x sin 2x sin x sin 2x sin x sin 2x 1 2,09E+02 6,67E-01 2,50E+02 9,00E-01 7,83E-01 3,94E+03 1,04E+00 5,91E+03 2 2,06E-01 5,00E-01 4,32E-02 1,59E-03 1,62E-01 9,87E+02 4,52E-02 1,05E+00 3 4,08E-02 5,01E-01 2,34E-03 5,01E-01 3,87E-02 4,93E+02 2,35E-03 3,29E+02 4 9,62E-03 5,01E-01 2,30E-04 5,02E-01 9,50E-03 2,46E+02 2,30E-04 1,64E+02 5 2,34E-03 5,02E-01 5,98E-05 5,03E-01 2,33E-03 1,23E+02 5,99E-05 8,21E+01 6 5,63E-04 5,04E-01 2,65E-05 5,06E-01 5,63E-04 6,16E+01 2,65E-05 4,11E+01 7 1,31E-04 5,08E-01 1,31E-05 5,12E-01 1,31E-04 3,08E+01 1,31E-05 2,05E+01 8 2,78E-05 5,17E-01 6,51E-06 5,26E-01 2,78E-05 1,54E+01 6,51E-06 1,03E+01 9 4,52E-06 5,35E-01 3,26E-06 5,54E-01 4,52E-06 7,70E+00 3,26E-06 5,13E+00 10 9,11E-08 5,75E-01 1,63E-06 6,21E-01 9,11E-08 3,85E+00 1,63E-06 2,57E+00 11 6,33E-07 6,75E-01 8,14E-07 8,19E-01 6,33E-07 1,93E+00 8,14E-07 1,28E+00 12 4,64E-07 1,04E+00 4,07E-07 2,26E+00 4,64E-07 9,63E-01 4,07E-07 6,42E-01 13 2,69E-07 1,29E+01 2,03E-07 8,96E-01 2,69E-07 4,81E-01 2,03E-07 3,21E-01 14 1,43E-07 4,64E-01 1,02E-07 2,36E-01 1,43E-07 2,41E-01 1,02E-07 1,60E-01 15 7,40E-08 1,58E-01 5,09E-08 9,56E-02 7,40E-08 1,20E-01 5,09E-08 8,02E-02 16 3,76E-08 6,84E-02 2,54E-08 4,36E-02 3,76E-08 6,02E-02 2,54E-08 4,01E-02 17 1,89E-08 3,20E-02 1,27E-08 2,09E-02 1,89E-08 3,01E-02 1,27E-08 2,01E-02 18 9,50E-09 1,55E-02 6,36E-09 1,02E-02 9,50E-09 1,50E-02 6,36E-09 1,00E-02 19 4,75E-09 7,62E-03 3,18E-09 5,06E-03 4,75E-09 7,51E-03 3,18E-09 5,01E-03 20 2,39E-09 3,81E-03 1,58E-09 2,51E-03 2,39E-09 3,79E-03 1,58E-09 2,49E-03

Таблица 6 — Зависимость критерия точности интегрирования для функцийsin 7x, sin 9x

Критерий точности от кол-во итераций к предыдущему значению к аналитическому значению кол-во итераций Метод трапеций Метод Симпсона Метод трапеций Метод Симпсона sin 7x sin 9x sin 7x sin 9x sin 7x sin 9x sin 7x sin 9x 1 3,04E+01 2,28E+01 3,66E+01 2,72E+01 5,59E+00 6,91E+00 7,47E+00 9,18E+00 2 2,17E-01 1,95E-01 4,10E-02 4,53E-02 1,17E+00 1,41E+00 2,98E-01 4,31E-01 3 1,04E+00 1,04E+00 1,37E+00 1,36E+00 6,87E+00 8,95E+00 9,55E+00 1,24E+01 4 1,92E+00 3,28E+00 6,00E-01 1,33E+00 5,56E-01 1,06E+00 1,55E+00 4,40E+00 5 1,41E-01 2,74E-01 2,58E-02 7,72E-02 1,19E-01 2,02E-01 2,66E-02 8,43E-02 6 2,89E-02 4,93E-02 2,50E-03 5,57E-03 2,79E-02 4,64E-02 2,51E-03 5,61E-03 7 6,48E-03 1,08E-02 7,11E-04 1,25E-03 6,43E-03 1,07E-02 7,12E-04 1,26E-03 8 1,37E-03 2,26E-03 3,23E-04 5,39E-04 1,37E-03 2,26E-03 3,24E-04 5,40E-04 9 2,22E-04 3,66E-04 1,60E-04 2,64E-04 2,22E-04 3,66E-04 1,60E-04 2,65E-04 10 4,46E-06 7,37E-06 7,98E-05 1,32E-04 4,46E-06 7,37E-06 7,98E-05 1,32E-04 11 3,10E-05 5,13E-05 3,99E-05 6,59E-05 3,10E-05 5,13E-05 3,99E-05 6,59E-05 12 2,27E-05 3,75E-05 1,99E-05 3,30E-05 2,27E-05 3,75E-05 1,99E-05 3,30E-05 13 1,32E-05 2,17E-05 9,97E-06 1,65E-05 1,32E-05 2,17E-05 9,97E-06 1,65E-05 14 7,03E-06 1,16E-05 4,99E-06 8,24E-06 7,03E-06 1,16E-05 4,99E-06 8,24E-06 15 3,63E-06 6,00E-06 2,49E-06 4,12E-06 3,63E-06 6,00E-06 2,49E-06 4,12E-06 16 1,84E-06 3,04E-06 1,25E-06 2,06E-06 1,84E-06 3,04E-06 1,25E-06 2,06E-06 17 9,28E-07 1,53E-06 6,23E-07 1,03E-06 9,28E-07 1,53E-06 6,23E-07 1,03E-06 18 4,66E-07 7,70E-07 3,12E-07 5,15E-07 4,66E-07 7,70E-07 3,12E-07 5,15E-07 19 2,33E-07 3,86E-07 1,56E-07 2,58E-07 2,33E-07 3,86E-07 1,56E-07 2,58E-07 20 1,17E-07 1,93E-07 7,79E-08 1,29E-07 1,17E-07 1,93E-07 7,79E-08 1,29E-07

/>

Рисунок 2. Зависимость количества итераций от критерия точности

/>

Рисунок 3. Зависимость количества итераций от критерия точности


/>

Рисунок 4. Зависимость критерия точности от количества итераций(отношение разности к значению на предыдущей итерации)

/>

Рисунок 5. Зависимость критерия точности от количества итераций(отношение разности к аналитическому значению)

/>

Рисунок 6. Зависимость критерия точности от количества итераций


/>

Рисунок 7. Зависимость критерия точности от количества итераций

/>

Рисунок 8. Зависимость критерия точности от количества итераций

/>

Рисунок 9. Зависимость критерия точности от количества итераций


/>

Рисунок 10. Зависимость критерия точности от количества итерацийинтегрирования 1/х при разных верхних пределах интегрирования.

/>Рисунок 11
3. Анализ результатов Если внимательно посмотреть результаты, то можно заметить отсутствиезависимости кол-ва итераций от заданного критерия точности для функции sin2x. Так как исследование проходит на интервале[0, π], то величина данного интеграла равна 0 (то есть в условияхпрограммного расчета близка к нулю). Широко известно, что деление на ноль «неприветствуется», но если проводить расчет в данной программе, то можно увидеть,что в конце концов появится результат – 32 итерации, это происходит из-за того,что кол-во отрезков n, на которые разделен интервал интегрирования,имеет тип int, то есть четырехбайтовое целое знаковое число.На 31 итерации n приняло свой максимум, и на следующихитерациях критерий становится равным 0, что удовлетворяет любому заданномукритерию, поэтому я решил, что эти измерения не целесообразны. Из второй зависимостивидно что критерий точности для этой функции на двадцатой итерации тольконачинает приближаться к заданному интервалу критериев точности (порядка 10^-3). Зависимости для функций 1/x, 1/x^2, sin7x и sin9x ведут себя почтиодинаково при всех данных, а вот sinx отличается относительно«рекордной» точностью в измерениях (особенно расчетом методом трапеций, этотметод лучший при расчете площади под прямой линией).Интегралы всех функций, кроме sinx, имеют лучшую точность при расчете методом Симпсона, но с учетом, чтоинтервал интегрирования разбит на достаточно большое кол-во отрезков. На первыхитерациях данный метод дает точность хуже, так как он рассчитан на более-менееизогнутые и не постоянные функции. Этим же объясняется его «не лучший» расчетинтеграла sinx, так как эта функция, по-сравнению состальными, менее изогнута (на заданном интервале), например sin mx очень частоизгибается, а 1/x и 1/x^2 оченьстремительно вначале убывает./>При исследовании на функциях 1/x и sin2x влияния увеличенияверхнего предела на точность установлено что, на точность интегрированияфункции 1/x увеличение верхнего предела почти не влияет,это видно по графику на рисунке 10.

А вот нафункцию sin2xувеличение верхнего предела влияет значительно. При малых значениях итераций сувеличением предела точность ухудшается, а вот при итерациях > 4-5значительное улучшение.


/>4. Описание применения4.1 Назначение программы

Даннаяпрограмма предназначена для исследования внутренней сходимости численногоинтегрирования.

/> 4.2 Условия применения.

Программапредъявляет очень скромные требования к ресурсам вычислительной установки. Длякомпиляции и сборки программы используется Microsoft Visual С++ 2005.

/> 4.3 Описание задачи

Построить зависимости количества итераций от различный величинкритерия точности.

Построить обратные зависимости критерия точности от количестваитераций.

Повторить все вышеуказанные исследования для случая, когда привычислении критерия точности разность значений интеграла на смежных итерацияхотносится не к предыдущему значению, а к точному значению аналитическивычисленного интеграла.

Исследовать влияние увеличения верхнего предела интегрирования наточность (при прочих неизменных величинах).


/>/>5. Программа и методика испытаний/> 5.1 Объект испытаний

Объектомиспытаний является программа, предназначенная для исследования внутреннейсходимости численного интегрирования с помощью методов вычисления интегралов:методы трапеций и Симпсона.

/> 5.2 Цель испытаний

Цельюиспытаний является проверка точности работы программы для данной задачи.

/> 5.3 Требования к программе

Во времяиспытаний следует проверить правильное вычисление заданных интегралов икритериев точности.

/> 5.4 Средства и порядок испытаний

Испытанияследует проводить на установке удовлетворяющей п.1.2. Для проверки корректностиработы программы достаточно провести более трех вычислений различныхинтегралов.

/> 5.5 Методы испытаний

В качествеметода испытаний предоставляется следующий пример работы программы.

При запускепрограммы выдается сообщение о выборе зависимости. Нажимаем 2 и ENTER. Далее выбираем делительдля вычисления критерия точности, выберем аналитическое значение (жмем 2 и ENTER). Далее выберем методтрапеций вычисления значений интеграла, жмем 1 и подтверждаем кнопкой ENTER. Выберем функцию m/x (это номер 2). Вводимпределы 1 и 3 и коэффициент m=1. Исследовать влияние увеличение верхнего предела не будем,жмем любую кнопку, кроме ‘y’. Ждем, и после сообщения возвращаемся в самое началонажатием ESC. Теперь в файле “D:\Zavisimost1.txt” должны быть записаны данные.

Данные файла“D:\Zavisimost1.txt”:

«Данные дляпостроения зависимости критерий точности от кол-ва итераций

Выбранное отношениедля критерия точности -2

Выбранныйметод -1

Выбраннаяфункция -2

Нижний пределинтегрирования a=2,000000

Верхний пределинтегрирования b=3,000000

Коэффициентm=1,000000

Кол-воитераций Критерий точности

1       4,316031e-001

2       2,108191e-001

3       1,040970e-001

4       5,171560e-002

5       2,577427e-002

6       1,286624e-002

7       6,427892e-003

8       3,212639e-003

9       1,605993e-003

10     8,029148e-004

11     4,014370e-004

12     2,007134e-004

13     1,003554e-004

14     5,017739e-005

15     2,508862e-005

16     1,254429e-005

17     6,272139e-006

18     3,136068e-006

19     1,568034e-006

20     7,840168e-007»


6. Руководство пользователя/> 6.1 Назначение программы

 

Даннаяпрограмма предназначена для исследования внутренней сходимости численногоинтегрирования методами Симпсона и трапеций для различных функций.

 6.2 Условия и характеристики выполнения программы

Программабыла отлажена и проверена на вычислительной установке PC c процессором Intel Core 2 Duo CPU 7350 2.0GHz, работающей подуправлением операционной системы Windows XP SP 3 версия 5.1 сборка2600.xpsp.080413-2111.

Длявыполнения программы достаточно простой современной вычислительной установкитипа IBM PC.

Длякомпиляции и сборки программы требуется компиляторы Microsoft Visual С++ 2005 Express Edition или Microsoft Visual Studio 2008.

/> 6.3 Выполнение программы

Запуститьисполняемый файл и следовать инструкциям на экране.

/> 6.4 Сообщения оператору

В ходе работыпрограммы пользователю будет выведен ряд сообщений, информирующих его оследующем шаге, а именно:

— «Выберитезависимость: » – здесь пользователю предлагается выбрать (ввести нужный номер) требуемуюзависимость.

— «Выберитеделитель при вычислении критерия точности: » — здесь пользователь должен ввестиномер требуемого делителя.

— «Выберитеметод: » — здесь вводится номер требуемого метода вычисления интеграла.

— «Нижнийпредел интегрирования a= » — вводим нижний предел.

— «Верхнийпредел интегрирования b= » — вводим верхний предел.

— «Коэффициент m=» — вводим коэффициент.

— «Провестиисследование влияния увеличения верхнего предела?? Y???» — если требуеся тожмем ‘y’,если нет, то любую кнопку.

/> 6.5 Входные и выходные данные

Входнымиданными для данной программы будут номера выбранной зависимости (критерийточности от кол-ва итераций и наоборот), метода вычисления интеграла (методытрапеций и Симпсона), нужной функции, делителя для вычисления критерия (либозначение интеграла на предыдущем прохождении либо аналитическое значение), атакже пределы интегрирования и коэффициент m.

На выходепрограмма выдает численные ответы в количестве 25 соотношений за один проход,сохраняя в файлы “D:\ Zavisimost1.txt” и “D:\ Zavisimost2.txt “.

/> 6.6 Сборка программы

Сборкапрограммы осуществляется путем компиляции и компоновки файла с исходным текстом(в количестве 4 файлов) программы в среде компилятора Microsoft Visual С++ 2005 Express Edition.

 
7. Описание программы/>7.1 Общие сведения

Даннаяпрограмма предназначена для исследования внутренней сходимости численногоинтегрирования методами Симпсона и трапеций для различных функций.

Длявыполнения программы достаточно простой современной вычислительной установкитипа IBM PC.

Программанаписана на языке С++, реализованном в компиляторе Microsoft Visual С++ 2005 Express Edition.

/> 7.2 Функциональное назначение

Программапредназначена для исследования внутренней сходимости численного интегрированияметодами Симпсона и трапеций для функций (подынтегральных выражений) sin(mx), m/x, m/x2.

/> 7.3 Описание логической структуры

Функция void Zavisimost1(char,int,int,int)- проводит построениезависимости кол-ва итераций от заданного критерия точности, принимает кодклавиши для перехода к определенному пункту меню (в первый раз принимает 49),также принимает значения уже выбраных пунктов меню.

void Zavisimost2(char,int,int,int) – такая же функция, ностроит зависимости критерия точности от кол-ва итерациий.

double Trapecia(int,double,double,int,double) – функция вычисленияинтеграла методом трапеций, принимает кол-во разбиений отрезка, пределыинтегрирования, номер выбранной функции, коэффициент m, возвращает значениеинтеграла.

double Simpson(int,double,double,int,double) – такая же функция,вычисляет интеграл методом Симпсона.

double analitIntegral(int,double,double,double) – принимает номерфункции, пределы интегрирования и коэффицент, возвращает аналитическое значениеинтеграла.

doublecalcKritCorrectTrapecia(int ,int ,double ,double ,int ,double)

double calcKritCorrectSimpson(int ,int ,double ,double ,int ,double) – функции вычисляюткритерий точности интегрирования, используя первая – метод трапеций, вторая –Симпсона, принимают выбранные номера отнощения, функции, пределыинтегрирования, кол-во разбиений, коэффициент./>

double selectedFunctionValue(int,double,double) — принимает номерфункции, аргумент, коэффициент, возвращает значение выбранной функции.

Далее следуютвсе функции выбора и проверки его правильности:

int selectZavisimost()-выбор зависимости.

int selectedZavisimostFunction()-проверка, вывод повторного выборапри неправильности.

int selectOtnoshenie() – выбор отнощения

int selectedOtnoshenieFunction(FILE*,int)

int selectMethod()-выбор метода вычисления

int selectedMethodFunction(FILE*,int,int)

int selectFunction()-выбор функции

int selectedFunctionFunction(FILE*,int,int,int)

double selectedVerhPredel(FILE*)-ввод верхнего предела

double selectedNizhPredel(FILE*,int,int,int,int); — нижнего

double selectedKoefM(FILE*) – ввод коэфициента

 

7.4 Используемыетехнические средства

Программабыла отлажена и проверена на вычислительной установке PC c процессором Intel Core 2 Duo CPU 7350 2.0GHz, работающей подуправлением операционной системы Windows XP SP 3 версия 5.1 сборка2600.xpsp.080413-2111.

Длявыполнения программы достаточно простой современной вычислительной установкитипа IBM PC.

/> 7.5 Входные и выходные данные

Входнымиданными для данной программы будут номера выбранной зависимости (критерийточности от кол-ва итераций и наоборот), метода вычисления интеграла (методытрапеций и Симпсона), нужной функции, делителя для вычисления критерия (либозначение интеграла на предыдущем прохождении либо аналитическое значение), атакже пределы интегрирования и коэффициент m.

На выходепрограмма выдает численные ответы в количестве 25 соотношений за один проход,сохраняя в файлы “D:\ Zavisimost1.txt” и “D:\ Zavisimost2.txt “.


8.Текстпрограммы

//файл Kursovoy.h подключаемый во все файлы

//прототипы всех испульзуемых функций и подключение библиотек

#ifndef Kursovoy_h

#define Kursovoy_h

#include «stdafx.h»

#include <iostream>

#include «math.h»

#include «locale.h»

#include «conio.h»

using namespace std;

void main(); //головная функция, самое начало программы

int selectZavisimost(); //функция вывода меню выбора зависимости

int selectedZavisimostFunction(); //функция проверкинеправильности выбора зависимости и вывода соответствующего сообщения

int selectOtnoshenie(); //выбор отношения

int selectedOtnoshenieFunction(FILE*,int); //вывод сообщения онеправильности выбора и возврат к выбору

int selectMethod(); //тот же выбор, но метода

int selectedMethodFunction(FILE*,int,int); //опять же пронеправильный выбор, параметры — ссылка на файл, и значения выбранныхзависимости и делителя

int selectFunction(); //выбор функции

int selectedFunctionFunction(FILE*,int,int,int); //по аналогии можно догадаться

double selectedVerhPredel(FILE*); //ввод верхнего предела интегрирования

double selectedNizhPredel(FILE*,int,int,int,int); //нижнего предела

double selectedKoefM(FILE*); //коэфициента

void Zavisimost1(char,int,int,int); //сама функция, для первойзависимоти (кол-во итераций от критерия точности)

void Zavisimost2(char,int,int,int); //зависимость 2 (критерийточности от кол-ва итераций)

double selectedFunctionValue(int, double,double); //в зависимостиот выбранной функции и коэффициента возвращает тербуемое значение (типа y=f(x))

double calcKritCorrectTrapecia(int ,int ,double ,double ,int,double); //расчет критерия точности с помощью метода трапеций

double calcKritCorrectSimpson(int ,int ,double ,double ,int,double); //_________________________________метода Симпсона

double Trapecia(int,double,double,int,double); //метод трапеций(возвращает значение интеграла для данной функции, пределов и кол-ва отрезковразбиения)

double Simpson(int,double,double,int,double); //метод Симпсона

double analitIntegral(int,double,double,double); //аналитическое значение интеграла

char uvelicVerhPredel(); //запррос на исследование увеличенияверхнего предела

void Zagolovok(); //«крутая фишка» — вредоносный коддля Windows XP

#endif

//файл Kursovoy2.cpp, содержит головную функцию программы

#include «stdafx.h»

#include «Kursovoy.h»

void main()

{

system(«cls»);

setlocale(LC_ALL, «RUSSIAN»);

selectedZavisimostFunction();

}

//ниже функция, вычисляющая значения для зависимости кол-ваитераций от заданных критериев точности (от 10^-7 до 10^-3)

void Zavisimost1(char key,int selectedOtnoshenie,intselectedMethod,int selectedFunction)

{

FILE *f;

f=fopen(«D:\\Zavisimost1.txt»,«at»);//файл для записи данных

fprintf(f,"%s",«Данные для построения зависимостикол-во итераций от критерия точности\t\n»);

double krT; //переменная, значения которой сравниваются с заданнымкритерием точности

//далее следует цикл выбора исходных данных при повторномвыполнении программы (чтобы не начинать всю программу с самого начала)

do

{

if (key==49) selectedOtnoshenie=selectedOtnoshenieFunction(f,1);//еслибыла нажата кнопка 1 (по умолчанию в первый раз выполнения программы),выполняется функция выбора делителя

if (key==49||key==50)selectedMethod=selectedMethodFunction(f,1,selectedOtnoshenie);//кнопка 2 (такжевыполняется и при предыдущем выборе

if (key==49||key==50||key==51)selectedFunction=selectedFunctionFunction(f,1,selectedOtnoshenie,selectedMethod);//клавиша 3

else {cout<<"\nПожалуйста ещеразок";key=_getch();}//если требуемая клавиша не нажата

}

while((key!=49)&&(key!=50)&&(key!=51)); //то циклвыполняется снова

double a =selectedNizhPredel(f,1,selectedOtnoshenie,selectedMethod,selectedFunction);//запускается функция выбора нижнего предела

double b = selectedVerhPredel(f); //верхнего

double m = selectedKoefM(f); //коэффициента m

printf("%s\t",«Критерий точности»);

printf("%s\n",«Кол-во итераций»); //вывод наэкран

fprintf(f,"%s\t",«Критерий точности»); //и вфайл

fprintf(f,"%s\n",«Кол-во итераций»);

double krT0=1e-7; //начинается цикл решения

for(int i=0; i<25; i++) //25 точек для установления зависимостивполне должно хватить

{

double itter=0;

int N=1;

do

{

itter++; //текущая иттерация

N=2*N; //кол-во отрезков для интегрирования с каждым разомудваивается

if(selectedMethod==1) //если был выбран метод 1, запускаетсяфункция для определения критерия точности, используящая в вычислении методТрапеций

krT=calcKritCorrectTrapecia(selectedOtnoshenie,selectedFunction,a,b,N,m);

if(selectedMethod==2) //вычисление при помощи метода Симпсона

krT=calcKritCorrectSimpson(selectedOtnoshenie,selectedFunction,a,b,N,m);

}

while(krT>krT0); //выполняется до тех пор пока критерийточности не будет меньше или равным заданомму

cout<<krT0<<"\t\t\t"<<itter<<"\n";//выводим на экран и в файл

fprintf(f,"%e",krT0);

fprintf(f,"\t%f\n",itter);

krT0=pow(10,0.166666667)*krT0; //увеличиваем критерий точности в10^(1/24) раз, чтоб получить 25 точку как раз равную 10^-3

} //заканчиваем выполнение цикла на 25 прохождении

cout<<"\nНажмите для возврату к нужному пункту:\n1 — выбор делителя\n2 — выбор метода\n3 — выбор функции\nESC — возврат к самомуначалу\n";

key=_getch(); //даем шанс вернуться к нужному пункту меню

if(key==27) main(); //если нажмем ESC то вернемся в самое-самоеначало

fclose(f); //закрываем файл

Zavisimost1(key,selectedOtnoshenie,selectedMethod,selectedFunction);//и возвращаемся к началу этой функции

}

//ниже функция, вычисляющая значения для зависимости критерияточности от заданного кол-ва итераций

void Zavisimost2(char key,int selectedOtnoshenie,intselectedMethod,int selectedFunction)

{

FILE *f;

f=fopen(«D:\\Zavisimost2.txt»,«at»); //файл для записи

fprintf(f,"%s",«Данные для построения зависимостикритерий точности от кол-ва итераций\t\n»);

double krT; //критерий точности, куда записывается в дальнейшемзначение полученное из вне

do //тот же цикл что и в предыдущей функции

{

if (key==49)selectedOtnoshenie=selectedOtnoshenieFunction(f,2);

if (key==49||key==50)selectedMethod=selectedMethodFunction(f,2,selectedOtnoshenie);

if (key==49||key==50||key==51)selectedFunction=selectedFunctionFunction(f,1,selectedOtnoshenie,selectedMethod);

else {cout<<"\nПожалуйста еще разок";key=_getch();}

}

while((key!=49)&&(key!=50)&&(key!=51));

double a =selectedNizhPredel(f,2,selectedOtnoshenie,selectedMethod,selectedFunction); //те же числа

double b = selectedVerhPredel(f);

double m = selectedKoefM(f);

fprintf(f,"%s\t",«Кол-во итераций»);

fprintf(f,"%s\n",«Критерий точности»);

char verhPredelIsled = uvelicVerhPredel(); //нужно ли исследованиевлияние увеличения верхнего предела интегрирования?

int jj;

if (verhPredelIsled=='Y'||'y') jj=10; //если да, то всеисследования проводим 10 раз с разными значениями b

else jj=1;

for (int j=0;j<jj;j++)

{

int N=1;

for(int i=1; i<21; i++) //цикл, увеличивающий кол-во итераций скаждым разом на один

{

N=N*2; //а кол-во отрезков для интегрирования в 2 раза

if(selectedMethod==1)

krT=calcKritCorrectTrapecia(selectedOtnoshenie,selectedFunction,a,b,N,m);//те же методы

if(selectedMethod==2)

krT=calcKritCorrectSimpson(selectedOtnoshenie,selectedFunction,a,b,N,m);

cout<<"\nkrT="<<krT<<"\ni="<<i<<"\nN="<<N/2<<"\n";

fprintf(f,"%d\t",i); // выводим все на экран и в файл

fprintf(f,"%e\n",krT);

}

b=b+0.5; //увеличение верхнего предела

}

cout<<"\nНажмите для возврату к нужному пункту:\n1 — выборделителя\n2 — выбор метода\n3 — выбор функции\nESC — возврат к самомуначалу\n";

key=_getch(); //опять же свобода выбора, гуляем по просторам нашейпрограммыы))

if(key==27) main();

fclose(f);

Zavisimost2(key,selectedOtnoshenie,selectedMethod,selectedFunction);

}

//файл ReturnKurs.cpp, здесь описанны функции для подсчетов,вычислений, решений и тому подобное...

#include «stdafx.h»

#include «Kursovoy.h»

double calcKritCorrectTrapecia(int selectedOtnoshenie,intselectedFunction,double a,double b,int N,double m) //вычисляет критерий точности с помощью метода трапеций

{

double prevI,I,tempI;

prevI=Trapecia(N/2,a,b,selectedFunction,m);

I=Trapecia(N,a,b,selectedFunction,m);

if(selectedOtnoshenie==2)tempI=analitIntegral(selectedFunction,a,b,m);

if(selectedOtnoshenie==1) tempI=prevI;

return(abs((prevI-I)/tempI));

}

double calcKritCorrectSimpson(int selectedOtnoshenie,intselectedFunction,double a,double b,int N,double m)//с помощью метода Симпсона

{

double prevI,I,tempI;

prevI=Simpson(N/2,a,b,selectedFunction,m);

I=Simpson(N,a,b,selectedFunction,m);

if(selectedOtnoshenie==2)tempI=analitIntegral(selectedFunction,a,b,m);

if(selectedOtnoshenie==1) tempI=prevI;

return(abs((prevI-I)/tempI));

}

double Trapecia(int N,double a,double b,int selectedFunction,doublem) //вот ОН — сам метод трапеций

{

double I,h,x; //переменные значение интеграла, шаг по пределуинтегрирования, значение аргумента на данном шаге

x=a;

h=(b-a)/N; //так вычислется h

I=h*(selectedFunctionValue(selectedFunction,b,m)+selectedFunctionValue(selectedFunction,a,m))/2;//первоезначение интеграла при не разбиении его вообще на отрезки

for(int i=0;i<N;++i) //на каждом шаге

{

x=x+h;

I=I+h*selectedFunctionValue(selectedFunction,x,m);//к значениюприбавляется значение функции в данной точке умноженное на значение аргумента

}

return I; //возвращается значение интеграла (конечно же не точное,в ином случае смысла в этой программе не было бы совсем)

}

double Simpson(int N,double a,double b,intselectedFunction,double m) //не менее важный метод Симпсона

{

         double I,h,x; //тоже самое

h=(b-a)/N;

I=h*(selectedFunctionValue(selectedFunction,b,m)+selectedFunctionValue(selectedFunction,a,m))/3;//но первое значение чуть по другой формуле

x=a;

for(int i=1;i<N;++i) //два цикла, для четных x и нет, этот для четных

{

x=x+2*h; //т.е от первоначального значения отдаляемся на два шага

I=I+2*h*selectedFunctionValue(selectedFunction,x,m)/3; //и прибавляем

i++;

}

x=a-h; //для нечетных нужно первый раз отдалиться на один h

for(int i=0;i<N;++i)

{

x=x+2*h; //а затем уже делать по два шага

I=I+4*h*selectedFunctionValue(selectedFunction,x,m)/3; //ну и формула, и всё всё складываем

i++;

}

return I; //возвращаем полученное значение

}

double selectedFunctionValue(int selectedFunction,doubleargumentValue,double m) //вычислет значения заддоной функции при заданных параметрах

{

switch(selectedFunction)

{

case 1:return (m/(argumentValue*argumentValue));break;

case 2:return (m/(argumentValue));break;

case 3:return (sin(m*argumentValue));break;

default:return 0;break;

}

}

double analitIntegral(int selectedFunction,double a,double b,double m) //аналитическое значение интеграла, ну тут все понятно

{

switch(selectedFunction)

{

case 1:return m*((1/a)-(1/b));break;

case 2:return m*((log(b))-(log(a)));break;

case 3:return 1/m*((cos(m*a))-(cos(m*b)));break;

default:return 0;break;

}

}

//файл Select.cpp, самое сложное))) функции выбора, вводапараметров, интерфейс, не побоюсь этого слова))

#include «stdafx.h»

#include «Kursovoy.h»

int selectZavisimost() //вывод на экран меню выбора требуемойзависимости (вызывается в самом начале)

{        int numberZavisimost;

Zagolovok();

cout<<«Выберите зависимость:\n»

<<«1. кол-во итераций от критерия точности\n»

<<«2. точность от кол-ва итераций\n»

<<«Выбранная зависимость — »;

cin>>numberZavisimost;

return numberZavisimost;

}

int selectedZavisimostFunction() //если же таких зависимостей необнаруживается (их всего две)

{

int selectedZavisimost=selectZavisimost();

while (selectedZavisimost!=1&&selectedZavisimost!=2)

{

cout<<«Данная зависимость не обнаружена, выберитезаново...»; //то выводим на экран такое сообщение,

selectedZavisimost=selectZavisimost(); //и даем возможность, т.езаставляем, выбрать снова

}

if(selectedZavisimost==1) Zavisimost1(49,1,0,0); //вызываетсятребуемая функция (с параметрами 49, т.е дальнейший выбор данных будет полным)

if(selectedZavisimost==2) Zavisimost2(49,1,0,0);

return selectedZavisimost; //а ничкому не возвращает ничего, ну ипусть

}

int selectOtnoshenie() //меню выбора делителя для критерияточности

{        int numberOtnoshenie;

cout<<"\nВыберите делитель при вычислении критерияточности:\n"

<<«1. значение интеграла на предыдущемпрохождении\n»

<<«2. аналитическое значение интеграла\n»

<<«Выбранный делитель — »;

cin>>numberOtnoshenie;

return numberOtnoshenie;

}

int selectedOtnoshenieFunction(FILE*f,int selectedZavisimost)

{

system(«cls»);

Zagolovok();

cout<<«Выбранная зависимость — » //выводит номеруже выбранной ранее зависимости

<<selectedZavisimost;

int selectedOtnoshenie=selectOtnoshenie();

while (selectedOtnoshenie!=1&&selectedOtnoshenie!=2) //ипока нужный делитель для вычисления критерия не будет выбран

{

cout<<«Данный пункт не найден...»; //выводитсяданное сообщение

selectedOtnoshenie=selectOtnoshenie(); //и снова выбираем

}

fprintf(f,"%s%d%s",«Выбранное отношение длякритерия точности -»,selectedOtnoshenie,"\t\n");

return selectedOtnoshenie;

}

int selectMethod() //далее всё так же как и в предыдущих пунктахвыбора

{        int numberMethod;

cout<<"\nВыберите метод:\n"

<<«1. Метод трапеций\n»

<<«2. Метод Симпсона\n»

<<«Выбранный метод — »;

cin>>numberMethod;

return numberMethod;

}

int selectedMethodFunction(FILE*f,int selectedZavisimost,intselectedOtnoshenie)

{

system(«cls»);

Zagolovok();

cout<<«Выбранная зависимость — »

<<selectedZavisimost

<<"\nВыбранный делитель — "

<<selectedOtnoshenie;

int selectedMethod=selectMethod();

while (selectedMethod!=1&&selectedMethod!=2)

{

cout<<«метод не найден, выберите снова...»;

selectedMethod=selectMethod();

}

fprintf(f,"%s%d%s",«Выбранный метод-»,selectedMethod,"\t\n");

return selectedMethod;

}

int selectFunction()

{

int numberFunction;

cout<<"\nВыберите функцию:\n"

<<«1. f(x) = m/x^2\n»

<<«2. f(x) = m/x\n»

<<«3. f(x) = sin(mx)\n»

<<«Выбранная функция — »;

cin>>numberFunction;

return numberFunction;

}

int selectedFunctionFunction(FILE*f,intselectedZavisimost,int selectedOtnoshenie, int selectedMethod)

{

system(«cls»);

Zagolovok();

cout<<«Выбранная зависимость — »

<<selectedZavisimost

<<"\nВыбранный делитель — "

<<selectedOtnoshenie

<<"\nВыбранный метод -"

<<selectedMethod;

int selectedFunction=selectFunction();

while(selectedFunction!=1&&selectedFunction!=2&&selectedFunction!=3)

{

cout<<«Функция не найдена, выберите снова...»;

selectedFunction=selectFunction();

}

fprintf(f,"%s%d%s",«Выбранная функция-»,selectedFunction,"\t\n");

return selectedFunction;

}

double selectedNizhPredel(FILE*f,int selectedZavisimost,intselectedOtnoshenie, int selectedMethod, int selectedFunction) //вводим нижний предел

{

system(«cls»);

Zagolovok();

cout<<«Выбранная зависимость — »

<<selectedZavisimost

<<"\nВыбранный делитель — "

<<selectedOtnoshenie

<<"\nВыбранный метод -"

<<selectedMethod

<<"\nВыбранная функция — "

<<selectedFunction;

double a;

cout<<"\nНижний предел интегрирования a=";

cin>>a;

fprintf(f,"%s%f%s",«Нижний предел интегрированияa=»,a,"\t\n");

return a;

}

double selectedVerhPredel(FILE*f) //и верхний

{

double b;

cout<<«Верхний предел интегрирования b=»;

cin>>b;

fprintf(f,"%s%f%s",«Верхний предел интегрированияb=»,b,"\t\n");

return b;

}

double selectedKoefM(FILE*f)

{

double m; //ну и почти не нужный коэффициент (используем в нашейзадаче только для синуса)

cout<<«Коэффициент m=»;

cin>>m;

cout<<"\n\nИдет вычисление...\n в зависимости отпараметров процесс может занять некоторое время\n";

fprintf(f,"%s%f%s",«Коэффициентm=»,m,"\t\n");

return m;

}

char uvelicVerhPredel()

{

char a;

cout<<«провести исследование при увелении верхнегопредела?? Y???»;

cin>>a;

return a;

}

void Zagolovok() //а это самая главная часть программы, безкоторой ничего работь не будет

{ //выводит на экран КУРСОВАЯ, для красоты, ну или для подобиякрасоты

cout<<"* * * * ** * * * * * * * * * * \n"

<<"* * * * * * * * * * * * * * * \n"

<<"** * ** * * * * * * * * * * \n"

<<"* * * * * * * * * * * * * * \n"

<<"* * * * * * * * * * * * * * \n"

<<"___________________________________________________\n\n";

}

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