yf:= F(aint);
setpenwidth(3);
setPencolor(clgreen);
line(round(x0+m*aint*del+del), 0, round(x0+m*aint*del+del), wh);
end;
procedure ploshad_poiska(xpoisk, ypoisk: real);
{
Процедура проводит для каждого x и y найденного на этапе поиска линию,
постепенно закрашивая площадь поиска на интервале.
}
begin
setPencolor(clpurple);
setpenwidth(1);
if (ypoisk > 0) then
line(round(x0+m*xpoisk*del+del), y0, round(x0+m*xpoisk*del+del), round(y0-m*ypoisk*del+del));
if (ypoisk < 0) then
line(round(x0+m*xpoisk*del+del), y0, round(x0+m*xpoisk*del+del), round(y0+m*abs(ypoisk)*del+del));
end;
procedure finish(xpoisk, ypoisk: real); // Выводит линию и подписывает значения найденного экстремума на графике
var s: string;
begin
setPencolor(clblack);
setpenwidth(2);
if (ypoisk > 0) then
line(round(x0+m*xpoisk*del+del), y0, round(x0+m*xpoisk*del+del), round(y0-m*ypoisk*del+del*- 20));
s:=('Fin('+ xpoisk +') = '+ ypoisk);
textOut(round(x0+m*xpoisk*del+del-40),round(y0-m*ypoisk*del+del*- 40),s);
if (ypoisk < 0) then
line(round(x0+m*xpoisk*del+del), y0, round(x0+m*xpoisk*del+del), round(y0+m*abs(ypoisk)*del+del));
end;
procedure osi; // Процедура для отрисовывания сетки и осей координат
var
i: integer;
s: string;
begin
setpencolor(rgb(100,100,100));
for i:= 1 to keox do // Отрисовка сетки по оси y
begin
line(x0+m*i, 0, x0+m*i, wh);
line(x0-m*i, 0, x0-m*i, wh);
end;
for i:= 1 to keoy do // Отрисовка сетки по оси x
begin
line(0, y0+m*i, ww, y0+m*i);
line(0, y0-m*i, ww, y0-m*i);
end;
setPencolor(rgb(0,0,0));
setpenwidth(3);
line(x0,0,x0,wh); // Отрисовка оси y
line(x0+3,15,x0,0);
line(x0-3,15,x0,0);
line(0,y0,ww,y0); // Отрисовка оси x
line(ww-15,y0+3,ww,y0);
line(ww-15,y0-3,ww,y0);
for i:=1 to keox do begin // Подписи на оси x
s:=floatToStr(i/del);
textOut(x0+m*i,y0+2,s);
textOut(x0-m*i,y0+2,'-'+ s);
end;
for i:=1 to keoy do begin // Подписи на оси y
s:=floatToStr(i/del);
textOut(x0-14,y0-m*i,s);
textOut(x0-14,y0+m*i,'-'+ s);
end;
end;
procedure grafic; // Процедура для отрисовки графика функции
var
x,y:real;
xscr,yscr:integer;
begin
x:= -keox;
while x<keox do begin
y:= F(x);
xscr:= round((x0+x*m*del+del));
yscr:= round((y0-y*m*del+del));
putpixel(xscr,yscr,clred);
x:= x + 0.002;
end;
end;
procedure poisk(a, b, e: real; n: integer); // процедура, которая ищет экстремум функции
var
max_dx, y, dx, rand, x_rand, xp, fend, xend: real;
i: integer;
begin
fend:= F(a);
for i:= 0 to n do
begin
max_dx:= (b-a)/10*e; // максимальный шаг, за который нельзя выходить
rand:= (b-a)/max_dx; // количество подсчетов.
dx:= random*(b-a)*rand; // Шаг, получаемый в данной итерации
xp:= a+max_dx*dx;
if (xp > a) and (xp < b) then // проверка на то, находится ли полученный x в зоне поиска
begin
y:= F(xp);
if (y<fend) then // Если прошлое значение функции меньше нового
begin
fend:= y; // Получаем новое значение для предполагаемого экстремума
xend:= xp;
end;
ploshad_poiska(xp, y);
end
end;
finish(xend, fend);
end;
begin
del:= 1; // коэффициент масштабирования
m:= 60; //Размер деления сетки
ww:= 1000; // Размер окна по вертикали
wh:= 800; // Размер окна по горизонтали
x0:= ww div 2; // Начальное положение для x и осей по x
y0:= wh div 2;
keox:= ww div m; // количество точек, в которых вычисляется значение функции
keoy:= wh div 2 div m;
setwindowsize(ww,wh);
osi;
grafic;
a:= -2; // Левая граница для поиска
b:= 0; // Правая граница для поиска
interval(a);
interval(b);
Randomize;
n:= round(random*(keox-1)*keox); // Вычисляем количество точек для поиска
poisk(a,b,0.0001, n);
setpencolor(clblack);
end.
АНАЛИЗ РЕЗУЛЬТАТОВ РАБОТЫ ДЛЯ РАЗНЫХ ВХОДНЫХ ДАННЫХ
Посмотрим на результат работы первого испытания
Таблица 1
|
Испытание №1 |
||
|
Входные данные |
||
|
a |
-2 |
|
|
b |
0 |
|
|
e |
0.0001 |
|
|
Выходные данные |
||
|
F(x) |
-1.17280639981136 |
Рисунок 2 Выходные данные первого испытания
Посмотрим на результат работы второго испытания.
Таблица 2
|
Испытание №2 |
||
|
Входные данные |
||
|
a |
-1 |
|
|
b |
3 |
|
|
e |
0.0001 |
|
|
Выходные данные |
||
|
F(x) |
-1.17149885442691 |
Рисунок 3 результат второго испытания
Посмотрим на результат работы третьего испытания.
Таблица 3
|
Испытание №3 |
||
|
Входные данные |
||
|
a |
-4 |
|
|
b |
4 |
|
|
e |
0.0001 |
|
|
Выходные данные |
||
|
F(x) |
-1.17280915963144 |
Рисунок 5 результат третьего испытания
Как мы видим, в каждом из трех испытаний алгоритм находит приблизительное значение экстремума функции на заданном интервале при случайно заданном количестве точек для проверки.
ВЫВОД
В данной курсовой работе рассмотрен и применен метод Монте-Карло. Он действительно позволяет получать локальную точку экстремума на заданном интервале с заданной точностью. На точность измерений так же влияет количество точек, проверяемых на экстремум, поэтому нельзя сказать, что данный метод следует использовать в высокоточных вычислениях.
Стоит заметить, что метод Монте-Карло является довольно простым для реализации методом, что делает его очень популярным для простых вычислений.
1. Акименко А.А., Методические указания к курсовой работе / Т.А. Акименко. издательство ТулГу, 2020. 20 с.