Курсовая работа: Определение экстремума методом случайного поиска

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

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 с.