- •Томский государственный университет систем управления и радиоэлектроники (тусур)
- •Программа вычисления интеграла методом левых прямоугольников.
- •Реферат Курсовая работа 31стр., 8 рис., 4 прил., 2 источника, 7 схем.
- •1.3.Вычисление интеграла методом левых прямоугольников
- •1.4.Точное решение интеграла
- •1.5.Абсолютная и относительная погрешность вычисления
- •2.Описание методики тестирования программы
- •3.Руководство пользователя по работе с программой.
- •4.Блок-схемы программ
- •5.Отображение трех графиков на одном экране.
- •Заключение.
- •Использованная литература:
- •Приложение а.
- •Приложение в.
- •Integral.Cpp – вычисление интеграла методом левых прямоугольников и получение точного решения интеграла
- •Приложение с.
- •Приложение d.
Приложение в.
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;
}
}
Приложение d.
Graph.cpp – отображение графиков функций и процесс вычисления интеграла в графическом режиме
#include <graphics.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <values.h>
#include <math.h>
//# include <iostream.h>
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 f1(float x,float a)
{
return a*a*a/(x*x+a*a);
}
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 = 500,//мин и макс значение функции
y2 = -500,
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 = (int)(ky * y2 + miny);//где находится ось (уравнение x=0)
int OyOtobr;//отображаемая ось
if (ky * y2 + miny > maxy)//если уравнение x=0 находится вне области отображения графика, отображаем ось внизу области
OyOtobr = maxy;
else//иначе на том уровне, где она должна быть
OyOtobr = (int)(ky * y2 + miny);
dx = kx * h;//шаг по 0х в пиксельном выражении
setcolor(GREEN);//прямоугольники зеленым
for(int i = 0; i < n; i++)
rectangle((int)(minx + dx * i), (int)(Oy - y(x1 + i * h, a, b, c, k) * ky),
(int)(minx + dx * (i + 1)), OyOtobr);
setcolor(RED);//график красным
moveto(minx, (int)(Oy - y(x1, a, b, c, k) * ky));//встаем в начало
for(int i = 0; i <= n; i++)//и прорисовываем график
lineto((int)(minx + dx * i), (int)(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((int)(minx - x1 * kx - 3), OyOtobr + 5, "(0,0)");
}
main()
{
//float a,xp,yp,xt,yt;
int gdriver,gmode,i;
gdriver=DETECT;
printf("a=");
//scanf("%f",&a);
initgraph(&gdriver,&gmode,"");
/*xp=1;
yp=f1(xp,a)+150;
for(i=2;i<=640;i=i+10)
{
xt=i;
yt=f1(xt,a)+150;
line(xp,yp,xt,yt);
xp=xt;
yp=yt;
}*/
float x1 = 1, x2 = 4, a = 2, b = 0, c = 3;
int n = 10;
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();
}