Программа численного интегрирования
Министерство образования Республики Беларусь
Белорусский
национальный технический университет
Кафедра
«Горные машины»
КУРСОВАЯ РАБОТА
По
дисциплине «Информатика»
Программа
численного интегрирования
ПОЯСНИТЕЛЬНАЯ
ЗАПИСКА
Руководитель:
Ринкевич В. П.
Исполнитель: Семенова М. В.
гр.
102528
2010
Содержание
Введение…………………………………………………………
- Постановка
задачи………………………………………………………………
5 - Математическая формулировка задачи………………………………………..7
- Алгоритмизация задачи…………………………………………………………9
- Идентификаторы
программы…………………………………………………..
12 - Блок-схема
алгоритма………………………………………………………
…..13 - Текст исходной
программы………………………………………………………
.. - Результаты выполнения программы……………………………………………...
- Анализ результатов…………………………………………………
……………... - Инструкция по работе с программой……………………………………………..
Заключение……………………………………………………
Список использованных источников……………………………………………..
Введение
В
курсовой работе в соответствии с
заданием на проектирование решается
задача разработки программы вычисления
определенных интегралов численными методами.
Численное интегрирование используется,
когда аналитическое нахождение
значений первообразной функции
сложно или вообще невозможно.
В
данной пояснительной записке
Выбор
метода вычисления, обращение к справке
по программе и выход из программы
обеспечивается с помощью специального
меню. Ввод исходных данных и вывод
результатов вычисления интеграла
выполняется в отдельном для
каждого метода вычислений окне.
В
пояснительной записке
- Постановка задачи
Ставится
задача составить программу вычисления
интеграла вида
I=
(1)
где a и b – нижний
и верхний пределы интегрирования, f(x)
– непрерывная интегральная функция на
отрезке [a, b]. Такой определённый интеграл
можно трактовать как площадь фигуры (рисунок
1), ограниченной ординатами a и b, осью абсцисс
x и графиком подынтегральной функции
f(x).
Рисунок
1. К вычислению определенного интеграла
Обыкновенный
определённый интеграл, у которого
известна его первообразная F(x), вычисляется
по формуле Ньютона-Лейбница
I=F(b)-F(a)
(2)
Численное
интегрирование применяется, если нахождение
F(x) сложно или невозможно. Оно заключается
в интерполяции f(x) на отрезке [a, b] подходящим
полиномом, для которого известна первообразная
F(x). Обычно отрезок [a, b] разбивается на
N частей, к каждой применяется соответствующая
простая формула.
Таким образом, программа должна обеспечивать возможность:
- быструю смену подынтегральной функции f(x) путем замены аналитического выражения ее правой части в подпрограмме – функции;
- выбором пользователем численного метода вычисления интеграла;
- ввода с клавиатуры значений пределов интегрирования a и b и количества интегралов разбиения n;
- вывода результатов вычисления на дисплей в удобном для восприятия виде с отображением названия выбранного численного метода, значений пределов интегрирования и принятого числа интегралов разбиения;
- программа после загрузки должна выводить на дисплей исходное окно-заставку, в которой отображаются общие сведения о статусе программы и ее авторах;
- после выполнения указанной в строке подсказки процедуры перехода должно выводиться вертикальное меню с пунктами: «Справка», «Метод Симпсона», «Метод трапеций» и «Выход»;
- при выборе в меню пункта «Справка» должна выводится краткая выводиться краткая справка о назначении программы и порядке работы с ней;
- после выбора в меню варианта численного метода должно открываться отдельное окно, в котором будут выводиться запросы программы о значениях пределов интегрирования, числе интегралов разбиения и в этом же окне после ввода исходных значений будет выводиться результат вычисления интеграла выбранным методом;
- при выборе пункта меню «Выход» программы должна завершать работу.
- Математическая формулировка задачи
Метод Симпсона.
Подынтегральную
функцию f(x) заменим интерполяционным
полиномом второй степени P2(x) –
параболой, проходящей через узлы x0,
x1, x2 (рис 2), тогда
(3)
где R – погрешность вычисления интеграла.
| f(x) | |||||
| P2(x) | |||||
| x0 | x1 | x2 | x |
Рисунок
2. Метод Симпсона
Для
записи полинома P2(x) воспользуемся
интерполяционной формулой Ньютона для
трех узлов
P2(x)=f0+f01(x-x0)+f012(x-x0)(
где
,
- разделенные разности; h – расстояние между узлами.
Введем
новую переменную z=x-x0, тогда x=z+x0
и полиномом (4) принимает вид
P2(z)=f0+(f01-f012h)z+f012z2
Теперь
вычислим интеграл от полинома (5)
Последнее соотношение называют квадратурной формулой Симпсона, или формулой парабол где
f0=f(x) (7)
– значение
подынтегральной функции при текущем
значении x;
Метод трапеций.
Подынтегральную
функцию заменим на участке [xi,
xi+h] полиномом первой степени P1(x).
Такая аппроксимация неоднозначна. Одним
из возможных способов является проведение
прямой через значения функции на границах
интервала интегрирования (рис. 3). В этом
случае приближенное значение интеграла
определяется площадью трапеции
| f(x) | |||||
| f(xi+h) | |||||
| f(xi) | |||||
| xi | xi+h | x |
Рисунок 3. Метод трапеций
- Алгоритмизация задачи
В соответствии с постановленной в разделе 2 задачей целесообразно реализовать алгоритм, использующий обращение к соответствующим подпрограммам из головной программы.
Алгоритм работы головной программы следующий:
- Скрыть курсор с использованием подпрограммы – процедуры скрытия курсора и вывести в специальном окне заставку программы, содержащую сведения о назначении программы, исполнителе и руководителе курсовой работы, а также подсказку для пользователя о последующих действиях, с использованием подпрограммы – процедуры заставки.
- Запустить подпрограмму-процедуру вертикального меню при нажатии любой клавиши с использованием подпрограмм-процедур построения окна, вывода рамки окна и скрытия курсора.
- Запустить подпрограмму-процедуру справки и вывести в специальном окне справочные сведения о работе с программой при выборе пункта меню «Справка» с использованием подпрограмм-процедур построения окна, вывода рамки окна и скрытия курсора, а также строки-подсказки о возврате в меню.
- Запустить подпрограмму-процедуру вычисления интеграла методом Симпсона при выборе пункта меню «Метод Симпсона» с использованием подпрограмм-процедур построения окна, вывода рамки окна и выключения курсора, а также строки-подсказки о возврате в меню.
- Запустить подпрограмму-процедуру вычисления интеграла методом трапеций при выборе пункта меню «Метод трапеций» с использованием подпрограмм-процедур построения окна, вывода рамки и включения курсора, а также строки-подсказки о возврате в меню.
- Завершить работу программы при выборе пункта меню «Выход».
Алгоритм вычисления интеграла методом Симпсона в подпрограмме-процедуре включает следующие шаги:
- Создать окно для ввода исходных данных и вывода результатов вычисления по методу Симпсона.
- Восстановить отображение курсора нормального размера соответствующей подпрограммой-процедурой.
- Ввести нижний a и верхний b пределы интегрирования как границы отрезка интегрирования и количество n интервалов его разбиения.
- Вывести в окне запрос о правильности ввода a, b и n.
- Выполнить анализ кода нажатой в ответ на запрос клавиши: при нажатии «Y» перейти к вычислениям, при нажатии любой клавиши перейти к пункту 3 алгоритма.
- Вычислить значение шага по h формуле h=(b-a)/n.
- Присвоить первоначальному значению интеграла s нуль и начальному значению аргумента x0 значение a.
- Организовать цикл по i от 1 до n.
- Вычислить по формулам (7) – (9) значения f0, f1 и f2.
- Вычислить значение s=s+ f0+4 f1+ f2.
- Вычислить новое значение x=x+h.
- Закончить цикл по i.
- Вычислить конечное значение интеграла s=s*h/6.
- Вывести результаты вычислений в том же окне.
- Вывести в окне запрос о продолжении вычислений с новыми исходными данными.
- Выполнить анализ кода нажатой в ответ на запрос клавиши: при нажатии «Y» перейти в окно с меню, при нажатии любой другой клавиши прейти в окно с заставкой программы.
Алгоритм вычисления интеграла методом трапеций в подпрограмме-процедуре включает:
- Создать окно для ввода исходных данных и вывода результатов вычисления по методу трапеции.
- Восстановить отображение курсора нормального размера соответствующей подпрограммой-процедурой.
- Ввести нижний a и верхний b пределы интегрирования как границы отрезка интегрирования и количество n интервалов его разбиения.
- Вывести в окне запрос о правильности ввода a, b и n.
- Выполнить анализ кода нажатой в ответ на запрос клавиши: при нажатии «Y» перейти к вычислениям, при нажатии любой клавиши перейти к пункту 3 алгоритма.
- Вычислить значение шага h по формуле h=(b-a)/n.
- Присвоить первоначальному значению интеграла s нуль и начальному значению аргумента x0 значение a.
- Организовать цикл по i от 1 до n.
- Вычислить значения f0 и f1
- Вычислить значение s=s+ f0+f1.
- Вычислить новое значение x=x+h.
- Закончить цикл по i.
- Вычислить конечное значение интеграла s=s*h/2.
- Вывести результаты вычислений в том же окне.
- Вывести в окне запрос о продолжении вычислений с новыми исходными данными.
- Выполнить анализ кода нажатой в ответ на запрос клавиши: при нажатии «Y» перейти в окно с меню, при нажатии любой другой клавиши прейти в окно с заставкой программы.
- Идентификаторы программы
Для
указания соответствия обозначений переменных
в формулах математической формулировки
и их идентификаторов в программе сведем
их в таблицу 1:
| Обозначение параметров | Смысл параметра | |
| В формулах | В программе | |
| А | a | Левая граница отрезка интегрирования (нижний предел интегрирования) |
| В | b | Правая граница отрезка интегрирования (верхний предел интегрирования) |
| N | n | Число интервалов
разбиения отрезка |
| H | h | Длина интервала разбиения |
| x | x | Аргумент подынтегральной функции |
| dx | h1 – метод Симпсона
h2 – метод трапеций |
Приращение аргумента x |
| I | S | Значение интеграла |
- Блок-схемы
Блок-схема алгоритма головной программы.
Блок-схема
алгоритма подпрограммы-
Блок-схема
алгоритма подпрограммы-
Блок-схема
алгоритма подпрограммы-
Блок-схема
алгоритма подпрограммы-
Блок-схема
алгоритма подпрограммы-
Блок-схема
алгоритма подпрограммы-
Блок-схема
алгоритма подпрограммы-
- Текст исходной программы
program Kursovoi_integeral;
Uses crt,dos;
Label 11,12,m1;
Type
mas=Array[1..4] of String[50];
Const
menu:mas=('
'Metod Simpsona',
'Metod trapecii',
'Vixod');
var
i,s,pos: Integer;
c,kod,k10:Char;
pass: String;
ch: char;
function f(x:real): real;
begin
f:=exp(sqr(x))
end;
{____________________}
{-----------Cursorcursor init-----------}
Procedure CursorSize(Size: word);
var Regs: Registers;
Begin
With Regs do
Begin AH:=$01;
CH:=Hi(size);
Cl:=Lo(Size);
intr($10,Regs);
end;
end;
{-----------Cursor init------------------}
{-----------Cursor OFF-------------------}
procedure HiddeCursor;
begin
CursorSize($2000);
end;
{-----------Cursor OFF-------------------}
{-----------Cursor ON--------------------}
Procedure NormCursor;
begin
CursorSize($0607);
end;
{-----------Cursor ON--------------------}
{-----------Create of Frame--------------}
procedure ramka(x1,y1,x2,y2: byte);
const
a=#201;
b=#205;
c=#187;
d=#186;
e=#188;
f=#200;
Begin
Textcolor(14);
Textbackground(0);
Clrscr;
gotoxy(x1,y1);
write(a);
for i:=x1+1 to x2-1 do write(b);
write(c);
for i:=y1+1 to y2-1 do
Begin
gotoxy(x1,i);
write(d);
gotoxy(x2,i);
write(d);
End;
Gotoxy(x1,y2);
write(f);
for i:=x1+1 to x2-1 do write(b);
write(e);
End;
Procedure Okno(x1,y1,x2,y2,Fcolor,
Begin
Clrscr;
TextMode(3);
HiddeCursor;
Ramka(x1,y1,x2,y2);
Window(x1+1,y1+1,x2-1,y2-1);
textbackground(Fcolor);
textcolor(Tcolor);
Clrscr;
Gotoxy(1,1);
End;
Procedure Zastavka;
Begin
Okno(1,1,79,23,5,14);
gotoxy(3,1);
writeln(' ');
writeln(' Ministerstvo obrazovaniya Respubliki Belarus');
writeln(' Belorusskii nacionalnji texnicheskii universitet');
gotoxy(1,6);
writeln('
writeln;
writeln;
writeln;
writeln;
writeln('
writeln('
gotoxy(1,15);
writeln('Ispolnitel
writeln('
writeln('Rukovoditel
writeln;
writeln;
writeln('
window(0, 0, 80, 25);
gotoxy(40,23);
Textcolor(13);
gotoxy(1,79);
writeln('Dlay prodolzheniya nazhmite lubyu klavishy...');
repeat until keypressed;
while keypressed do ch:=readkey;
clrscr;
End;
Procedure Spravka;
var
ch: char;
Begin
Okno(1, 1, 79, 23, 5, 14);
Writeln('=====================
Writeln(' Dannaya programma pozvolyaet vichislyat integral');
Writeln('I=exp(sqrt(x))dx metodom Simpsona i metodom trapecii dlya zadannix');
Writeln('znachenii predelov integrirovaniya a - niznii i b - verxnii.');
Writeln(' Posle perexoda v menu vibirite klavishami upravleniya kursora');
writeln('neobxodimii punkt.');
Writeln(' Pri vibore metoda Simpsona ili metoda trapecii vvedite po zaprosy');
Writeln('programmi celochislennie znacheniya predelov integrirovaniya i chislo');
Writeln('intervalov integrirovaniya.');
Writeln(' Dlya integrala s drugoi podintegralnoi funkciei sleduet');
Writeln('zapisat ee v pravoi chaste virazeniya dlya vichisleniya znacheniya funkcii');
Writeln('v podprogramme-funkcii f v razdele obyavlenii golovnoi programmi.');
Window(2,2,79,24);
Textcolor(13);
gotoxy(5,20);
write(' Dlya vozvrata v menu nazhmite lubyu klavishy...');
ch:=readkey;
End;
Procedure Emenu;
Begin
clrscr;
Okno(15,9,55,17,5,7);
For i:=1 to 4 do
begin
Gotoxy(15,i+1);
if i=pos then Textbackground(8) else Textbackground(5);
write(Menu[i]);
end;
End;
procedure Exitfrom;
Begin
writeln;
gotoxy(50,26);
Writeln('Dlya prodolzeniya vichisleniya nazmite - Y, dlya vixoda - N');
ch:=readkey;
if ch =#121 then Emenu else Zastavka;
End;
Procedure Simpson;
label m1;
Var
i,n : byte;
a,b,h,h1,s,x : real;
ch: char;
Begin
Okno(1, 1, 79, 23, 5, 14);
NormCursor;
Writeln('==================>
Writeln;
Writeln;
m1:
Writeln(' Vvedite predelu integrirovaniya a i b');
Write(' Niznii pridel a=');
read(a);
Write(' Verxnii pridel b=');
read(b);
Write(' Vvedite chislo intervalov integrirovaniya N=');
read(n);
Begin
writeln;
Writeln(' Znacheniya vvedeny pravilno(Y/N)?');
ch:= readkey;
If ch=#110 then
begin
writeln;
Writeln(' Dannie vvedeni neverno. Povtoryaem vvod');
writeln;
writeln;
goto m1;
end;
h:=(b-a)/n;
h1:=h/2;