Автор работы: Пользователь скрыл имя, 23 Мая 2013 в 19:11, курсовая работа
2. Цель работы
Изучить теоретический материал для решения задачи создания программы вычисления интеграла методом левых прямоугольников. Разработать алгоритм решения поставленной задачи, разработать программу на языке С++, протестировать созданную программу, устранить ошибки, выявленные на этапе тестирования.
3. Задание
Составить алгоритм решения задачи, отобразить на экране в графическом режиме с учетом масштабирования процесс вычисления интеграла. Выдать на экран точное и приближенное значения интеграла, абсолютную и относительную погрешности вычисления.
Тема работы 3
2. Цель работы 3
3. Задание 3
4. Исходные данные 3
5. Описание метода решения задачи, программы и используемых алгоритмов 4
5.1. Структура проекта 4
5.2. Алгоритм работы проекта 4-5
5.3. Вычисление интеграла методом левых прямоугольников 5
5.4. Точное решение интеграла 6
5.5. Абсолютная и относительная погрешность вычисления 6
6. Описание методики тестирования программы 6-9
7. Руководство пользователя по работе с программой………………...10
8. Блок-схема программы 11-16
9. Распечатка текста программы 16-21
10. Выводы по работе 21
11. Использованная литература 22
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++.
Информация о работе Программа вычисления интеграла методом левых прямоугольников