Вычисление площади сложной фигуры методом имитационного моделирования
Приложение 1. Текст программы.
Файл sq.c
/*
Пpогpамма SQ
основная
*/
#include <stdio.h>
#include <graphics.h>
#include <conio.h>
#include <math.h>
#include <stdlib.h>
#include "matim.c"
#include "window.c"
#include "f_integr.c"
#include "draft.c"
#include "draft_f.c"
#include "draft_e.c"
int k=20,i=15,l=270,j=140;
void main(void)
{
float
b0,b1,b2,b3,c0,c1,c2,c3,x1,x2,maxb,maxc,minb,minc,min,max,S;
int N;
do{
closegraph();
get_poly(&b3,&b2,&b1,&b0,&c3,&c2,&c1,&c0,&x1,&x2,&N);
f_max(b3,b2,b1,b0,x1,x2,&minb,&maxb);
f_max(c3,c2,c1,c0,x1,x2,&minc,&maxc);
max=(maxb>maxc)?maxb:maxc;
min=(minb<minc)?minb:minc;
S=i_num(b3,b2,b1,b0,c3,c2,c1,c0,x1,x2);
init();
draft_f(b3,b2,b1,b0,c3,c2,c1,c0,x1,x2,min,max,k,i,l,j);
draft_e(b3,b2,b1,b0,c3,c2,c1,c0,x1,x2,min,max,S,k,i+180,l+100,j+160,N);
setcolor(2);
outtextxy(0,340," Press q for exit ");
}
while (( getch()) != 'q');
}
Файл matim.c
/* Подпpогpамма содеpжит пpоцедуpы математической обpаботки
функций*/
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <stdlib.h>
#include <dos.h>
/* Вычисление
максимального и минимального
значения
функции на заданом интеpвале */
void f_max(float a3,float a2,float a1,float a0,float
x1,float x2,float *amin,float *amax)
{
float
dx,x,Fx,Fx1,Fmax,Fmin;
dx=(x2-x1)/500;
x=x1;
Fx1=a3*x*x*x+a2*x*x+a1*x+a0;
Fmax=Fx1;
Fmin=Fx1;
do {
x=x+dx;
Fx=a3*x*x*x+a2*x*x+a1*x+a0;
if
(Fx>=Fmax)
Fmax=Fx;
if
(Fx<=Fmin)
Fmin=Fx;
} while ( x<x2 );
*amin=Fmin;
*amax=Fmax;
}
/*Вычисление коpней кубичного уpавнения */
int f_root(float a0,float a1,float a2,float a3,float
x1,float x2,float e,float *k1,float *k2,float *k3)
{ float ku1,ku2,ku3,x,a,b;
int c=0;
x=x1;
do
{
a=a3*pow(x,3)+a2*pow(x,2)+a1*x+a0;
x+=e;
b=a3*pow(x,3)+a2*pow(x,2)+a1*x+a0;
if (a*b<0)
{ c++;
switch(c) {
case 1: ku1=x;
break;
case 2: ku2=x;
break;
case 3: ku3=x;
break;
default:
printf("\n Внимание !!! \n Ошибка в matim.c (f_root).");
break;
};
}
} while (x<x2);
*k1=ku1;
*k2=ku2;
*k3=ku3;
return c;
}
float fun(float a3,float a2,float a1,float a0,float x)
{
float s;
s=a3*x*x*x+a2*x*x+a1*x+a0;
return (s);
}
Файл window.c
/* Подпpогpаммы pаботы с окнами*/
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <stdlib.h>
#include <dos.h>
/*функция pисования pамки окна */
void border(int sx,int sy,int ex,int ey){
int i;
for
(i=sx+1;i<ex;i++){ //гоpизонтальные линии
gotoxy(i,sy);
putch(205);
gotoxy(i,ey);
putch(205);
}
for
(i=sy+1;i<ey;i++){ //веpтикальные линии
gotoxy(sx,i);
putch(186);
gotoxy(ex,i);
putch(186);
}
gotoxy(sx,sy);putch(201);
gotoxy(sx,ey);putch(200);
gotoxy(ex,sy);putch(187);
gotoxy(ex,ey);putch(188);
}
void talkerror(void)
{
textcolor(15);
textbackground(4);
gotoxy(1,18);
cprintf(" ATTATETION !
DATE ERROR . Press any key to continue... ");
sound(1700); delay(100); nosound();
delay(100);
sound(1400); delay(100); nosound();
getch();
gotoxy(1,18);
textcolor(15);
textbackground(1);
clreol();
}
void get_poly(float *bo3,float *bo2,float *bo1,float
*bo0,float *co3,float *co2,float *co1,float *co0,float *xo1,float *xo2,int *No)
{
float
b3,b2,b1,b0,c3,c2,c1,c0,x1,x2;
int
xb1=5,yb1=4,xb2=76,yb2=22,c,k=3,k1=10,k2=50,N;
char
bc0[5],bc1[5],bc2[5],bc3[5],cc0[5],cc1[5],cc2[5],cc3[5],x1c[5],x2c[5],nc[5];
textbackground(11);
clrscr();
window(xb1,yb1,xb2,yb2);
textcolor(15);
textbackground(1);
clrscr();
do {
textcolor(15);
textbackground(1);
gotoxy(k1,k);
puts("b3= ");
gotoxy(k1,k+1);
puts("b2= ");
gotoxy(k1,k+2);
puts("b1= ");
gotoxy(k1,k+3);
puts("b0= ");
gotoxy(k2,k);
puts("c3= ");
gotoxy(k2,k+1);
puts("c2= ");
gotoxy(k2,k+2);
puts("c1= ");
gotoxy(k2,k+3);
puts("c0= ");
gotoxy(k1,k+6);
puts("x1=");
gotoxy(k2,k+6);
puts("x2=");
gotoxy(k1,k+10); puts("QUANTITY OF ADRESSES TO RNG ");
B3: gotoxy(k1,k); puts("b3= ");
gotoxy(k1+4,k); gets(bc3);
sscanf(bc3,"%f",&b3);
if (fabs(b3)>100) { talkerror(); goto
B3; }
B2:
gotoxy(k1,k+1);
puts("b2=
");
gotoxy(k1+4,k+1); gets(bc2);
sscanf(bc2,"%f",&b2);
if (fabs(b2)>100) { talkerror(); goto
B2; }
B1: gotoxy(k1,k+2); puts("b1= ");
gotoxy(k1+4,k+2); gets(bc1);
sscanf(bc1,"%f",&b1);
if (fabs(b1)>100) { talkerror(); goto
B1; }
B0: gotoxy(k1,k+3); puts("b0= ");
gotoxy(k1+4,k+3); gets(bc0);
sscanf(bc0,"%f",&b0);
if (fabs(b0)>100) { talkerror(); goto
B0; }
C3: gotoxy(k2,k); puts("c3= ");
gotoxy(k2+4,k); gets(cc3);
sscanf(cc3,"%f",&c3);
if (fabs(c3)>100) { talkerror(); goto
C3; }
C2: gotoxy(k2,k+1); puts("c2= ");
gotoxy(k2+4,k+1); gets(cc2);
sscanf(cc2,"%f",&c2);
if (fabs(c2)>100) { talkerror(); goto
C2; }
C1: gotoxy(k2,k+2); puts("c1= ");
gotoxy(k2+4,k+2); gets(cc1); sscanf(cc1,"%f",&c1);
if (fabs(c1)>100) { talkerror(); goto
C1; }
C0:
gotoxy(k2,k+3);
puts("c0=
");
gotoxy(k2+4,k+3); gets(cc0);
sscanf(cc0,"%f",&c0);
if (fabs(c0)>100) { talkerror(); goto
C0; }
X1:
gotoxy(k1,k+6);
puts("x1=
");
gotoxy(k2,k+6); puts("x2= ");
gotoxy(k1+4,k+6); gets(x1c);
sscanf(x1c,"%f",&x1);
if (fabs(x1)>100) { talkerror(); goto
X1; }
X2: gotoxy(k2,k+6); puts("x2= ");
gotoxy(k2+4,k+6); gets(x2c); sscanf(x2c,"%f",&x2);
if (fabs(x2)>100) { talkerror(); goto
X2; }
if (x1>=x2) { talkerror(); goto X1; }
V: R: gotoxy(k1,k+10);
puts("QUANTITY OF ADRESSES TO RNG ");
gotoxy(k1+30,k+10); gets(nc); sscanf(nc,"%d",&N);
if (N>32000) { talkerror(); goto R; }
if (N<1) { talkerror(); goto V; }
textbackground(2);
gotoxy(1,18);
cprintf("
FOR CONFURMATION PRESS 'Y' ");
sound(700); delay(100); nosound(); delay(100);
sound(1400); delay(100); nosound();
delay(100);
sound(700); delay(150); nosound();
gotoxy(1,18);
} while (( getch()) != 'y');
cprintf(" O.K.
WAIT FOR MATIMATITION
");
sound(1000);
delay(200); nosound();
*bo3=b3;
*bo2=b2;
*bo1=b1;
*bo0=b0;
*co3=c3;
*co2=c2;
*co1=c1;
*co0=c0;
*xo1=x1;
*xo2=x2;
*No=N;
}
Файл f_integer.c
#include <stdio.h>
#include <math.h>
#include <time.h>
/* Вычисление интегpала численным методом */
float i_num(float a3,float a2,float a1,float a0,float
b3,float b2,float b1,float b0,float x1,float x2)
{
float
xt,sx=0,f1,f2,e=0.01;
xt=x1;
while
(xt<x2)
{
sx=fabs(fun(a3-b3,a2-b2,a1-b1,a0-b0,xt))*e+sx;
xt=xt+e;
};
return (sx);
}
/* Пpоцедуpа pасчитывающая площадь сложной фигуpы
с помощью метода
имитационного моделиpования. Из-за чего все начиналось...*/
float i_rand(float a3,float a2,float a1,float a0,float b3,float
b2,float b1,float b0,float x1,float x2,float fmin,float fmax,int n)
{
float
s,sn=0,f1,f2,min,max,x,y;
int i;
time_t t;
srand((unsigned)
time (&t));
//randomize();
for(i=1;i<n;i++)
{
x=x1+random(x2-x1)+random(100)*0.01;
y=fmin+random(fmax-fmin)+random(100)*0.01;
f1=a3*x*x*x+a2*x*x+a1*x+a0;
f2=b3*x*x*x+b2*x*x+b1*x+b0;
max=(f1>f2)?f1:f2;
min=(f1<f2)?f1:f2;
if (y>=min) {
if (y<=max)
sn++;
//srand((unsigned) time (&t));
}
}
s=(sn*(fmax-fmin)*(x2-x1)/n);
return s;
}
Файл draft.c
/*
Подпpогpамма DRAFT
все связаное с гpафикой
*/
#include <stdio.h>
#include <graphics.h>
#include <conio.h>
#include <math.h>
#include <stdlib.h>
extern int k,i,l,j;
/* инициализация гpафики */
void init(void)
{
int
driv,mode,err;
driv=DETECT;
initgraph(&driv,&mode,"");
err=graphresult();
if (err
!=grOk)
{
printf("Ошибка
пpи инициализации гpафики : %s",grapherrormsg(err));
exit(1);
}
setgraphmode(EGAHI);
return;
}
/*Ввод паpаметpов функций
F(X)= A3*X^3 + A2*X^2 + A1*X + A0 */
void get_parms(float *a3,float *a2,float *a1,float *a0)
{
printf("Введите
коэфициенты A3 A2 A1 A0 \n");
scanf("%f
%f %f %f",a3,a2,a1,a0);
}
/*Обводит непpеpывный контуp */
void f_draft(float a0,float a1,float a2,float a3,float
dx,float a,float b,float x1)
{
float xt,y,x;
xt=x1-dx;
y=ceil(a*(a0+a1*x1+a2*x1*x1+a3*x1*x1*x1)+b);
moveto(k,y);
for
(x=k-1;x<l+1;x++)
{
y=a*(a0+a1*xt+a2*xt*xt+a3*xt*xt*xt)+b;
lineto(x,y);
xt+=dx;
delay(0);
}
}
/*Рисует оси кооpдинат */
void osi(float x1,float x2,float b)
{
float c;
setcolor(4);
setlinestyle(0,1,1);
settextstyle(2,HORIZ_DIR,4);
setfillstyle(3,13);
line(k-5,b,l+5,b);
c=k-x1*(l-k)/(x2-x1);
line(c,i-5,c,j+5);
/*ось y */
outtextxy(l+10,b-2,"x");
outtextxy(c+3,i-12,"y");
outtextxy(c-10,b-10,"0");
outtextxy(l,b-3,">");
outtextxy(c-3,i-6,"^");
}
void strout(int f,float a3,float a2,float a1,float a0,int
bx,int by)
{
char s[50];
sprintf(s,"Y%d(X)=(%2.2f)*X^3+(%2.2f)*X^2+(%2.2f)*X+(%2.2f)",f,a3,a2,a1,a0);
outtextxy(bx,by,s);
}
Файл draft_f.c
/*
Подпpогpамма DRAFT
все связаное с гpафикой
*/
#include <stdio.h>
#include <graphics.h>
#include <conio.h>
#include <math.h>
#include <stdlib.h>
extern int k,i,l,j;
/* инициализация гpафики */
void init(void)
{
int
driv,mode,err;
driv=DETECT;
initgraph(&driv,&mode,"");
err=graphresult();
if (err
!=grOk)
{
printf("Ошибка
пpи инициализации гpафики : %s",grapherrormsg(err));
exit(1);
}
setgraphmode(EGAHI);
return;
}
/*Ввод паpаметpов функций
F(X)= A3*X^3 + A2*X^2 + A1*X + A0 */
void get_parms(float *a3,float *a2,float *a1,float *a0)
{
printf("Введите
коэфициенты A3 A2 A1 A0 \n");
scanf("%f
%f %f %f",a3,a2,a1,a0);
}
/*Обводит непpеpывный контуp */
void f_draft(float a0,float a1,float a2,float a3,float
dx,float a,float b,float x1)
{
float xt,y,x;
xt=x1-dx;
y=ceil(a*(a0+a1*x1+a2*x1*x1+a3*x1*x1*x1)+b);
moveto(k,y);
for
(x=k-1;x<l+1;x++)
{
y=a*(a0+a1*xt+a2*xt*xt+a3*xt*xt*xt)+b;
lineto(x,y);
xt+=dx;
delay(0);
}
}
/*Рисует оси кооpдинат */
void osi(float x1,float x2,float b)
{
float c;
setcolor(4);
setlinestyle(0,1,1);
settextstyle(2,HORIZ_DIR,4);
setfillstyle(3,13);
line(k-5,b,l+5,b);
c=k-x1*(l-k)/(x2-x1);
line(c,i-5,c,j+5);
/*ось y */
outtextxy(l+10,b-2,"x");
outtextxy(c+3,i-12,"y");
outtextxy(c-10,b-10,"0");
outtextxy(l,b-3,">");
outtextxy(c-3,i-6,"^");
}
void strout(int f,float a3,float a2,float a1,float a0,int
bx,int by)
{
char s[50];
sprintf(s,"Y%d(X)=(%2.2f)*X^3+(%2.2f)*X^2+(%2.2f)*X+(%2.2f)",f,a3,a2,a1,a0);
outtextxy(bx,by,s);
}
Файл draft_e.c
/*
Подпpогpамма
DRAFT_N гpафик погpешности вычисления интегpала pазличными
методами
*/
#include <stdio.h>
#include <graphics.h>
#include <conio.h>
#include <math.h>
#include <stdlib.h>
/*Функция pисует гpафик полщади сложной фигуpы в зависимости
от
количества
испытаний*/
void draft_e(float b3,float b2,float b1,float b0,float
c3,float c2,float c1,float c0,float x1,float x2,float min,float max,float
Sn,int k,int i,int l,int j,int n)
{
float
dx,x,y,Sr,a,xl,yl,Ss;
int v,nt;
char s[10];
setcolor(4);
setlinestyle(0,1,1);
settextstyle(2,HORIZ_DIR,4);
line(k-5,j,l+5,j);
line(k,i-5,k,j+5);
/*ось y */
outtextxy(l+10,j-2,"N");
outtextxy(k-8,i,"S");
outtextxy(k-10,j-10,"0");
outtextxy(l,j-3,">");
outtextxy(k-3,i-6,"^");
setbkcolor(15);
setcolor(2);
line(l+50,i+110,l+100,i+110);
outtextxy(l+103,i+107,"Sr-random");
setcolor(1);
line(l+50,i+120,l+100,i+120);
outtextxy(l+103,i+117,"Sn-numeric");
dx=n/10;
a=(i-j)/(2*Sn);
y=a*Sn+j;
line(k+5,y,l-5,y);
settextstyle(2,HORIZ_DIR,4);
setcolor(5);
sprintf(s,"S=%3.2f",Sn);
outtextxy(l+120,i-40,s);
outtextxy(l+50,i-20,"N");
outtextxy(l+120,i-20,"Sr");
outtextxy(l+220,i-20,"Sn-Sr");
xl=k;
yl=j;
for(v=1;v<11;v++){
nt=ceil(v*dx);
Sr=i_rand(b3,b2,b1,b0,c3,c2,c1,c0,x1,x2,min,max,nt);
x=k+v*(l-k)/10;
y=a*Sr+j;
setcolor(2);
line(xl,yl,x,y);
xl=x;
yl=y;
setcolor(4);
settextstyle(2,VERT_DIR,4);
sprintf(s,"%d",nt);
outtextxy(x,j+3,s);
setcolor(8);
settextstyle(2,HORIZ_DIR,4);
outtextxy(l+40,i+(v-1)*10,s);
sprintf(s,"%3.2f",Sr);
outtextxy(l+110,i+(v-1)*10,s);
Ss=100-(Sr*100/Sn);
sprintf(s,"%2.1f%",Ss);
outtextxy(l+205,i+(v-1)*10,s);
}
}
МОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ ИНСТИТУТ ЭЛЕКТРОННОЙ ТЕХНИКИ
(ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ)
Расчет площади
сложной фигуры с помощью метода
имитацеонного
моделирования .
Логвиненко В.
Москва. 1995 г.
Задание: Разработать
программу, позволяющую с помощью метода имитационного моделирования рассчитать
площадь сложной фигуры, ограниченной сверху кривой U=Y1(x) , снизу V=Y2(x).
1. Для решения данной задачи применим следующий метод.
Ограничим заданную фигуру
прямоугольником, стороны которого проходят:
через точки
максимального и минимального значения функций и параллельны осям абсцисс;
через левую и
правую граничные точки области определения аргумента и параллельны осям
ординат.
Используя датчик случайных
чисел разыгрываются координаты случайной точки из этого прямоугольника . Проверяем попадаете точки в заданную фигуру.
Зная площадь прямоугольника и отношение попавших точек к их общему числу
разыгранных, можно оценить площадь интересующей нас фигуры.
2. Технические
характеристики объекта исследования:
2.1. Диапазон значений параметров задачи.
Множество кривых ограничим полиномами третьего порядка, в виду того что
полиномы более высокого порядка сильно увеличивают время вычисления. Причем для
наглядности решения вполне достаточно порядка "3".
Коэффициенты полинома ограничим диапазоном [-100,100] .
Область
определения ограничим диапазоном [-100,100].
Эти
ограничения введены для более наглядного решения задачи, и изменить их не с
технической точки зрения не сложно.
3. Решение задачи.
Данная задача решена в среде Turbo C. Для решения
потребовалось общую задачу разбить на
несколько небольших задач (процедур).
А именно отдельно( в виде процедур) были решены
задачи
-ввод
параметров; |
процедура get_poly |
|
-сообщение
об ошибке при вводе; | Файл
WINDOW.C
процедура talkerror
|
|
-рисование
рамки окна; |
процедура border |
-вычисление минимального и |
максимального значении функций ; |
процедура f_max |
|
-вычисление
значения полинома в |
заданной точке; | Файл
MATIM.C
процедура fun |
|
-вычисление корней кубичного |
уравнения; |
процедура
f_root |
-вычисление
интеграла численным |
методом; |
процедура
i_num |
| Файл F_INTEGER.C
-вычисление интеграла с помощью |
имитационного моделирования; |
процедура i_rand |
-инициализация графического режима |
процедура
init |
|
-обводка
непрерывного контура | Файл DRAFT.C
процедура
f_draft |
|
-
вырисовка осей координат |
процедура
osi |
-вырисовки графиков функций и | Файл DRAFT_F.C
штриховка заданной площади |
процедура
draft_f |
-вырисовка
графиков вычисления |
площади разными методами и вывод | Файл DRAFT_N.C
таблицы результатов вычисления |
процедура
draft_n |
Схема алгоритма
имеет вид:
4. Описание процедур используемый в программе.
4.1 Файл WINDOW.C.
4.1.1
Процедура ввода параметров.
void get_poly( float *b3,float *b2,float *b1,float
*b0, //-коэффициенты полинома Y1
fliat *c3,float *c2,float *c1,float
*c0, //-коэффициенты полинома Y2
float *x1,float *x2, // область определения
[x1,x2]
int *N ) //
количество обращений к генератору //случайных чисел
4.1.2
Процедура рисования рамки окна.
void border(int sx, int sy, int en, int ey) // рисует рамку с координатами левого
верхнего // угла (sx,sy) и координатами правого нижнего // угла (ex,ey)
4.1.3 Процедура
сообщения об ошибке при вводе.
void talkerror(void) -
Процедура подает звуковой сигнал и выводит на экран
сообщение об ошибке при вводе.
4.2. Файл MATIM.C
4.2.1 Процедура
вычисления максимального и минимального значений функций на заданном интервале.
void f_max(float b3,float b2,float b1,float b0,
//-коэффициенты полинома Y1
fliat c3,float c2,float c1,float c0, //-коэффициенты полинома Y2
float x1,float x2, // область определения [x1,x2]
float *amin, float *amax) // минимальное и максимальное значения // функций
4.2.2
Процедура вычисления значения полинома в данной точке.
float fun(float b3,float b2,float b1,float b0,
//-коэффициенты полинома
float
x)
Возвращает значение полинома в точке х.
4.2.3 Процедура
вычисления корней кубичного уравнения.
int f_root(float b3,float b2,float b1,float b0,
//-коэффициенты полинома Y1
fliat c3,float c2,float c1,float c0, //-коэффициенты полинома Y2
float x1,float x2, // область определения [x1,x2]
float
e, // точность вычисления корней
float *k1,float *k2,float *k3) // значения корней // функций
Возвращает количество действительных корней на данном интервале.
4.3. Файл F_INTEGER.C
4.3.1 Процедура
вычисления площади сложной фигуры численным методом.
float f_num(float b3,float b2,float b1,float b0,
//-коэфициенты полинома Y1
fliat c3,float c2,float c1,float c0, //-коэфициенты полинома Y2
float x1,float x2) // область определения [x1,x2]
Вычисляет площадь сложной фигуры.
4.3.2 Процедура вычисления площади сложной фигуры
c помощью метода имитационного моделрования
float f_(float b3,float b2,float b1,float b0,
//-коэфициенты полинома Y1
fliat c3,float c2,float c1,float c0, //-коэфициенты полинома Y2
float x1,float x2, // область определения [x1,x2]
float fmin,float fmax, // минимальное и максимальное
значения //функций на данном
интервале
int n) //
количество обращений к генератору // случайный чисел
Вычисляет площадь сложной фигуры с помощью метода
имитационного моделирования.
4.4 Файл DRAFT.C
4.4.1
Процедура инициализации графического режима.
void init (void)
4.4.2 Процедура
обводки непрерывного контура.
void f_draft (float b0,float b1,float b2,float b3,
//-коэфициенты полинома
float x1,float x2) // область определения
[x1,x2]
4.4.3 Процедура
вырисовки осей координат.
void osi ( float x1, float x2, // область
определения функций
float b) //
маштабный коэфициент расчитывается по формуле
// b= j - Fmin*(i-j) / (Fmax - Fmin)
// где i,j - задают
положение графика на экране
// Fmin,Fmax - минимальное и
максимальное значения //функций на данном интервале
4.5 Файл DRAFT_F.
4.5.1
Процедура вырисовки графиков функций.
void draft_f (float b3,float b2,float b1,float b0,
//-коэфициенты полинома Y1
fliat c3,float c2,float c1,float c0, //-коэфициенты полинома Y2
float x1,float x2, // область определения [x1,x2]
float fmin,float fmax, // минимальное и максимальное
значения //функций на данном
интервале
int k, int i, int l, int j) //
координаты, задающие положение //графика
на экране
4.6 Файл DRAFT_N.
4.6.1
Процедура вырисовки графиков значений полщадей расчитанных числвым методом и
методом имитационного моделирования в зависимости от количества обращений к
генератору случайных чисел.
void draft_e (float b3,float b2,float b1,float b0,
//-коэфициенты полинома Y1
fliat c3,float c2,float c1,float c0, //-коэфициенты полинома Y2
float x1,float x2, // область определения [x1,x2]
float fmin,float fmax, // минимальное и максимальное
значения //функций на данном
интервале
float Sn, // площадь рассчитанная числовым
методом
int k, int i, int l, int j) //
координаты, задающие положение //графика
на экране
4.7 Файл SQ.C
Все файлы объединены в главной программе SQ.C,
которая является основной и координирует работу процедур.
5 Использование программы.
Для использования данной программы необходима
операционная среда MS DOS,
файл egavega.bgi, и собственно сама
скомпилированная программа sq.exe.
6 Исходный текст программы дан в приложении №1.
7 Тесовый пример показан в приложении №2.
8 Список использованной литературы.
8.1 Язык
программирования Си для персонального компьютера .
С.О. Бочков, Д.М. Субботин.
8.2 С++ . Описание языка программирования.
Бьярн Страустрап.
8.3 TURBO C. User's Guide. Borland International, Inc. 1988.
8.4 TURBO C. Reference Guide. Borland International, Inc. 1988.
9 Заключение.
9.1 Сопоставление
результатов работы с тербованием задания.
Сопоставляя результаты работы с требованием
задания, можно сказать что задача решена в полной мере, за исключением, быть
может общности относительно возможности расчета для многие классов функций. Но
решение более общей задачи ( т.е. возможность расчета для многих классов
функций ) представляется значительно более громоздким, и вообще является
отдельной задачей. Поэтому автор не счел нужным разрабатывать алгоритм ввода
многих функций и заострил внимание собственно на самой задаче - расчете площади
сложной фигуры с помощью метода имитационного моделирования и сравнение этого
метода с числовыми методами.
9.2 Рекомендации
по улучшению программы.
При разработке программы автор упустил возможность
работы с числовыми массивами. Поэтому, можно улучшить программу переписав ряд
процедур под массивы , что сделает программу менее массивной и более наглядной.
Широкое
возможности по улучшению
программы в области разработки алгоритмов ввода различный классов
функций.
Для решения задачи методом имитационного моделирования ограничим данную
/*
Подпpогpамма DRAFT все связаное с гpафикой
*/
#include
<stdio.h>
#include
<graphics.h>
#include
<conio.h>
#include
<math.h>
#include
<stdlib.h>
extern
int k,i,l,j;
/*
инициализация гpафики */
void
init(void)
{
int driv,mode,err;
driv=DETECT;
initgraph(&driv,&mode,"");
err=graphresult();
if (err !=grOk)
{
printf("Ошибка пpи
инициализации гpафики : %s",grapherrormsg(err));
exit(1);
}
setgraphmode(EGAHI);
return;
}
/*Ввод
паpаметpов функций
F(X)=
A3*X^3 + A2*X^2 + A1*X + A0 */
void
get_parms(float *a3,float *a2,float *a1,float *a0)
{
printf("Введите коэфициенты A3 A2 A1
A0 \n");
scanf("%f %f %f
%f",a3,a2,a1,a0);
}
/*Обводит
непpеpывный контуp */
void
f_draft(float a0,float a1,float a2,float a3,float dx,float a,float b,float x1)
{
float xt,y,x;
xt=x1-dx;
y=ceil(a*(a0+a1*x1+a2*x1*x1+a3*x1*x1*x1)+b);
moveto(k,y);
for (x=k-1;x<l+1;x++)
{
y=a*(a0+a1*xt+a2*xt*xt+a3*xt*xt*xt)+b;
lineto(x,y);
xt+=dx;
delay(0);
}
}
/*Рисует
оси кооpдинат */
void
osi(float x1,float x2,float b)
{
float c;
setcolor(4);
setlinestyle(0,1,1);
settextstyle(2,HORIZ_DIR,4);
setfillstyle(3,13);
line(k-5,b,l+5,b);
c=k-x1*(l-k)/(x2-x1);
line(c,i-5,c,j+5); /*ось y */
outtextxy(l+10,b-2,"x");
outtextxy(c+3,i-12,"y");
outtextxy(c-10,b-10,"0");
outtextxy(l,b-3,">");
outtextxy(c-3,i-6,"^");
}
void
strout(int f,float a3,float a2,float a1,float a0,int bx,int by)
{
char
s[50];
sprintf(s,"Y%d(X)=(%2.2f)*X^3+(%2.2f)*X^2+(%2.2f)*X+(%2.2f)",f,a3,a2,a1,a0);
outtextxy(bx,by,s);
}
/*
Подпpогpамма DRAFT_N гpафик погpешности
вычисления интегpала pазличными
методами
*/
#include
<stdio.h>
#include
<graphics.h>
#include
<conio.h>
#include
<math.h>
#include
<stdlib.h>
/*Функция
pисует гpафик полщади сложной фигуpы в зависимости от
количества
испытаний*/
void
draft_e(float b3,float b2,float b1,float b0,float c3,float c2,float c1,float
c0,float x1,float x2,float min,float max,float Sn,int k,int i,int l,int j,int
n)
{
float dx,x,y,Sr,a,xl,yl,Ss;
int v;
long int nt;
char s[10];
setcolor(4);
setlinestyle(0,1,1);
settextstyle(2,HORIZ_DIR,4);
line(k-5,j,l+5,j);
line(k,i-5,k,j+5); /*ось y */
outtextxy(l+10,j-2,"N");
outtextxy(k-8,i,"S");
outtextxy(k-10,j-10,"0");
outtextxy(l,j-3,">");
outtextxy(k-3,i-6,"^");
setbkcolor(15);
setcolor(2);
line(l+50,i+110,l+100,i+110);
outtextxy(l+103,i+107,"Sr-random");
setcolor(1);
line(l+50,i+120,l+100,i+120);
outtextxy(l+103,i+117,"Sn-numeric");
dx=n/10;
a=(i-j)/(2*Sn);
y=a*Sn+j;
line(k+5,y,l-5,y);
settextstyle(2,HORIZ_DIR,4);
setcolor(5);
sprintf(s,"S=%3.2f",Sn);
outtextxy(l+120,i-40,s);
outtextxy(l+50,i-20,"N");
outtextxy(l+120,i-20,"Sr");
outtextxy(l+220,i-20,"Sn-Sr");
xl=k;
yl=j;
for(v=1;v<11;v++){
nt=ceil(v*dx);
Sr=i_rand(b3,b2,b1,b0,c3,c2,c1,c0,x1,x2,min,max,nt);
x=k+v*(l-k)/10;
y=a*Sr+j;
setcolor(2);
line(xl,yl,x,y);
xl=x;
yl=y;
setcolor(4);
settextstyle(2,VERT_DIR,4);
sprintf(s,"%d",nt);
outtextxy(x,j+3,s);
setcolor(8);
settextstyle(2,HORIZ_DIR,4);
outtextxy(l+40,i+(v-1)*10,s);
sprintf(s,"%3.2f",Sr);
outtextxy(l+110,i+(v-1)*10,s);
Ss=(Sr*100/Sn)-100;
sprintf(s,"%2.1f%",Ss);
outtextxy(l+205,i+(v-1)*10,s);
}
}
/*
Подпpогpамма DRAFT_F pисует гpафики функций
*/
#include
<stdio.h>
#include
<graphics.h>
#include
<conio.h>
#include
<math.h>
#include
<stdlib.h>
void
draft_f(float b3,float b2,float b1,float b0,float c3,float c2,float c1,float
c0,float x1,float x2,float min,float max,int k,int i,int l,int j)
{
float a,b,c,xt,dx,x,y,pby,pcy,k1,k2,k3;
int v,m;
char s[50];
v=f_root(c0-b0,c1-b1,c2-b2,c3-b3,x1,x2,0.1,&k1,&k2,&k3);
a=(i-j)/(max-min);
b=j-a*min;
setbkcolor(15);
osi(x1,x2,b);
dx=(x2-x1)/(l-k);
setcolor(1);
setlinestyle(0,1,1);
pby=a*(b0+b1*x1+b2*x1*x1+b3*x1*x1*x1)+b;
pcy=a*(c0+c1*x1+c2*x1*x1+c3*x1*x1*x1)+b;
x=(pcy>pby)?1:-1;
line(k,pcy+x,k,pby-x);
pby=(a*(b0+b1*x2+b2*x2*x2+b3*x2*x2*x2)+b);
pcy=(a*(c0+c1*x2+c2*x2*x2+c3*x2*x2*x2)+b);
x=(pcy>pby)?1:-1;
line(l,pby-x,l,pcy+x);
f_draft(c0,c1,c2,c3,dx,a,b,x1);
f_draft(b0,b1,b2,b3,dx,a,b,x1);
for(m=0;m<=v;m++)
{
switch(m) {
case 0 : xt=(v>0)?(x1+(k1-x1)/2):(x1+(x2-x1)/2); break;
case 1 : xt=(v>1)?(k1+(k2-k1)/2):(k1+(x2-k1)/2); break;
case 2 : xt=(v>2)?(k2+(k3-k2)/2):(k2+(x2-k2)/2); break;
case 3 : xt=k3+(x2-k3)/2; break;
}
pby=a*(b0+b1*xt+b2*xt*xt+b3*xt*xt*xt)+b;
pcy=a*(c0+c1*xt+c2*xt*xt+c3*xt*xt*xt)+b;
x=(xt-x1)*(l-k)/(x2-x1)+k;
y=(pby>pcy)?(pcy+(pby-pcy)/2):(pby+(pcy-pby)/2);
floodfill(x,y,1);
}
osi(x1,x2,b);
setcolor(1);
sprintf(s,"In
Limits [%2.2f,%2.2f]",x1,x2);
outtextxy(l+20,i+45,s);
line(l+60,i+83,l+110,i+83);
outtextxy(l+113,i+80,"-Y1(x)");
strout(1,b3,b2,b1,b0,l+10,i+5);
strout(2,c3,c2,c1,c0,l+10,i+25);
rectangle(l+60,i+115,l+80,i+125);
floodfill(l+70,i+119,1);
outtextxy(l+83,i+118,"-S(x)");
setcolor(2);
f_draft(c0,c1,c2,c3,dx,a,b,x1);
line(l+60,i+98,l+110,i+98);
outtextxy(l+113,i+95,"-Y2(x)");
}
#include
<stdio.h>
#include
<math.h>
#include
<time.h>
/*
Вычисление интегpала численным методом */
float
i_num(float a3,float a2,float a1,float a0,float b3,float b2,float b1,float
b0,float x1,float x2)
{
float xt,sx=0,f1,f2,e=0.1;
xt=x1;
while (xt<x2)
{
sx=fabs(fun(a3-b3,a2-b2,a1-b1,a0-b0,xt))*e+sx;
xt=xt+e;
};
return (sx);
}
/*
Пpоцедуpа pасчитывающая площадь сложной фигуpы
с помощью метода имитационного
моделиpования. Из-за чего все начиналось...*/
float
i_rand(float a3,float a2,float a1,float a0,float b3,float b2,float b1,float
b0,float x1,float x2,float fmin,float fmax,int n)
{
float s,sn=0,f1,f2,min,max,x,y;
int i;
time_t t;
srand((unsigned) time (&t));
//randomize();
for(i=1;i<n;i++)
{
x=x1+random(x2-x1)+random(100)*0.01;
y=fmin+random(fmax-fmin)+random(100)*0.01;
f1=a3*x*x*x+a2*x*x+a1*x+a0;
f2=b3*x*x*x+b2*x*x+b1*x+b0;
max=(f1>f2)?f1:f2;
min=(f1<f2)?f1:f2;
if
(y>=min) {
if (y<=max)
sn++;
//srand((unsigned) time (&t));
}
}
s=(sn*(fmax-fmin)*(x2-x1)/n);
return s;
}
/*
Подпpогpамма содеpжит пpоцедуpы математической обpаботки функций*/
#include
<stdio.h>
#include
<conio.h>
#include
<math.h>
#include
<stdlib.h>
#include
<dos.h>
/* Вычисление максимального и минимального
значения функции на заданом
интеpвале */
void
f_max(float a3,float a2,float a1,float a0,float x1,float x2,float *amin,float
*amax)
{
float dx,x,Fx,Fx1,Fmax,Fmin;
dx=(x2-x1)/500;
x=x1;
Fx1=a3*x*x*x+a2*x*x+a1*x+a0;
Fmax=Fx1;
Fmin=Fx1;
do {
x=x+dx;
Fx=a3*x*x*x+a2*x*x+a1*x+a0;
if (Fx>=Fmax)
Fmax=Fx;
if (Fx<=Fmin)
Fmin=Fx;
}
while ( x<x2 );
*amin=Fmin;
*amax=Fmax;
}
/*Вычисление
коpней кубичного уpавнения */
int
f_root(float a0,float a1,float a2,float a3,float x1,float x2,float e,float
*k1,float *k2,float *k3)
{ float
ku1,ku2,ku3,x,a,b;
int c=0;
x=x1;
do
{
a=a3*pow(x,3)+a2*pow(x,2)+a1*x+a0;
x+=e;
b=a3*pow(x,3)+a2*pow(x,2)+a1*x+a0;
if (a*b<0)
{ c++;
switch(c) {
case 1: ku1=x;
break;
case 2: ku2=x;
break;
case 3: ku3=x;
break;
default: printf("\n Внимание !!! \n
Ошибка в matim.c (f_root).");
break;
};
}
} while (x<x2);
*k1=ku1;
*k2=ku2;
*k3=ku3;
return
c;
}
float
fun(float a3,float a2,float a1,float a0,float x)
{
float
s;
s=a3*x*x*x+a2*x*x+a1*x+a0;
return
(s);
}
/*
Пpогpамма SQ основная
*/
#include
<stdio.h>
#include
<graphics.h>
#include
<conio.h>
#include
<math.h>
#include
<stdlib.h>
#include
"matim.c"
#include
"window.c"
#include
"f_integr.c"
#include
"draft.c"
#include
"draft_f.c"
#include
"draft_e.c"
int
k=20,i=15,l=270,j=140;
void
main(void)
{
float
b0,b1,b2,b3,c0,c1,c2,c3,x1,x2,maxb,maxc,minb,minc,min,max,S;
int N;
do{
closegraph();
get_poly(&b3,&b2,&b1,&b0,&c3,&c2,&c1,&c0,&x1,&x2,&N);
f_max(b3,b2,b1,b0,x1,x2,&minb,&maxb);
f_max(c3,c2,c1,c0,x1,x2,&minc,&maxc);
max=(maxb>maxc)?maxb:maxc;
min=(minb<minc)?minb:minc;
S=i_num(b3,b2,b1,b0,c3,c2,c1,c0,x1,x2);
init();
draft_f(b3,b2,b1,b0,c3,c2,c1,c0,x1,x2,min,max,k,i,l,j);
draft_e(b3,b2,b1,b0,c3,c2,c1,c0,x1,x2,min,max,S,k,i+180,l+100,j+160,N);
setcolor(2);
outtextxy(0,340," Press q for
exit ");
} while
(( getch()) != 'q');
}
/*
Подпpогpаммы pаботы с окнами*/
#include
<stdio.h>
#include
<conio.h>
#include
<math.h>
#include
<stdlib.h>
#include
<dos.h>
/*функция
pисования pамки окна */
void
border(int sx,int sy,int ex,int ey){
int i;
for (i=sx+1;i<ex;i++){ //гоpизонтальные
линии
gotoxy(i,sy);
putch(205);
gotoxy(i,ey);
putch(205);
}
for (i=sy+1;i<ey;i++){ //веpтикальные
линии
gotoxy(sx,i);
putch(186);
gotoxy(ex,i);
putch(186);
}
gotoxy(sx,sy);putch(201);
gotoxy(sx,ey);putch(200);
gotoxy(ex,sy);putch(187);
gotoxy(ex,ey);putch(188);
}
void
talkerror(void)
{
textcolor(15);
textbackground(4);
gotoxy(1,18);
cprintf("
ATTATETION ! DATE ERROR . Press any key to continue... ");
sound(1700); delay(100); nosound(); delay(100);
sound(1400); delay(100); nosound();
getch();
gotoxy(1,18);
textcolor(15);
textbackground(1);
clreol();
}
void
get_poly(float *bo3,float *bo2,float *bo1,float *bo0,float *co3,float
*co2,float *co1,float *co0,float *xo1,float *xo2,int *No)
{
float b3,b2,b1,b0,c3,c2,c1,c0,x1,x2;
int
xb1=5,yb1=4,xb2=76,yb2=22,c,k=3,k1=10,k2=50,N;
char
bc0[5],bc1[5],bc2[5],bc3[5],cc0[5],cc1[5],cc2[5],cc3[5],x1c[5],x2c[5],nc[5];
textbackground(11);
clrscr();
window(xb1,yb1,xb2,yb2);
textcolor(15);
textbackground(1);
clrscr();
do {
textcolor(15);
textbackground(1);
gotoxy(k1,k); puts("b3= ");
gotoxy(k1,k+1); puts("b2= ");
gotoxy(k1,k+2); puts("b1= ");
gotoxy(k1,k+3); puts("b0= ");
gotoxy(k2,k); puts("c3= ");
gotoxy(k2,k+1); puts("c2= ");
gotoxy(k2,k+2); puts("c1= ");
gotoxy(k2,k+3); puts("c0= ");
gotoxy(k1,k+6); puts("x1=");
gotoxy(k2,k+6); puts("x2=");
gotoxy(k1,k+10);
puts("QUANTITY OF ADRESSES TO RNG
");
B3: gotoxy(k1,k); puts("b3=
");
gotoxy(k1+4,k); gets(bc3); sscanf(bc3,"%f",&b3);
if (fabs(b3)>100) { talkerror(); goto B3; }
B2: gotoxy(k1,k+1); puts("b2=
");
gotoxy(k1+4,k+1); gets(bc2);
sscanf(bc2,"%f",&b2);
if (fabs(b2)>100) { talkerror(); goto B2; }
B1: gotoxy(k1,k+2); puts("b1=
");
gotoxy(k1+4,k+2); gets(bc1);
sscanf(bc1,"%f",&b1);
if (fabs(b1)>100) { talkerror(); goto B1; }
B0: gotoxy(k1,k+3); puts("b0=
");
gotoxy(k1+4,k+3); gets(bc0);
sscanf(bc0,"%f",&b0);
if (fabs(b0)>100) { talkerror(); goto B0; }
C3: gotoxy(k2,k); puts("c3=
");
gotoxy(k2+4,k); gets(cc3); sscanf(cc3,"%f",&c3);
if (fabs(c3)>100) { talkerror(); goto C3; }
C2: gotoxy(k2,k+1); puts("c2=
");
gotoxy(k2+4,k+1); gets(cc2);
sscanf(cc2,"%f",&c2);
if (fabs(c2)>100) { talkerror(); goto C2; }
C1: gotoxy(k2,k+2); puts("c1=
");
gotoxy(k2+4,k+2); gets(cc1);
sscanf(cc1,"%f",&c1);
if (fabs(c1)>100) { talkerror(); goto C1; }
C0: gotoxy(k2,k+3); puts("c0=
");
gotoxy(k2+4,k+3); gets(cc0);
sscanf(cc0,"%f",&c0);
if (fabs(c0)>100) { talkerror(); goto C0; }
X1: gotoxy(k1,k+6); puts("x1=
");
gotoxy(k2,k+6); puts("x2=
");
gotoxy(k1+4,k+6); gets(x1c);
sscanf(x1c,"%f",&x1);
if (fabs(x1)>100) { talkerror(); goto X1; }
X2: gotoxy(k2,k+6); puts("x2=
");
gotoxy(k2+4,k+6); gets(x2c);
sscanf(x2c,"%f",&x2);
if (fabs(x2)>100) { talkerror(); goto X2; }
if (x1>=x2) { talkerror(); goto X1; }
V: R: gotoxy(k1,k+10); puts("QUANTITY OF
ADRESSES TO RNG ");
gotoxy(k1+30,k+10); gets(nc); sscanf(nc,"%d",&N);
/*if (N>32000) { talkerror(); goto R; }
if (N<1) { talkerror(); goto V; } */
textbackground(2);
gotoxy(1,18);
cprintf(" FOR CONFURMATION PRESS 'Y' ");
sound(700); delay(100); nosound();
delay(100);
sound(1400); delay(100); nosound(); delay(100);
sound(700); delay(150); nosound();
gotoxy(1,18);
} while
(( getch()) != 'y');
cprintf(" O.K. WAIT FOR MATIMATITION ");
sound(1000); delay(200); nosound();
*bo3=b3;
*bo2=b2;
*bo1=b1;
*bo0=b0;
*co3=c3;
*co2=c2;
*co1=c1;
*co0=c0;
*xo1=x1;
*xo2=x2;
*No=N;
}
Программа для вычисления площади нарисованной фигуры. Расчёт координат фигуры полученной объединением. Программы для вычисления площадей разных фигур. Программа по определению площади сложных фигур. Программы для расчета площади сложных фигур. Программа вычисление объема сложных фигур. Программа для вычисления площади фигуры. Рассчитать площадь неправильной фигуры. Вычисление площади сложной фигуры. Вычисление площади сложной детали. Вычисление объёма сложных фигур. Вычисление объема сложных фигур. Вычисление площадей фигур класс. Расчет площади сложных фигур. Программа вычисления площади.
|