Задание 1
ПРОГРАММИРОВАНИЕ ЧИСЛЕННЫХ МЕТОДОВ ОДНОМЕРНОЙ ОПТИМИЗАЦИИ
Цель задания: закрепить теоретические сведения и приобрести практические навыки разработки алгоритмов и программ для нахождения экстремальных значений функции одной переменной методом перебора с применением ЭВМ.
Найти максимум и минимум функции при изменении аргумента от -4 до 3 с точностью 0,0001. Функция достигает максимума при меньших значениях аргумента. Постройте график функции.
Исходные данные приведены в таблице 1.
Таблица 1
Номер варианта A B С D 6 1,5 0,4 -5,6 -10,8
Рисунок 1 – блок-схема метода
Решение задачи на ЭВМ с графиком исследуемой функции
На рисунке 2 изображено решение задачи на ЭВМ с графиком функции.
Рисунок 2- результаты работы программы, график функции
Краткие выводы по работе
Задача решена методом последовательного равномерного перебора с уточнением, т.е. вначале проводится поиск с большим шагом, а при нахождении экстремума поиск повторяется в зоне экстремума с уменьшенным шагом.
Программа реализующая алгоритм
:
procedure TForm1.SpeedButton1Click(Sender: TObject);
var a,b,c,d,e,y,Ymax,Xmax,
x0,X,Xk,Xmin,Ymin,h,k :real;
i,n,count :integer;
status :integer; // 0-убывание, 1-возрастание
label l1;
Function MOO(x:real):real;
begin
result:=a*x*x*x + b*x*x + c*x + d;
end;
begin
Form1.Series1.Clear;
try // ввод начальных условий
with form1 do
begin
LabelXmin.Caption:='Xmin = 0';
LabelYmin.Caption:='Ymin = 0';
LabelXmax.Caption:='Xmax = 0';
LabelYmax.Caption:='Ymax = 0';
end;
a:=strtofloat(form1.Edit1.Text);
b:=strtofloat(form1.Edit2.Text);
c:=strtofloat(form1.Edit3.Text);
d:=strtofloat(form1.Edit4.Text);
e:=strtofloat(form1.Edit5.Text);
h:=strtofloat(form1.Edit6.Text);
x0:=strtofloat(form1.Edit7.Text);
xk:=strtofloat(form1.Edit8.Text);
k:=10;
Ymin:=1000000000;
Ymax:=-10000000000;
status:=1;
count:=1;
except
showMessage('Неправильно введены начальные условия');
end;
l1: n:=trunc((xk-x0)/h)+1;
x:=x0;
for i:=1 to n do
begin
y:=MOO(x);
case status of
0: if y<Ymin then
begin
Ymin:=y;
Xmin:=x;
X:=x+h;
end;
1: if Y>Ymax then
begin
Ymax:=y;
Xmax:=x;
X:=x+h;
end;
end;
end;
if count <= 2 then
if h <= e then
begin
with form1 do // вывод результата
begin
LabelXmin.Caption:='Xmin = '+floatTostr(Xmin);
LabelYmin.Caption:='Ymin = '+floatTostr(Ymin);
LabelXmax.Caption:='Xmax = '+floatTostr(Xmax);
LabelYmax.Caption:='Ymax = '+floatTostr(Ymax);
end;
status :=(status+1) mod 2; //Следующий экстремум
count:=count+1;
x0:=Xmin;
xk:= strtofloat(form1.Edit8.Text);
h:=strtofloat(form1.Edit6.Text);
goto l1;
end
else
begin
x0:=Xmin-h;
xk:=Xmin+h;
h:=h/k;
goto l1;
end;
x:=strtofloat(form1.Edit7.Text);
while x < strtofloat(form1.Edit8.Text) do
begin
y:=MOO(x);
form1.Series1.AddXY(x,y);
x:=x+0.1;
end;
end;