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

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

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 29.10.2017
Размер файла 572,0 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Министерство образования Российской Федерации

ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ

СИСТЕМ УПРАВЛЕНИЯ И РАДИОЭЛЕКТРОНИКИ (ТУСУР)

Кафедра радиоэлектроники и защиты информации (РЗИ)

Курсовая работа на тему: «Программа вычисления интеграла методом левых прямоугольников»

Выполнил: студент 181 группы

Охлопкова К.М.

Проверил: аспирант кафедры РЗИ

Конкин Д.А.

Томск 2012

Оглавление

Введение

1. Исходные данные

2. Описание метода решения задачи, программы и используемых алгоритмов

2.1. Структура проекта

2.2. Алгоритм работы проекта

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

2.4. Точное решение интеграла

2.5. Абсолютная и относительная погрешность вычисления

3. Описание методики тестирования программы

4. Руководство пользователя по работе с программой

5. Блок-схема программы

6. Распечатка текста программы

Выводы

Использованная литература

Введение

Тема работы

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

Цель работы

Изучить теоретический материал для решения задачи создания программы вычисления интеграла методом левых прямоугольников. Разработать алгоритм решения поставленной задачи, разработать программу на языке С++, протестировать созданную программу, устранить ошибки, выявленные на этапе тестирования.

Задание

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

1. Исходные данные

Число уравнений 3

1. ;

2. ;

3. .

Коэффициенты a, b, c - вещественные числа. Пределы интегрирования - вещественные числа, лежащие в пределах от -1000 до 1000. Число интервалов разбиения не более 500. Все параметры вводятся с клавиатуры или считываются из файла по выбору пользователя. Имя файла задается пользователем.

2. Описание метода решения задачи, программы и используемых алгоритмов

2.1 Структура проекта

Проект состоит из файлов:

1. Main.cpp - главный элемент проекта;

2. Integral.cpp - вычисление интеграла методом левых прямоугольников и получение точного решения интеграла;

3. Func.cpp - вычисление значения функции и ее первообразной от заданного аргумента;

4. Graph.cpp - отображение графиков функций и процесс вычисления интеграла в графическом режиме.

2.2 Алгоритм работы проекта

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

Исходные данные к программе:

х1 и x2 - пределы интегрирования (вещественные числа от -1000 до 1000)

a, b, c - коэффициенты в уравнениях (вещественные числа)

n - число интервалов разбиения (натуральное число не более 500).

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

Далее для каждого из 3х уравнений вычисляются и отображаются на экран:

1. Значение интеграла, вычисленного методом левых прямоугольников;

2. Точное значение интеграла;

3. Абсолютная погрешность вычисления;

4. Относительная погрешность вычисления.

Затем отображаются графики и процесс вычисления интеграла для всех 3х уравнений в графическом режиме.

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

Метод прямоугольников -- метод численного интегрирования функции одной переменной, заключающийся в замене подынтегральной функции на многочлен нулевой степени, то есть константу, на каждом элементарном отрезке. Если рассмотреть график подынтегральной функции, то метод будет заключаться в приближённом вычислении площади под графиком суммированием площадей конечного числа прямоугольников, ширина которых будет определяться расстоянием между соответствующими соседними узлами интегрирования, а высота -- значением подынтегральной функции в этих узлах. Алгебраический порядок точности равен 0[1].

Если отрезок является элементарным и не подвергается дальнейшему разбиению, значение интеграла можно найти по формуле левых прямоугольников:

В нашем случае h = (x2 - x1) / n- ширина одного прямоугольника.

Для вычисления значения функции создана функция

float y(float x, float a, float b, float c, int k)

Где x - значение аргумента,a, b, c - коэффициенты уравнения,k - номер уравнения (нумерация с 0).

Тогда функция вычисления интеграла методом левых прямоугольников имеет вид:

floatintegr(float x1, float x2, int n, float a, float b, float c, int k)

{//вычисление интеграла методом левых прямоугольников

float h = (x2 - x1) / n,//ширина одного прямоугольника

znInt = 0;//значение интеграла (сумма площадей прямоугольников)

for(inti = 0; i< n; i++)//вычисление суммы

znInt += h * y(x1 + i * h, a, b, c, k);

returnznInt;

}

2.4 Точное решение интеграла

Точное решение интеграла вычисляется стандартным способом вычисления определенного интеграла: разность значений первообразной функции от верхнего и нижнего пределов интегрирования. Или в нашем случае:

floatintegrToch(float x1, float x2, float a, float b, float c, int k)

{//точное решение интеграла = первообразная(х2) - первообразная(х1)

returnyPervoobr(x2, a, b, c, k) - yPervoobr(x1, a, b, c, k);

}

Где yPervoobr(floatx, floata, floatb, floatc, intk) - функция, вычисляющая значение первообразной от аргумента x уравнения kс коэффициентами a, b, c.

2.5 Абсолютная и относительная погрешность вычисления

Абсолютная погрешность вычисления находится как модуль разности между точным и приближенным решением[2]

А относительной погрешностью приближённого числа называется отношение абсолютной погрешности приближённого числа к самому этому числу в процентном соотношении.

Так в нашем случае

fabs(pribl - toch) - абсолютная погрешность;

fabs(pribl - toch) / toch * 100 - относительная погрешность.

Где pribl - приближенное решение интеграла (методом левых прямоугольников), toch - точное решение интеграла.

3. Описание методики тестирования программы

Протестируем на корректное вычисление интеграла.

Файл «test.txt» содержит данные и находится в папке программы:

То есть пределы интегрирования [1, 4], a=2, b=0, c=3 - коэффициенты в уравнениях, n = 10 - число интервалов разбиения.

Большие значения погрешностей обусловлено малым количеством отрезков разбиения. При увеличении числа разбиений вычисления интеграла погрешность должна уменьшаться. Протестируем это условие.

Для n = 50:

Для n = 100:

Действительно, при увеличении числа отрезков разбиения погрешность вычисления уменьшается.

Рассмотрим работу программы при некорректном вводе данных:

1. Неверный путь/имя файла:

2. Попытка ввода символов для численного значения:

Аналогично работает тестирование для остальных численных значений

3. Попытка ввода не натурального числа разбиений

Это основные тесты для программы. Программа прошла успешное тестирование, как на корректную работу, так и на корректное вычисление интегралов.

4. Руководство пользователя по работе с программой

При запуске программы предоставляется выбор: ввести данные с клавиатуры или ввести название файла, из которого необходимо прочесть эти данные.

При вводе данных необходимо учесть, что:

1. Пределы интегрирования (x1 и x2) должны иметь значения от -1000 до 1000, их разность не должна быть нулевой;

2. Коэффициенты в уравнениях являются (a, b, c) являются вещественными числами;

3. Число интервалов разбиения (n) - натуральное число не более 500.

При нарушении этих требований ввод данных необходимо повторить.

Файл с исходными данными должен иметь следующую структуру данных:

Значения x1,x2,a, b, c,n, разделенные пробелами или знаками переноса на следующую строку.

Если файл будет не найден, ввод необходимо повторить.

После корректного ввода данных будет отображены для заданных значений:

1. Значение интеграла, вычисленного методом левых прямоугольников;

2. Точное значение интеграла;

3. Абсолютная погрешность вычисления;

4. Относительная погрешность вычисления.

Для каждого из 3х уравнений:

1. ;

2. ;

3. .

И отображены графики этих уравнений для заданных исходных данных.

5. Блок-схема программы

Главная программа проекта

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

Вычисление точного значения интеграла

Вычисление значение функции с номером k

Вычисление значение первообразной от функции с номером k

Отображение графика одного уравнения с номером k на области от minx до miny по вертикали программа интеграл экран

Отображение трех графиков на одном экране

6. Распечатка текста программы

Main.cpp - главный элемент проекта

# include <iostream.h>

# include <conio.h>

# include <stdio.h>

# include <process.h>

# include <string.h>

#include "integral.cpp"

# ifndef __fstream_h

# include <fstream.h>

# endif

#include "graph.cpp"

void main()

{

float a, b, c,//коэффициенты уравнения

x1, x2;//пределы интегрирования

int n;//число интервалов разбиения

clrscr();

int successVubor,//успешный выбор команды меню и корректный выбор исходных значений

successVvod;//успещный ввод данных

do

{

cout<<"\nVvod dannuh:\n 1. S klaviatyru;\n 2. Iz faila;\n e. Vuhod.\n";

successVubor = 0;

switch(getch())

{

case '1'://ввод исходных данных с клавиатуры

do

{

fflush(stdin);//очистка буфера

cout<<"\nVvedite levuj predel integrirovaniya: ";

if((scanf("%f",&x1))==0)//если введено не число

{

cout<<"Tol'ko chislovoe znachenie!\n";

successVvod = 1;

}

else successVvod = 0;

}

while(successVvod);//пока не будет введено число

do

{

fflush(stdin);//очистка буфера

cout<<"Vvedite pravuj predel integrirovaniya: ";

if((scanf("%f",&x2))==0)//если введено не число

{

cout<<"Tol'ko chislovoe znachenie!\n";

successVvod = 1;

}

else successVvod = 0;

}

while(successVvod);//пока не будет введено число

do

{

fflush(stdin);//очистка буфера

cout<<"Vvedite znachenie a: ";

if((scanf("%f", &a))==0)//если введено не число

{

cout<<"Tol'ko chislovoe znachenie!\n";

successVvod = 1;

}

else successVvod = 0;

}

while(successVvod);//пока не будет введено число

do

{

fflush(stdin);//очистка буфера

cout<<"Vvedite znachenie b: ";

if((scanf("%f", &b))==0)//если введено не число

{

cout<<"Tol'ko chislovoe znachenie!\n";

successVvod = 1;

}

else successVvod = 0;

}

while(successVvod);//пока не будет введено число

do

{

fflush(stdin);//очистка буфера

cout<<"Vvedite znachenie c: ";

if((scanf("%f", &c))==0)//если введено не число

{

cout<<"Tol'ko chislovoe znachenie!\n";

successVvod = 1;

}

else successVvod = 0;

}

while(successVvod);//пока не будет введено число

do

{

fflush(stdin);//очистка буфера

cout<<"Vvedite kolichestvo otrezkov razbienij: ";

if((scanf("%d", &n))==0)//если введено не число (округляется, если введено нецелое)

{

cout<<"Tol'ko celoe chislovoe znachenie!\n";

successVvod = 1;

}

else successVvod = 0;

}

while(successVvod);//пока не будет введено число

break;

case '2'://чтение данных из файла

do

{

cout<<"\nVvedite pyt' i imya faila (vuhod iz programmu: e): ";

char fileName[40];

cin>>fileName;

if(!strcmp(fileName, "e"))

exit(1);

ifstream stream(fileName, ios::in);

if(stream == NULL)

cout<<"Oshibka otkrutiya faila. Prover'te pravilnost pyti faila.";

else

{

stream>>x1>>x2>>a>>b>>c>>n;

stream.close();

break;

}

}

while(1);

break;

case 'e'://выход

exit(1);

break;

default://любая другая клавиша = неудачный выбор подменю

successVubor = 1;

}

if(!successVubor)//если был осуществлен ввод исходных данных => проверка на их корректность

{

if(x1 == x2)

{

cout<<"Oshibka. Nylevoj interval integrirovaniya. Povtorite vvod.";

successVubor = 1;

}

if((x1 > 1000) || (x1 < -1000) || (x2 > 1000) || (x2 < -1000))

{

cout<<"Oshibka. Predelu integrirovaniya doljnu but' ot -1000 do 1000. Povtorite vvod.";

successVubor = 1;

}

if((n < 1) || (n > 500))

{

cout<<"Oshibka. Chislo razbienij doljno but 0 < n <= 500.";

successVubor = 1;

}

}

}

while(successVubor);//пока не будет осуществлен корректный ввод исходных данных

for(int k = 0; k < 3; k++)//для каждого из 3х уравнений

{//вычисляем приближенное значение интеграла, точное значение, абсолютную и относительную погрешности

float pribl = integr(x1, x2, n, a, b, c, k),

toch = integrToch(x1, x2, a, b, c, k);

cout<<"\n\nReshaem integral ot "<<(k + 1)<<" yravneniya.\nNaidennoe znachenie: "<<

pribl<<

"\nTochnoe znachenie: "<<toch<<

"\nAbsolytnaya pogr: "<<fabs(pribl - toch)<<

"\nOtnositelnaya pogr: "<<fabs((pribl - toch)) / toch * 100;

}

getch();

showGraphs(x1, x2, n, a, b, c);//отображаем графики этих уравнений

}

Integral.cpp - вычисление интеграла методом левых прямоугольников и получение точного решения интеграла

# ifndef __Func_cpp

# include "Func.cpp"

# endif

float integr(float x1, float x2, int n, float a, float b, float c, int k)

{//вычисление интеграла методом левых прямоугольников

float h = (x2 - x1) / n,//ширина одного прямоугольника

znInt = 0;//значение интеграла (сумма площадей прямоугольников)

for(int i = 0; i < n; i++)//вычисление суммы

znInt += h * y(x1 + i * h, a, b, c, k);

return znInt;

}

float integrToch(float x1, float x2, float a, float b, float c, int k)

{//точное решение интеграла = первообразная(х2) - первообразная(х1)

return yPervoobr(x2, a, b, c, k) - yPervoobr(x1, a, b, c, k);

}

Func.cpp - вычисление значения функции и ее первообразной от заданного аргумента

# ifndef __math_h

# include <math.h>

# endif

float y(float x, float a, float b, float c, int k)

{//значение фукнции под номером k(нумерация с нуля) при аргументе x, с заданными коэффициентами a, b, c

switch(k)

{

case 0:

return a * pow(x, 3) + b * x + c;

case 1:

return a * sin(x + b) + c;

case 2:

{

if(x + b != 0)

return a / (x + b) + c;

else

{

cout<<"Oshibka. Znamenatel' prinimaet nylevoe znachenie!";

return 0;

}

}

default:

return 0;

}

}

float yPervoobr(float x, float a, float b, float c, int k)

{//первообразная функций

switch(k)

{

case 0:

return a * pow(x, 4) / 4 + b * pow(x, 2) / 2 + c * x;

case 1:

return - a * cos(x + b) + c * x;

case 2:

if(x + b != 0)

return a * log (x + b) + c * x;

else

{

cout<<"Oshibka. Argyment logarifma prinimaet nylevoe znachenie!";

return 0;

}

default:

return 0;

}

}

Graph.cpp - отображение графиков функций и процесс вычисления интеграла в графическом режиме

#include <graphics.h>

#include <values.h>

int gdriver = DETECT, gmode, errorcode;

void showGraph(float x1, float x2, int n, float a, float b, float c, int k,

int miny, int maxy)

{//отображение графика одного уравнения с номером k на области от minx до miny по вертикали

float h = (x2 - x1) / n;//ширина одного прямоугольника

int minx = 20,// и miny, maxy - границы области в которой нужно нарисовать график

maxx = 600;

float y1 = MAXDOUBLE,//мин и макс значение функции

y2 = -MAXDOUBLE,

dx;

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

{//поиск мин и макс значений функции у1 и у2

float zn = y(x1 + i * h, a, b, c, k);

if(y1 > zn)

y1 = zn;

if(y2 < zn)

y2 = zn;

}

float kx, ky;//коэффициенты растяжения графика по 0х и по 0у на всю область

kx = (maxx - minx)/(x2 - x1);

ky = (maxy - miny)/(y2 - y1);

int Oy = ky * y2 + miny;//где находится ось (уравнение x=0)

int OyOtobr;//отображаемая ось

if (ky * y2 + miny > maxy)//если уравнение x=0 находится вне области отображения графика, отображаем ось внизу области

OyOtobr = maxy;

else//иначе на том уровне, где она должна быть

OyOtobr = ky * y2 + miny;

dx = kx * h;//шаг по 0х в пиксельном выражении

setcolor(GREEN);//прямоугольники зеленым

for(i = 0; i < n; i++)

rectangle(minx + dx * i, Oy - y(x1 + i * h, a, b, c, k) * ky,

minx + dx * (i + 1), OyOtobr);

setcolor(RED);//график красным

moveto(minx, Oy - y(x1, a, b, c, k) * ky);//встаем в начало

for(i = 0; i <= n; i++)//и прорисовываем график

lineto(minx + dx * i, Oy - y(x1 + i * h, a, b, c, k) * ky);

setcolor(WHITE);//оси белым

moveto(minx, OyOtobr);//прорисовка осей

lineto(maxx + 8, OyOtobr);

lineto(maxx + 3, OyOtobr - 5);

moveto(maxx + 8, OyOtobr);

lineto(maxx + 3, OyOtobr + 5);

moveto(minx, maxy);

lineto(minx, miny - 8);

lineto(minx + 5, miny - 3);

moveto(minx, miny - 8);

lineto(minx - 5, miny - 3);

if(x1 * x2 < 0)//отображение точки (0,0), если она оказалась в отображаем области

outtextxy(minx - x1 * kx - 3, OyOtobr + 5, "(0,0)");

}

void showGraphs(float x1, float x2, int n, float a, float b, float c)

{

initgraph(&gdriver, &gmode,"");//переход в графический режим

showGraph(x1, x2, n, a, b, c, 0, 10, 150);//отображение графика первого уравнения на участке экрана от 10 до 150 пикселей сверху

showGraph(x1, x2, n, a, b, c, 1, 172, 322);//отображение графика второго уравнения -//-

showGraph(x1, x2, n, a, b, c, 2, 344, 470);//отображение графика третьего уравнения -//-

getch();

closegraph();//выход из графического режима

}

Выводы

Изучен теоретический материал для решения задачи создания программы вычисления интеграла методом левых прямоугольников. Разработан алгоритм решения поставленной задачи, разработана и протестирована программа на языке С++, выявленные ошибки в ходе тестирования устранены, контрольное тестирование ошибок не показала. Изучен и применен теоретический материал для работы с графикой на языке C++.

Использованная литература

1. Wikipedia. Метод прямоугольников. http://ru.wikipedia.org/wiki/Метод_прямоугольников. Интернет ресурс. Вход свободный.

2. Комбинаторика. http://webmath.exponenta.ru/s/c/algebra/content/chapter4/section3/paragraph9/theory.html. Интернет ресурс. Вход свободный.

Размещено на Allbest.ru


Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.