Метод наискорейшего спуска
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ
КУРСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
Кафедра ПО ВТ
Курсовая работа
по дисциплине «Методы и алгоритмы обработки изображений»
тема: Метод наискорейшего спуска
2004
1. Техническое задание
Быстрое развитие вычислительных средств, расширение их возможностей, а также (как следствие) постоянное снижение цен на них являются главным фактором всё более широкого их внедрения в различные сферы научной и практической деятельности.
Одним из видов практической деятельности, где используется компьютер, является решение задач оптимизации. Использование вычислительной техники для решения таких задач обусловлено так же и тем, что в ходе вычислений возникает повторяемость одних и тех же операций над различными данными и трудностью представления решения в графическом виде.
Общую постановку задачи оптимизации можно описать следующим образом:
Задачей многомерной оптимизации является минимизация функции U=f(x1,x2,..xm) от m переменных x1,x2,…xm. Если нет ограничений на параметры x1,x2,…xm, то говорят о глобальной минимизации, если ограничения есть, то говорят об условной минимизации. Вектор g(x) называется градиентом функции f(x) и обозначается g(x)=grad f(x)=(df/dx1)*e1+…+(df/dxm)*em.
Вектор g(x) указывает направление наискорейшего возрастания функции, а вектор –g(x) называется антиградиентом и указывает направление наискорейшего убывания функции.
Метод наискорейшего спуска.
Из начальной точки x0 перпендикулярно линии уровня то есть в направлении градиента (антиградиента), двигаются до тех пор, пока функция возрастает (убывает), то есть решают одномерную задачу минимизации для функции F(a)=f(x0-a*grad f(x0)), где a выступает в качестве параметра.
В результате находится значение x1=x0-a* grad f(x0) соответствующее максимальному (минимальному) значению функции на выбранной прямой. Затем вычислительный процесс повторяется для точки x1 и так далее. Критерием окончания является условие f’(xm)=|df/dxi|<=ε, i=1,…,m.
Данное программное изделие (далее по тексту именуемое «программа») носит название «Метод наискорейшего спуска» – это одна из задач оптимизации.
Основания для разработки
Разработка ведется на основании задания по курсовой работе.
Назначение разработки
Программное изделие разрабатывается с целью реализации задачи оптимизации методом наискорейшего спуска.
Функциональное и эксплуатационное назначение изделия
Перечень требований пользователя к программному изделию
Программное изделие должно реализовывать задачу оптимизации методом наискорейшего спуска.
Рассмотренные альтернативы
При постановке задачи на разработку данного программного изделия рассматривались следующие альтернативы:
1. Программная платформа. Язык Delphi доступен в операционных системах Windows 95/98/Me, Windows NT/2000/XP. Выбрана была система Windows 2000/NT в связи с высоким качеством программного кода, надёжностью и наличием расширенных возможностей разработки программного обеспечения под эту платформу.
2. Средства разработки. Любой компилятор для системы Windows 2000 мог быть использован для написания данного программного продукта. Из наиболее распространенных, таких как Microsoft Visual С++, WebGain VisualCafe, Borland C++, Borland C++ Builder, Borland Delphi, Power Builder, Borland JBuilder был выбран компилятор Borland Delphi. Выбор обоснован широким распространением, удобством использования, высоким качеством генерируемого кода данной среды.
Требования к программе или программному изделию
Стандарты
Разработка программной документации и программного продукта должна производится согласно ГОСТ 19.701-90, ГОСТ 2.304-88.
Информационная совместимость
Модули программного комплекса должны быть совместимы между собой на уровне исходного языка, а также форматов используемых данных.
Программные ограничения, совместимость
Программное изделие должно быть написано на языке Delphi 5.0, и работать под управлением операционных систем Microsoft Windows 98, Windows 2000.
Требования к составу и параметрам технических средств (аппаратные ограничения)
Для работы с программным изделием должно требоваться:
процессор, аналогичный Intel Celeron 900;
оперативная память объемом 64 Мб;
накопитель на жестком диске с объемом 1 Гб;
видеоадаптер SVGA с цветным дисплеем;
клавиатура и манипулятор типа “мышь”.
Входные данные
Входные данные должны вводится вручную пользователем с помощью клавиатуры.
Процессы обработки
Процессы обработки должны разделяться на следующие этапы:
решение задачи минимизации методом наискорейшего спуска;
Выходные данные
Выходными данными программы должно являться:
вывод на дисплей, полученного решения задачи минимизации методом наискорейшего спуска;
Результирующие компоненты изделия
В комплект поставки программного изделия должны входить следующие компоненты:
исходный текст программы на языке Borland Delphi 5.0;
исполняемый файл;
программная документация на изделие.
Носители информации
Программный продукт должен размещаться в виде исполняемого файла на жестком диске компьютера пользователя или на гибких магнитных, оптических дисках.
Программное изделие должно использовать следующие носители информации:
используемый в процессе работы программы объем оперативного запоминающего устройства 64 Мб,
используемый в процессе работы программы объем накопителя на жестком диске 1 Гб.
Безопасность и секретность
Информация, содержащаяся в программном изделии, не является секретной, поэтому ограничение доступа к ней не предусматривается.
Требования к надежности
Требований к надежности предъявлено не было.
Рестарт
В случаях возникновения аппаратного или программного сбоя работа программы должна возобновляться повторным запуском.
Удобство эксплуатации
Интерфейс программы должен быть выполнен таким образом, чтобы обеспечивать простоту и удобство эксплуатации программы.
Мобильность
Необходимо, чтобы для успешного переноса программного изделия и обеспечения его работоспособности на компьютере достаточно было бы скопировать исполняемый файл.
Требования к программной документации
Программная документация должна соответствовать ГОСТ 19.701-90, ГОСТ 2.304-88 и включать следующие документы:
техническое задание;
рабочий проект.
В приложении к документу "Рабочий проект" должен быть приведен листинг исходных текстов программного изделия.
Технико-экономические показатели
Программное изделие разрабатывается в качестве учебной программы, поэтому технико-экономические показатели не рассчитываются.
Стадии и этапы разработки
Выполнение разработки должно включать две стадии:
техническое задание;
рабочий проект.
На стадии "Техническое задание" проводится постановка задачи, разработка требований к программному изделию, изучение литературы по задаче и оформление документа "Техническое задание".
На стадии "Рабочий проект" проводится разработка схем алгоритмов для каждого из функциональных модулей, физическое проектирование программного изделия, тестирование (тесты предоставляются заказчиком) и отладка программных модулей. В заключение данного этапа оформляется документ "Рабочий проект".
Порядок контроля и приемки
Приемка программного продукта осуществляется при сдаче документально оформленных этапов разработки и проведении испытаний на основе установленных тестов. Тесты должны быть предоставлены поставщиком и согласованы с заказчиком.
2. Рабочий проект
Примером задачи оптимизации является минимизация функции U=f(x1,x2) от переменных x1,x2.
Метод наискорейшего спуска.
Из начальной точки x1 перпендикулярно линии уровня то есть в направлении градиента (антиградиента), двигаются до тех пор, пока функция возрастает (убывает), то есть решают одномерную задачу минимизации для функции F(a)=f(x0-a*grad f(x0)),
где a выступает в качестве параметра.
В результате находится значение x1=x0-a* grad f(x0) соответствующее максимальному (минимальному) значению функции на выбранной прямой. Затем вычислительный процесс повторяется для точки x1 и так далее. Критерием окончания является условие f’(xm)=|df/dxi|<=ε, i=1,…,m.
Общие сведения
Данное программное изделие носит название «Метод наискорейшего спуска» и предназначено для решения одного из видов задач оптимизации.
Назначение разработки
Программное изделие разрабатывается с целью реализации метода наискорейшего спуска.
Функциональные и эксплуатационные характеристики изделия
Функциональные возможности программного изделия
Программное изделие должно наглядно показывать результат решения задачи минимизации методом наискорейшего спуска.
Рассмотренные альтернативы
В связи с тем, что требования заказчика к алгоритму решения задачи были предъявлены, альтернативы не рассматривались.
Требования к программе или программному изделию
Стандарты
Разработка программной документации и программного продукта производилась согласно ГОСТ 19.701-90, ГОСТ 2.304-88.
Информационная совместимость
Модули программного комплекса совместимы между собой на уровне исходного языка, а также форматов используемых данных.
Программные ограничения, совместимость
Программное изделие написано на языке Delphi 5.0, и работает под управлением операционных систем Microsoft Windows 95/98/Me, Windows NT/2000/XP. Для использования исходных текстов, поставляемых с программным изделием, требуется система разработки программного обеспечения Borland Delphi 5.0 или выше и минимальные аппаратные ограничения, накладываемые этой системой.
Требования к составу и параметрам технических средств (аппаратные ограничения)
Для работы с программным изделием требуется:
процессор, аналогичный Intel 486, или выше;
оперативная память объемом не менее 64 Мб;
накопитель на жестком диске со свободным местом не менее 1 Гб;
видеоадаптер SVGA с цветным дисплеем;
клавиатура или манипулятор типа “мышь”.
Входные данные
Входные данные вводятся вручную пользователем с помощью клавиатуры.
Процессы обработки
Процессы обработки разделяются на 2 группы:
решение задачи минимизации методом наискорейшего спуска;
отображение полученного результата на экране;
Выходные данные
Выходными данными программы являются:
отображение на экране результата решения задачи минимизации методом наискорейшего спуска.
Результирующие компоненты изделия
В комплект поставки программного изделия входят следующие компоненты:
исходный текст программы на языке Delphi 5.0, включающий файлы:
файл реализации модуля Unit1.– текстовый файл с кодом алгоритма решения задачи динамического программирования,
файл опций проекта Project1.dpr –файл c установками опций проекта,
исполняемый файл Project1.exe – автономный исполняемый файл (законченное приложение Windows).
программная документация на изделие (в том числе в цифровом виде в файле Курсовик.doc).
Носители информации
Программный продукт размещается в виде исполняемого файла на жестком диске компьютера пользователя или на гибких магнитных, оптических дисках.
Программное изделие использует следующие носители информации:
• используемый в процессе работы программы объем оперативного запоминающего устройства не превышает 64 Мб,
• используемый в процессе работы программы объем накопителя на жестком диске не превышает 1 Гб.
Безопасность и секретность
Информация, содержащаяся в программном изделии, не является секретной, поэтому ограничение доступа к ней не предусмотрено.
Требования к надежности
Поскольку требований к надежности предъявлено не было, то обеспечена минимальная надежность хранения данных.
Рестарт
В случаях возникновения аппаратного или программного сбоя работа программы возобновляется повторным запуском.
Удобство эксплуатации
Интерфейс программы выполнен таким образом, что обеспечивает простоту и удобство эксплуатации программы.
Мобильность
Для успешного переноса программного изделия и обеспечения его работоспособности на компьютере достаточно скопировать исполняемый файл программы.
Состав проекта
Рабочий проект состоит из исполняемого файла Project1.exe.
Описание модуля
Модуль Unit1
Этот модуль содержит код, описывающий работу метода наискорейшего спуска.
Литература
А.Я. Архангельский Программирование в Delphi 5.0. – М.: ЗАО “Издательство БИНОМ”, 2000 г.
Боресков А.В., Шикин Е.В., Шикина Г.Е. Компьютерная графика: первое знакомство; Под ред. Е.В. Шикина. - М.: Финансы и статистика, 1996. - 176 с.: ил. - (Диалог с компьютером).
Краснов М.В. OpenGL графика в проектах Delphi, БХВ-Санкт-Петербург, 2000. – 352 с.
Приложение А
Листинг программы
Файл Unit1.pas
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls,OpenGL, Grids, ComCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
Panel1: TPanel;
Label2: TLabel;
StringGrid1: TStringGrid;
RadioButton1: TRadioButton;
Button2: TButton;
Label3: TLabel;
Label4: TLabel;
Edit1: TEdit;
Edit2: TEdit;
Label5: TLabel;
Label6: TLabel;
Edit3: TEdit;
Label7: TLabel;
UpDown1: TUpDown;
Edit4: TEdit;
ComboBox1: TComboBox;
Edit5: TEdit;
Label8: TLabel;
Edit6: TEdit;
Label9: TLabel;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormResize(Sender: TObject);
procedure FormPaint(Sender: TObject);
procedure Panel1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Panel1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Panel1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure Button2Click(Sender: TObject);
procedure Edit3Change(Sender: TObject);
procedure Edit1Change(Sender: TObject);
procedure Edit2Change(Sender: TObject);
procedure Edit4Change(Sender: TObject);
procedure Edit5Change(Sender: TObject);
procedure Edit6Change(Sender: TObject);
private
DC : HDC;
hrc: HGLRC;
{ Private declarations }
end;
type TE = array [0..2,0..2] of glfloat;
type TM = array [0..2] of glfloat;
var
Form1: TForm1;
x,y,z,m,a,b,c,d,masht : glfloat;
mx,my,mz: TE;
mm : TM;
xmaus,ymaus,rt,verx: integer;
implementation
{$R *.DFM}
{Формат пикселя}
procedure SetDCPixelFormat (hdc : HDC);
var
pfd : TPixelFormatDescriptor;
nPixelFormat : Integer;
begin
FillChar (pfd, SizeOf (pfd), 0);
pfd.dwFlags := PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER;
nPixelFormat := ChoosePixelFormat (hdc, @pfd);
SetPixelFormat (hdc, nPixelFormat, @pfd);
end;
{====================================================
Создание формы}
procedure TForm1.FormCreate(Sender: TObject);
begin
DC := GetDC (Form1.Panel1.Handle);
SetDCPixelFormat(DC);
hrc := wglCreateContext(DC);
wglMakeCurrent(DC, hrc);
glClearColor (0.5, 0.5, 0.75, 1.0); // цвет фона
glColor3f (1.0, 0.0, 0.5); // текущий цвет примитивов
glEnable(GL_DEPTH_TEST);
x:=0.0;
y:=0.0;
z:=0.0;
m:=1.0;
a:=0.0;
b:=0.0;
c:=0.0;
xmaus:= 0;
ymaus:=0 ;
masht:=0;
rt:= 0 ;
verx:= 0;
StringGrid1.Cells[0,0]:='1';
tringGrid1.Cells[0,1]:='0';
tringGrid1.Cells[0,2]:='0';
tringGrid1.Cells[0,3]:='0';
end;
procedure TForm1.Button1Click(Sender: TObject);
var
hx,hy,x0,y0,f0,gx,gy,e,f1: real;
i : integer;
begin
StringGrid1.ColCount:=1;
hx:=0.001;
hy:=0.002;
e:=0.002;
x0:=StrToInt(Edit1.Text);
y0:=StrToInt(Edit2.Text);
if(ComboBox1.ItemIndex=0) then begin
f0:=(exp(x0)+exp(y0))/(exp(x0*x0)+exp(y0*y0));
gx:=exp(x0)/(exp(x0*x0)+exp(y0*y0))-exp(x0*x0)*x0*(2*(exp(x0)+exp(y0))/((exp(x0*x0)+exp(y0*y0))*(exp(x0*x0)+exp(y0*y0))));
gy:=exp(y0)/(exp(y0*y0)+exp(x0*x0))-exp(y0*y0)*y0*(2*(exp(y0)+exp(x0))/((exp(y0*y0)+exp(x0*x0))*(exp(y0*y0)+exp(x0*x0))));
end;
if(ComboBox1.ItemIndex=1) then begin
f0:=sin(x0)*sin(x0)/(sin(y0)*sin(y0)+1);
gx:=2*sin(x0)*cos(x0)/(sin(y0)*sin(y0)+1);
gy:=-2*sin(x0)*sin(x0)*cos(y0)*sin(y0)/((sin(y0)*sin(y0)+1)*(sin(y0)*sin(y0)+1));
end;
if(ComboBox1.ItemIndex=2) then begin
f0:=sin(x0)*cos(y0*y0);
gx:= cos(x0)*cos(y0*y0);
gy:=-2*sin(x0)*sin(y0*y0)*y0;
end;
x0:=x0+hx*gx;
y0:=y0+hy*gy;
if(ComboBox1.ItemIndex=0) then
f1:=(exp(x0)+exp(y0))/(exp(x0*x0)+exp(y0*y0));
if(ComboBox1.ItemIndex=1) then
f1:=sin(x0)*sin(x0)/(sin(y0)*sin(y0)+1);
if(ComboBox1.ItemIndex=2) then
f1:=sin(x0)*cos(y0*y0);
StringGrid1.Cells[0,0]:='1';
StringGrid1.Cells[0,1]:=FloatToStr(x0);
StringGrid1.Cells[0,2]:=FloatToStr(y0);
StringGrid1.Cells[0,3]:=FloatToStr(f1);
if f1<f0 then begin
hx:=hx/2;
hy:=hy/2;
end;
i:=1;
while not((abs(gx)<e) and (abs(gy)<e))do
begin
f0:=f1;
if(ComboBox1.ItemIndex=0) then begin
gx:=exp(x0)/(exp(x0*x0)+exp(y0*y0))-exp(x0*x0)*x0*(2*(exp(x0)+exp(y0))/((exp(x0*x0)+exp(y0*y0))*(exp(x0*x0)+exp(y0*y0))));
gy:=exp(y0)/(exp(y0*y0)+exp(x0*x0))-exp(y0*y0)*y0*(2*(exp(y0)+exp(x0))/((exp(y0*y0)+exp(x0*x0))*(exp(y0*y0)+exp(x0*x0))));
end;
if(ComboBox1.ItemIndex=1) then begin
gx:=2*sin(x0)*cos(x0)/(sin(y0)*sin(y0)+1);
gy:=-2*sin(x0)*sin(x0)*cos(y0)*sin(y0)/((sin(y0)*sin(y0)+1)*(sin(y0)*sin(y0)+1));
end;
if(ComboBox1.ItemIndex=2) then begin
gx:= cos(x0)*cos(y0*y0);
gy:=-2*sin(x0)*sin(y0*y0)*y0;
end;
x0:=x0+hx*gx;
y0:=y0+hy*gy;
if(ComboBox1.ItemIndex=0) then
f1:=(exp(x0)+exp(y0))/(exp(x0*x0)+exp(y0*y0));
if(ComboBox1.ItemIndex=1) then
f1:=sin(x0)*sin(x0)/(sin(y0)*sin(y0)+1);
if(ComboBox1.ItemIndex=2) then
f1:=sin(x0)*cos(y0*y0);
StringGrid1.Cells[i,0]:=IntToStr(i+1);
StringGrid1.Cells[i,1]:=FloatToStr(x0);
StringGrid1.Cells[i,2]:=FloatToStr(y0);
StringGrid1.Cells[i,3]:=FloatToStr(f1);
i:=i+1;
StringGrid1.ColCount:=i;
if f1<f0 then begin
hx:=hx/2;
hy:=hy/2;
end;
end;
Label1.Caption:=FloatToStr(f1);
refresh;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
{====================================================
Конец работы приложения}
wglMakeCurrent(0, 0);
wglDeleteContext(hrc);
ReleaseDC (Panel1.Handle, DC);
DeleteDC (DC);
end;
procedure TForm1.FormResize(Sender: TObject);
begin
glViewport(0, 0, Panel1.ClientWidth, Panel1.ClientHeight);
glLoadIdentity;
glFrustum (-1, 1, -1, 1, 3, 10); // задаем перспективу
// этот фрагмент нужен для придания трёхмерности
glTranslatef(0.0, 0.0, -5); // перенос объекта - ось Z
InvalidateRect(Panel1.Handle, nil, False);
end;
procedure TForm1.FormPaint(Sender: TObject);
var
i,j: real;
zz,xl,yl,zl,zlm,stg,h: glfloat;
fy,fx,clr,clb,obl : real;
it,wn : integer;
mm1,mm2,mm3,mm4 : array [0..5] of TM;
begin
glClear (GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); // очистка буфера цвета
xl:=0;
yl:=0;
zl:=0;
zlm:=StrToFloat(StringGrid1.cells[0,3]);
stg:=StringGrid1.ColCount;
clr:=0;
clb:=1.0;
h:=StrToFloat(Edit3.text);
wn:=StrToInt(Edit5.text);
obl:= StrToFloat(Edit6.Text);
//ox oy oz
glscalef(masht,masht,masht);
glLineWidth(3);
glcolor3f(1.0,1.0,1.0);
glBegin(GL_Lines);
glVertex3f(-1,-1,1);
glVertex3f(1,-1,1);
glVertex3f(-1,-1,1);
glVertex3f(-1,1,1);
glVertex3f(-1,-1,1);
glVertex3f(-1,-1,-1);
glend;
glLineWidth(1);
glcolor3f(1.0,1.0,0.0);
glBegin(GL_Lines);
//x
glVertex3f(1.1-0.03,-1+0.1,1);
glVertex3f(1.1+0.03,-1-0.1,1);
glVertex3f(1.1+0.03,-1+0.1,1);
glVertex3f(1.1-0.03,-1-0.1,1);
//z
glVertex3f(-1-0.03,1.1,1);
glVertex3f(-1+0.03,1.1,1);
glVertex3f(-1-0.03,1.1,1);
glVertex3f(-1+0.03,1.2,1);
glVertex3f(-1-0.03,1.2,1);
glVertex3f(-1+0.03,1.2,1);
//y
glVertex3f(-1,-1,-1-0.1);
glVertex3f(-1,-1+0.1,-1-0.1);
glVertex3f(-1,-1+0.1,-1-0.1);
glVertex3f(-1-0.03,-1+0.2,-1-0.1);
glVertex3f(-1,-1+0.1,-1-0.1);
glVertex3f(-1+0.03,-1+0.2,-1-0.1);
glend;
// if(ComboBox1.ItemIndex=1) then begin
/f1:=sin(x0)*sin(x0)/(sin(y0)*sin(y0)+1);
/f1:=sin(x0)/(x0+y0*y0+1);
i:=-wn;
j:=-wn;
while j<=wn do begin
i:=-wn;
yl:=j;
//glBegin(GL_points);
glBegin(GL_Lines);
glcolor3f(clr,0.0,clb);
while i<=wn do begin
xl:=i; //f(x) ==
if(ComboBox1.ItemIndex=0) then
zl:=(exp(xl)+exp(yl))/(exp(xl*xl)+exp(yl*yl));
if(ComboBox1.ItemIndex=1) then
zl:=sin(xl)*sin(xl)/(sin(yl)*sin(yl)+1);
if(ComboBox1.ItemIndex=2) then
zl:=sin(xl)*cos(yl*yl);
if zl>=zlm then begin
zlm:=zl;
clr:=clr+0.01;
clb:=clb-0.01;
glcolor3f(clr,0.0,clb);
end;
glVertex3f(xl*obl,zl*obl,yl*obl); //+++
i:=i+0.1;
xl:=i;
if(ComboBox1.ItemIndex=0) then
zl:=(exp(xl)+exp(yl))/(exp(xl*xl)+exp(yl*yl));
if(ComboBox1.ItemIndex=1) then
zl:=sin(xl)*sin(xl)/(sin(yl)*sin(yl)+1);
if(ComboBox1.ItemIndex=2) then
zl:=sin(xl)*cos(yl*yl);
glVertex3f(xl*obl,zl*obl,yl*obl); //++++
end;
j:=j+h;
end;
glend;
//----------------------
i:=-wn;
j:=-wn;
clr:=0;
clb:=1.0;
zlm:=StrToFloat(StringGrid1.cells[0,3]);
while j<=wn do begin
i:=-wn;
xl:=j;
glBegin(GL_Lines);
glcolor3f(clr,0.0,clb);
while i<=wn do begin
yl:=i; //f(x) ||
if(ComboBox1.ItemIndex=0) then
zl:=(exp(xl)+exp(yl))/(exp(xl*xl)+exp(yl*yl));
if(ComboBox1.ItemIndex=1) then
zl:=sin(xl)*sin(xl)/(sin(yl)*sin(yl)+1);
if(ComboBox1.ItemIndex=2) then
zl:=sin(xl)*cos(yl*yl);
if zl>=zlm then begin
zlm:=zl;
clr:=clr+0.01;
clb:=clb-0.01;
glcolor3f(clr,0.0,clb);
end;
glVertex3f(xl*obl,zl*obl,yl*obl); //+++
i:=i+0.1;
yl:=i;
if(ComboBox1.ItemIndex=0) then
zl:=(exp(xl)+exp(yl))/(exp(xl*xl)+exp(yl*yl));
if(ComboBox1.ItemIndex=1) then
zl:=sin(xl)*sin(xl)/(sin(yl)*sin(yl)+1);
if(ComboBox1.ItemIndex=2) then
zl:=sin(xl)*cos(yl*yl);
glVertex3f(xl*obl,zl*obl,yl*obl); //+++
end;
j:=j+h;
end;
glend;
//------
it:=0;
glLineWidth(2);
glBegin(GL_Line_strip);
glcolor3f(0.0,1.0,0.0);
while it<StringGrid1.ColCount do begin
xl:=StrToFloat(StringGrid1.cells[it,1]); //+
yl:=StrToFloat(StringGrid1.cells[it,2]); //+
zl:=StrToFloat(StringGrid1.cells[it,3]); //+
glVertex3f(xl*obl,zl*obl,yl*obl);
it:=it+1;
end;
glend;
glLineWidth(1);
//tmax
glPointSize(6);
glBegin(GL_points);
glcolor3f(1.0,0.0,0.0);
glVertex3f(xl*obl,zl*obl,yl*obl);
glcolor3f(0.0,0.0,1.0);
glVertex3f(StrToFloat(StringGrid1.cells[0,1])*obl,StrToFloat(StringGrid1.cells[0,3])*obl,StrToFloat(StringGrid1.cells[0,2])*obl);
glend;
glscalef(1.0/masht,1.0/masht,1.0/masht);
glRotatef(verx,1,0,0);
glRotatef(rt,0,1,0);
SwapBuffers(DC);
Label2.Caption:=FloatToStr(zlm);
end;
procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if(Button=mbleft) then begin
radiobutton1.Checked:=true;
end;
end;
procedure TForm1.Panel1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
radiobutton1.Checked:=false;
end;
procedure TForm1.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
rt:=0;
verx:=0;
if radiobutton1.Checked=true then begin
rt:=x- xmaus;
verx:=y-ymaus;
refresh;
end;
xmaus:=x;
ymaus:=y;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
hx,hy,h,x0,y0,f0,gx,gy,g1x,g1y,e,f1: real;
i : integer;
begin
StringGrid1.ColCount:=1;
h :=0.001;
hx:=0.001;
hy:=0.001;
e:=0.002;
x0:=StrToInt(Edit1.Text);
y0:=StrToInt(Edit2.Text);
if(ComboBox1.ItemIndex=0) then begin
f0:=(exp(x0)+exp(y0))/(exp(x0*x0)+exp(y0*y0));
gx:=exp(x0)/(exp(x0*x0)+exp(y0*y0))-exp(x0*x0)*x0*(2*(exp(x0)+exp(y0))/((exp(x0*x0)+exp(y0*y0))*(exp(x0*x0)+exp(y0*y0))));
gy:=exp(y0)/(exp(y0*y0)+exp(x0*x0))-exp(y0*y0)*y0*(2*(exp(y0)+exp(x0))/((exp(y0*y0)+exp(x0*x0))*(exp(y0*y0)+exp(x0*x0))));
end;
if(ComboBox1.ItemIndex=1) then begin
f0:=sin(x0)*sin(x0)/(sin(y0)*sin(y0)+1);
gx:=2*sin(x0)*cos(x0)/(sin(y0)*sin(y0)+1);
gy:=-2*sin(x0)*sin(x0)*cos(y0)*sin(y0)/((sin(y0)*sin(y0)+1)*(sin(y0)*sin(y0)+1));
end;
if(ComboBox1.ItemIndex=2) then begin
f0:=sin(x0)*cos(y0*y0);
gx:= cos(x0)*cos(y0*y0);
gy:=-2*sin(x0)*sin(y0*y0)*y0;
end;
g1x:=gx;
g1y:=gy;
x0:=x0+hx*gx;
y0:=y0+hy*gy;
if(ComboBox1.ItemIndex=0) then
f1:=(exp(x0)+exp(y0))/(exp(x0*x0)+exp(y0*y0));
if(ComboBox1.ItemIndex=1) then
f1:=sin(x0)*sin(x0)/(sin(y0)*sin(y0)+1);
if(ComboBox1.ItemIndex=2) then
f1:=sin(x0)*cos(y0*y0);
StringGrid1.Cells[0,0]:='1';
StringGrid1.Cells[0,1]:=FloatToStr(x0);
StringGrid1.Cells[0,2]:=FloatToStr(y0);
StringGrid1.Cells[0,3]:=FloatToStr(f1);
if f1<f0 then begin
hx:=h;
hy:=h;
end
else begin
hx:=hx*2;
hy:=hy*2;
end;
i:=1;
while not((abs(g1x)<e) and (abs(g1y)<e))do
begin
f0:=f1;
x0:=x0+hx*gx;
y0:=y0+hy*gy;
if(ComboBox1.ItemIndex=0) then begin
g1x:=exp(x0)/(exp(x0*x0)+exp(y0*y0))-exp(x0*x0)*x0*(2*(exp(x0)+exp(y0))/((exp(x0*x0)+exp(y0*y0))*(exp(x0*x0)+exp(y0*y0))));
g1y:=exp(y0)/(exp(y0*y0)+exp(x0*x0))-exp(y0*y0)*y0*(2*(exp(y0)+exp(x0))/((exp(y0*y0)+exp(x0*x0))*(exp(y0*y0)+exp(x0*x0))));
f1:=(exp(x0)+exp(y0))/(exp(x0*x0)+exp(y0*y0));
end;
if(ComboBox1.ItemIndex=1) then begin
g1x:=2*sin(x0)*cos(x0)/(sin(y0)*sin(y0)+1);
g1y:=-2*sin(x0)*sin(x0)*cos(y0)*sin(y0)/((sin(y0)*sin(y0)+1)*(sin(y0)*sin(y0)+1));
f1:=sin(x0)*sin(x0)/(sin(y0)*sin(y0)+1);
end;
if(ComboBox1.ItemIndex=2) then begin
f1:=sin(x0)*cos(y0*y0);
g1x:= cos(x0)*cos(y0*y0);
g1y:=-2*sin(x0)*sin(y0*y0)*y0;
end;
StringGrid1.Cells[i,0]:=IntToStr(i+1);
StringGrid1.Cells[i,1]:=FloatToStr(x0);
StringGrid1.Cells[i,2]:=FloatToStr(y0);
StringGrid1.Cells[i,3]:=FloatToStr(f1);
i:=i+1;
StringGrid1.ColCount:=i;
if f1<f0 then begin
if(ComboBox1.ItemIndex=0) then begin
gx:=exp(x0)/(exp(x0*x0)+exp(y0*y0))-exp(x0*x0)*x0*(2*(exp(x0)+exp(y0))/((exp(x0*x0)+exp(y0*y0))*(exp(x0*x0)+exp(y0*y0))));
gy:=exp(y0)/(exp(y0*y0)+exp(x0*x0))-exp(y0*y0)*y0*(2*(exp(y0)+exp(x0))/((exp(y0*y0)+exp(x0*x0))*(exp(y0*y0)+exp(x0*x0))));
end;
if(ComboBox1.ItemIndex=1) then begin
gx:=2*sin(x0)*cos(x0)/(sin(y0)*sin(y0)+1);
gy:=-2*sin(x0)*sin(x0)*cos(y0)*sin(y0)/((sin(y0)*sin(y0)+1)*(sin(y0)*sin(y0)+1));
end;
if(ComboBox1.ItemIndex=2) then begin
gx:= cos(x0)*cos(y0*y0);
gy:=-2*sin(x0)*sin(y0*y0)*y0;
end;
hx:=h;
hy:=h;
end
else begin
hx:=hx*2;
hy:=hy*2;
end;
end;
Label1.Caption:=FloatToStr(f1);
refresh;
end;
procedure TForm1.Edit3Change(Sender: TObject);
var
c : real;
begin
try
c:=StrToFloat(Edit3.text);
except
Edit3.text:='0,05';
end;
end;
procedure TForm1.Edit1Change(Sender: TObject);
var
c : integer;
begin
try
c:=StrToInt(Edit1.text);
except
Edit1.text:='-1';
end;
end;
procedure TForm1.Edit2Change(Sender: TObject);
var
c : integer;
begin
try
c:=StrToInt(Edit2.text);
except
Edit2.text:='-1';
end;
end;
procedure TForm1.Edit4Change(Sender: TObject);
begin
masht:=StrToFloat(Edit4.text)/10;
refresh;
end;
procedure TForm1.Edit5Change(Sender: TObject);
var
c : integer;
begin
try
c:=StrToInt(Edit5.text);
except
Edit5.text:='1';
end;
end;
procedure TForm1.Edit6Change(Sender: TObject);
var
c : real;
begin
try
c:=StrToFloat(Edit6.text);
except
Edit6.text:='1,0';
end;
end;
end.
Приложение Б
Тест 1:
Найдём максимум функции f(x,y)=(exp(x)+exp(y))/(exp(x^2)+exp(y^2))
Простой градиентный метод
программный изделие технический средство
Метод наискорейшего спуска
Тест 2:
Найдём максимум функции f(x,y)=sin(x0)*sin(x0)/(sin(y0)*sin(y0)+1)
Простой градиентный метод
Метод наискорейшего спуска
Тест 3:
Найдём максимум функции f(x,y)= sin(x0)*cos(y0*y0)
Простой градиентный метод
Метод наискорейшего спуска
При изменении начальных точек, может меняться и положение максимума