Автор работы: Пользователь скрыл имя, 21 Марта 2015 в 09:57, курсовая работа
Задачей оптимизации в математике называется задача о нахождении экстремума (минимума или максимума) вещественной функции в области. При нахождении экстремума вещественной функции в n-мерном пространстве применение графических методов невозможно (в силу невозможности графической интерпретации n-мерного пространства), а аналитические методы, как правило, требуют помимо исследуемой функции указания дополнительных сведений. Поэтому в n-мерном пространстве решение задачи происходит численными методами
1. Теоретическая основа метода оптимизации
1.1 Постановка задачи ..........................................................................................3
1.2 Математические основы метода ……………………………....…………...3
1.3 Разработка алгоритма численной реализации ………………………….....4
2. Программная реализация системы на ЭВМ
2.1 Описание структуры программы и её компонентов ………………………5
2.2 Результаты отладки программы на контрольных примерах………………6
2.3 Составление инструкции по использованию программы………………....7
3. Исследование эффективности работы метода оптимизации на тестовых задачах
3.1 Выбор и описание тестовых задач………………………………………….11
3.2 Исследование влияния параметров задачи на количество расчетов целевой функции……………............…………………………………………...12
3.3 Исследование работоспособности метода путем решения задач различной размерности и сложности……………………………………………………….13
3.4 Обработка результатов исследований средствами Excel………………....15
Заключение……………………………………………………………………… 19
Список литературы…………………….……………
Приложение 1
Var //описание глобальных переменных
x1,x2:double;
iteration:integer;
F:double;
function RB1ExplSearch(x1,x2:double;
var
xopt:double;
f1,f2,f3:double;
a0,a1,a2:double;
tx1,tx2,tx3:double;
begin
if check=1 then //для расчета первого х
begin
tx1:=x1;
tx2:=tx1+1;
tx3:=tx2+1;
f1:=sqr(tx1+x2)+sqr(x2-1);
f2:=sqr(tx2+x2)+sqr(x2-1);
f3:=sqr(tx3+x2)+sqr(x2-1);
a0:=f1;
a1:=(f2-f1)/(tx2-tx1);
a2:=1/(tx3-tx2)*((f3-f1)/(tx3-
xopt:=(tx2+tx1)/2-a1/2/a2;
end
else
if check=2 then //для расчета второго х
begin
tx1:=x2;
tx2:=tx1+1;
tx3:=tx2+1;
f1:=sqr(tx1+x1)+sqr(tx1-1);
f2:=sqr(tx2+x1)+sqr(tx2-1);
f3:=sqr(tx3+x1)+sqr(tx3-1);
a0:=f1;
a1:=(f2-f1)/(tx2-tx1);
a2:=1/(tx3-tx2)*((f3-f1)/(tx3-
xopt:=(tx2+tx1)/2-a1/2/a2;
end;
result:=xopt;
end;
function RB2ExplSearch(x1,x2:double;
var
xopt:double;
f1,f2,f3:double;
a0,a1,a2:double;
tx1,tx2,tx3:double;
begin
if check=1 then //для расчета первого х
begin
tx1:=x1;
tx2:=tx1+1;
tx3:=tx2+1;
f1:=sqr(tx1-2*x2)+sqr(x2+3);
f2:=sqr(tx2-2*x2)+sqr(x2+3);
f3:=sqr(tx3-2*x2)+sqr(x2+3);
a0:=f1;
a1:=(f2-f1)/(tx2-tx1);
a2:=1/(tx3-tx2)*((f3-f1)/(tx3-
xopt:=(tx2-tx1)/2-a1/2/a2;
end
else
if check=2 then //для расчета второго х
begin
tx1:=x2;
tx2:=tx1+1;
tx3:=tx2+1;
f1:=sqr(tx1-x1)+sqr(tx1+3);
f2:=sqr(tx2-x1)+sqr(tx2+3);
f3:=sqr(tx3-x1)+sqr(tx3+3);
a0:=f1;
a1:=(f2-f1)/(tx2-tx1);
a2:=1/(tx3-tx2)*((f3-f1)/(tx3-
xopt:=(tx2+tx1)/2-a1/2/a2;
end;
result:=xopt;
end;
function RB3ExplSearch(x1,x2:double;
var
xopt:double;
f1,f2,f3:double;
a0,a1,a2:double;
tx1,tx2,tx3:double;
begin
if check=1 then //для расчета первого х
begin
tx1:=x1;
tx2:=tx1+1;
tx3:=tx2+1;
f1:=sqr(tx1+x2)+sqr(x2+4);
f2:=sqr(tx2+x2)+sqr(x2+4);
f3:=sqr(tx3+x2)+sqr(x2+4);
a0:=f1;
a1:=(f2-f1)/(tx2-tx1);
a2:=1/(tx3-tx2)*((f3-f1)/(tx3-
xopt:=(tx2+tx1)/2-a1/2/a2;
end
else
if check=2 then //для расчета второго х
begin
tx1:=x2;
tx2:=tx1+1;
tx3:=tx2+1;
f1:=sqr(tx1+x1)+sqr(tx1+4);
f2:=sqr(tx2+x1)+sqr(tx2+4);
f3:=sqr(tx3+x1)+sqr(tx3+4);
a0:=f1;
a1:=(f2-f1)/(tx2-tx1);
a2:=1/(tx3-tx2)*((f3-f1)/(tx3-
xopt:=(tx2+tx1)/2-a1/2/a2;
end;
result:=xopt;
end;
procedure TForm1.btn1Click(Sender: TObject);
var
x1opt,x2opt:double;
sx1,sx2:double;
h1,h2:double;
dF:double;
tx1,tx2:double;
error:single; //погрешность
test:double;
n:integer;
i:integer;
fx:Double;
begin
iteration:=0;
lst1.Items.Clear;
EXopt1.Text:='';
EXopt2.Text:='';
EIteration.Text:='';
try
n:=0;
x1:=StrToFloat(Ex1.text);
n:=1;
x2:=StrToFloat(Ex2.text);
n:=2;
error:=strtofloat(Eequal.Text)
begin
if rb1.Checked then //проверка на выбор функции и запуск метода Хука-Дживса
repeat
begin
sx1:=x1;
sx2:=x2;
x1opt:=RB1ExplSearch(x1,x2,1); //Передача значений
в операцию исследующего
x2opt:=RB1ExplSearch(x1opt,x2,
//fx:=sqr(x1opt+x2opt)+sqr(
fx:=sqr(x1opt+x2opt)+sqr(
lst1.Items.Add('Исследующий
lst1.Items.Add('x1 = '+FloatToStr(x1opt)+' x2 = '+FloatToStr(x2opt)+' f(x) ='+FloatToStr(fx));
h1:=(x1opt-x1)*0.1;
h2:=(x2opt-x2)*0.1;
F:=sqr(x1+x2-0.1)+sqr(x2-1);
dF:=0;
while dF<F do //запуск цикла поиска по образцу
begin
F:=sqr(x1+x2-0.1)+sqr(x2-1);
tx1:=x1;
tx2:=x2;
x1:=x1+h1;
x2:=x2+h2;
lst1.Items.Add('Поиск по
lst1.Items.Add('x1 = '+FloatToStr(x1)+' x2 = '+FloatToStr(x2)+' f(x) ='+FloatToStr(F));
dF:=sqr(x1+x2-0.1)+sqr(x2-1);
end;
test:=sqrt(sqr(x1-sx1)+sqr(x2-
x1:=tx1;
x2:=tx2;
iteration:=iteration+1; //подсчет количества итераций
end;
until test<=error //проверка критерий с заданной точность
end;
begin
if rb2.Checked then //проверка на выбор
функции и запуск метода Хука-
repeat
begin
sx1:=x1;
sx2:=x2;
x1opt:=RB2ExplSearch(x1,x2,1); //Передача значений
в функцию квадратичной
x2opt:=RB2ExplSearch(x1opt,x2,
lst1.Items.Add('Исследующий
lst1.Items.Add('x1 = '+FloatToStr(x1opt)+' x2 = '+FloatToStr(x2opt)+' f(x) ='+FloatToStr(fx));
h1:=(x1opt-x1)*0.1;
h2:=(x2opt-x2)*0.1;
F:=sqr(x1-x2)+sqr(x2+3);
dF:=0;
while dF<F do //запуск цикла поиска по образцу
begin
F:=sqr(x1-x2)+sqr(x2+3);
tx1:=x1;
tx2:=x2;
x1:=x1+h1;
x2:=x2+h2;
lst1.Items.Add('Поиск по
lst1.Items.Add('x1 = '+FloatToStr(x1)+' x2 = '+FloatToStr(x2) +' f(x) ='+FloatToStr(F));
dF:=sqr(x1-x2)+sqr(x2+3);
end;
test:=sqrt(sqr(x1-sx1)+sqr(x2-
x1:=tx1;
x2:=tx2;
iteration:=iteration+1; //подсчет количества итераций
end;
until test<=error //проверка критерий с заданной точность
end;
begin
if rb3.Checked then //проверка на выбор
функции и запуск метода Хука-
repeat
begin
sx1:=x1;
sx2:=x2;
x1opt:=RB2ExplSearch(x1,x2,1); //Передача значений
в функцию квадратичной
x2opt:=RB2ExplSearch(x1opt,x2,
lst1.Items.Add('Исследующий
lst1.Items.Add('x1 = '+FloatToStr(x1opt)+' x2 = '+FloatToStr(x2opt)+' f(x) ='+FloatToStr(fx));
h1:=(x1opt-x1)*0.1;
h2:=(x2opt-x2)*0.1;
F:=sqr(x1-x2)+sqr(x2+2.9);
dF:=0;
while dF<F do //запуск цикла поиска по образцу
begin
F:=sqr(x1-x2)+sqr(x2+2.9);
tx1:=x1;
tx2:=x2;
x1:=x1+h1;
x2:=x2+h2;
lst1.Items.Add('Поиск по
lst1.Items.Add('x1 = '+FloatToStr(x1)+' x2 = '+FloatToStr(x2) +' f(x) ='+FloatToStr(F));
dF:=sqr(x1-x2)+sqr(x2+2.9);
end;
test:=sqrt(sqr(x1-sx1)+sqr(x2-
x1:=tx1;
x2:=tx2;
iteration:=iteration+1; //подсчет количества итераций
end;
until test<=error //проверка критерий с заданной точность
else
if not(rb1.Checked) and not(rb2.Checked) and not(rb3.Checked) then
begin
raise Exception.Create('Выбирите функцию');
end;
lst1.Items.Add('');
lst1.Items.Add('Количество итераций '+inttostr(iteration));
EIteration.Text:=IntToStr(
EXopt1.Text:=FloatToStr(x1); //вывод результатов для х первого
EXopt2.Text:=FloatToStr(x2); //вывод результатов для ч второго
EFunc.Text:=FloatToStr(F); //вывод результатов для функции в точках х1 х2
end;
Except //блок обработки ошибок
on EConvertError do
begin
if n=0 then
begin
Ex1.SetFocus;
ShowMessage('х1 должен быть числом или вместо точки должна быть запятая');
end;
if n=1 then
begin
Ex2.SetFocus;
ShowMessage('х2 должен быть числом или вместо точки должна быть запятая');
end;
if n=2 then
begin
Eequal.SetFocus;
ShowMessage('Точность должна
end;
end;
end;
lst1.TopIndex:=lst1.Items.
end;
end.