Приемка программного продукта осуществляется при сдаче документально оформленных этапов разработки и проведении испытаний на основе установленных тестов. Тесты должны быть предоставлены поставщиком и согласованы с заказчиком.
Примером задачи оптимизации является минимизация функции U=f(x1,x2) от переменных x1,x2.
Метод наискорейшего спуска.
Из начальной точки x1 перпендикулярно линии уровня то есть в направлении градиента (антиградиента), двигаются до тех пор, пока функция возрастает (убывает), то есть решают одномерную задачу минимизации для функции F(a)=f(x0-a*gradf(x0)),
где a выступает в качестве параметра.
В результате находится значение x1=x0-a* gradf(x0) соответствующее максимальному (минимальному) значению функции на выбранной прямой. Затем вычислительный процесс повторяется для точки x1 и так далее. Критерием окончания является условие f’(xm)=|df/dxi|<=ε, i=1,…,m.
Назначение разработки
Программное изделие разрабатывается с целью реализации метода наискорейшего спуска.
Функциональные и эксплуатационные характеристики изделия
Функциональные возможности программного изделия
Рассмотренные альтернативы
В связи с тем, что требования заказчика к алгоритму решения задачи были предъявлены, альтернативы не рассматривались.
Требования к программе или программному изделию
Разработка программной документации и программного продукта производилась согласно ГОСТ 19.701-90, ГОСТ 2.304-88.
Модули программного комплекса совместимы между собой на уровне исходного языка, а также форматов используемых данных.
Программные ограничения, совместимость
Программное изделие написано на языке Delphi 5.0, и работает под управлением операционных систем MicrosoftWindows 95/98/Me, WindowsNT/2000/XP. Для использования исходных текстов, поставляемых с программным изделием, требуется система разработки программного обеспечения BorlandDelphi 5.0 или выше и минимальные аппаратные ограничения, накладываемые этой системой.
Требования к составу и параметрам технических средств (аппаратные ограничения)
Для работы с программным изделием требуется:
· процессор, аналогичный Intel 486, или выше;
· оперативная память объемом не менее 64 Мб;
· накопитель на жестком диске со свободным местом не менее 1 Гб;
· видеоадаптер SVGA с цветным дисплеем;
· клавиатура или манипулятор типа “мышь”.
Входные данные вводятся вручную пользователем с помощью клавиатуры.
Процессы обработки
Процессы обработки разделяются на 2 группы:
· решение задачи минимизации методом наискорейшего спуска;
· отображение полученного результата на экране;
Выходными данными программы являются:
· отображение на экране результата решения задачи минимизации методом наискорейшего спуска.
Результирующие компоненты изделия
В комплект поставки программного изделия входят следующие компоненты:
a) исходный текст программы на языке Delphi 5.0, включающий файлы:
· файл реализации модуля Unit1.– текстовый файл с кодом алгоритма решения задачи динамического программирования,
· файл опций проекта Project1.dpr –файл c установками опций проекта,
· исполняемый файл Project1.exe – автономный исполняемый файл (законченное приложение Windows).
b) программная документация на изделие (в том числе в цифровом виде в файле Курсовик.doc).
Программный продукт размещается в виде исполняемого файла на жестком диске компьютера пользователя или на гибких магнитных, оптических дисках.
Программное изделие использует следующие носители информации:
• используемый в процессе работы программы объем накопителя на жестком диске не превышает 1 Гб.
Безопасность и секретность
Информация, содержащаяся в программном изделии, не является секретной, поэтому ограничение доступа к ней не предусмотрено.
Поскольку требований к надежности предъявлено не было, то обеспечена минимальная надежность хранения данных.
В случаях возникновения аппаратного или программного сбоя работа программы возобновляется повторным запуском.
Интерфейс программы выполнен таким образом, что обеспечивает простоту и удобство эксплуатации программы.
Для успешного переноса программного изделия и обеспечения его работоспособности на компьютере достаточно скопировать исполняемый файл программы.
Рабочий проект состоит из исполняемого файла Project1.exe.
Модуль Unit1
Этот модуль содержит код, описывающий работу метода наискорейшего спуска.
Литература
1. А.Я. Архангельский Программирование в Delphi 5.0. – М.: ЗАО “Издательство БИНОМ”, 2000 г.
2. Боресков А.В., Шикин Е.В., Шикина Г.Е. Компьютерная графика: первое знакомство; Под ред. Е.В. Шикина. - М.: Финансы и статистика, 1996. - 176 с.: ил. - (Диалог с компьютером).
3. Краснов М.В. 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);