Разработка программы для вычисления функций
МИНИСТЕРСТВО
ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ
ВОРОНЕЖСКИЙ
ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
ФАКУЛЬТЕТ
ВЕЧЕРНЕГО И ЗАОЧНОГО ОБУЧЕНИЯ
КАФЕДРА
Автоматизированные и вычислительные системы
КОНТРОЛЬНАЯ
РАБОТА
по
дисциплине “Нелинейное программирование”
Выполнил:
ст. гр. ВМ-101
Машинистов К.Ю.
Проверил:
Сергеева Т.И.
ВОРОНЕЖ 2013
КОНТРОЛЬНОЕ ЗАДАНИЕ №1
Таблица 1
Номер
варианта
|
Функция
|
a
|
b
|
E
|
6
|
F(x) = -3·e-x·ln(2·x)
|
0.5
|
2.5
|
0.001
|
Решение:
unit Z_6;, Messages, SysUtils,
Variants, Classes, Graphics, Controls, Forms,, StdCtrls;= class(TForm):
TLabel;: TLabel;: TLabel;: TEdit;: TEdit;: TEdit;: TLabel;: TLabel;: TLabel;:
TLabel;: TButton;: TMemo;: TMemo;: TLabel;Button2Click(Sender:
TObject);Edit1KeyPress(Sender: TObject; var Key: Char);Edit2KeyPress(Sender:
TObject; var Key: Char);Edit3KeyPress(Sender: TObject; var Key: Char);
{ Private declarations }
{ Public declarations };: TForm1;
{$R
*.dfm}TForm1.Button2Click(Sender: TObject);.Close;;TForm1.Edit1KeyPress(Sender:
TObject; var Key: Char);Key=#13
then:=#0;.SetFocus;;;TForm1.Edit2KeyPress(Sender: TObject; var Key:
Char);Key=#13 then:=#0;.SetFocus;;;TForm1.Edit3KeyPress(Sender: TObject; var
Key: Char);
const
fi=1.618;a,b,e,x1,x2,y1,y2,rez:real;
s:string;Key=#13
then.Lines.Clear;.Lines.Clear;:=#0;:=StrToFloat(Edit1.Text);:=StrToFloat(Edit2.Text);:=StrToFloat(Edit3.Text);:=b-(b-a)/fi;:=a+(b-a)/fi;
y1:=-3*exp(-x1)*ln(2*x1);:=-3*exp(-x2)*ln(2*x2);
repeaty1<=y2 then
begin:=x2; x2:=x1;
y2:=y1;:=b-(b-a)/fi; y1:=-3*exp(-x1)*ln(2*x1);
end:=x1; x1:=x2;
y1:=y2;:=a+(b-a)/fi; y2:=-3*exp(-x2)*ln(2*x2);;:=
(x1+x2)/2;:=FloatToStr(rez);.Caption:=s;:=FloatToStr(x1);.Lines.Add(s);:=FloatToStr(x2);.Lines.Add(s);;abs(b-a)<e;;;.
КОНТРОЛЬНОЕ ЗАДАНИЕ №2
программный градиентный спуск
координата
Таблица 2
№
варианта
|
Функция
|
X
|
H
|
Xmin
|
6
|
F(x1, x2) = (x12 + x2 + 10)2 + (x1
+ x22 - 122)2
|
(-10, -1)
|
1
|
(1, -11)
|
Решение:Unit1;,
Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,, StdCtrls;=array[1..2]
of double;= class(TForm): TLabel;: TLabel;: TEdit;: TEdit;: TListBox;:
TButton;: TEdit;: TLabel;Button2Click(Sender: TObject);Edit1KeyPress(Sender:
TObject; var Key: Char);Edit2KeyPress(Sender: TObject; var Key:
Char);Edit5KeyPress(Sender: TObject; var Key: Char);
{ Private declarations }
{ Public declarations };: TForm1;
{$R *.dfm}
{Процедура поиска минимума}
procedure
TForm1.Edit5KeyPress(Sender: TObject; var Key: Char);
x,b,y,p:t;
{массивы для точек}
h, k,
fi, fb:double;
{h, k
- шаг, fi - значение
функции,
fb - значение
функции в базовой точке}
e, a:boolean;,fe:integer;
{функция, минимум которой требуется найти}
function F(x1,
x2:double):double;:=sqr(sqr(x1)+x2+10)+sqr(x1+sqr(x2)-122);:=fe+1;
end;
{процедура вывода на экран координат очередной
найденной точки}
procedure
printrezult;
begin
listbox1.Items.Add('Точка');
listbox1.Items.Add(FloatToStrF(x[1],
ffFixed, 3, 3)+
';'+FloatToStrF(x[2], ffFixed, 3,
3));.Items.Add('f(x1,x2)='+FloatToStr(fi));.Items.Add('');;Key=#13 then:=#0;
{ Введённые данные переводим из строки в число}
{Начальные значения}
fe:=0;:=h;:=x;:=x;:=x;
{Начальное значение функции}
fi:=F(x[1],
x[2]);
listbox1.Items.Add('Начальное
значение функции');
printrezult;
{Признак исследования функции вокруг базисной
точки }
a:=true; fb:=fi; e:=false;
not e
do
begin
{Исследование функции в окрестности базисной
точки}
for i:=1 to 2 do[i]:=y[i]+k;F(x[1],
x[2])>fi then[i]:=y[i]-k;F(x[1], x[2])>fi then x[i]:=y[i] else
y[i]:=x[i];[i]:=x[i];;:=F(x[1], x[2]);.Items.Add('Исследующий
поиск');;
end;
{Если функция уменьшилась, то поиск по образцу }
if (fi<fb-0.00000001) then
//поиск по образцуi:=1 to 2 do
p[i]:=2*(y[i]-b[i])+b[i];
b:=y;:=p;:=p;:=fi; a:=false;:=F(x[1],
x[2]);.Items.Add('Поиск
по образцу');
printrezult;a then:=k/10;
//listbox1.Items.Add('Уменьшить
длину шага');
//Завершить вычисления, если шаг достаточно мал
e:=k<0.00000001;:=b;:=b;:=b;:=true;:=F(x[1],
x[2]); fb:=fi;.Items.Add('Замена
базисной
точки');;;;;
// Результат.Items.Add('Минимум
найден');;.Items.Add('Кол-во вычислений:'+IntToStr(fe));;;
// ВыходTForm1.Button2Click(Sender:
TObject);;;TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);Key=#13
then:=#0;.SetFocus;;;TForm1.Edit2KeyPress(Sender: TObject; var Key:
Char);Key=#13 then:=#0;.SetFocus;;;.
КОНТРОЛЬНОЕ ЗАДАНИЕ №3
Таблица 3
№
вар.
|
Функция
|
X
|
H
|
Xmin
|
6
|
F(x1..x4) =
(x1+7)2
+ 2*(x2-7)2 + 3*(x3+7)2 + 4*(x4-7)2
|
(4,-1,4,-1)
|
4
|
(-7,7,-7,7)
|
Решение:Unit1;,
Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,,
StdCtrls;
const
// число переменных функции
n=4;
type
// тип для массивов с координатами
vector=array[1..n] of double;=
class(TForm): TLabel;: TLabel;: TLabel;: TEdit;: TEdit;: TEdit;: TButton;:
TListBox;: TLabel;: TEdit;: TEdit;: TLabel;Button1Click(Sender:
TObject);Edit1KeyPress(Sender: TObject; var Key: Char);Edit2KeyPress(Sender:
TObject; var Key: Char);Edit3KeyPress(Sender: TObject; var Key:
Char);Edit4KeyPress(Sender: TObject; var Key: Char);Edit5KeyPress(Sender:
TObject; var Key: Char);
{ Private declarations
}Rezultat(x:vector);
{ Public declarations };: TForm1;
{$R *.dfm}
//ФункцияF(x:vector):double;:=sqr(x[1]+7)+2*sqr(x[2]-7)+3*sqr(x[3]+7)+4*sqr(x[4]-7);;
//ВыходTForm1.Button1Click(Sender:
TObject);
close;
end;
// вывод координат точки и значения функции в
этой точке
procedure
TForm1.Rezultat(x:vector);.Items.Add('F('+floattostrf(x[1],fffixed,8,3)+','+(x[2],fffixed,8,3)+','+floattostrf(x[3],fffixed,8,3)+
','+floattostrf(x[4],fffixed,8,3)+')='+(f(x),fffixed,8,3));;
// Основные
вычисленияTForm1.Edit1KeyPress(Sender: TObject; var Key: Char);Key=#13
then:=#0;.SetFocus;;;TForm1.Edit2KeyPress(Sender: TObject; var Key:
Char);Key=#13 then:=#0;.SetFocus;;;TForm1.Edit3KeyPress(Sender: TObject; var
Key: Char);Key=#13 then:=#0;.SetFocus;;;TForm1.Edit4KeyPress(Sender: TObject;
var Key: Char);Key=#13 then:=#0;.SetFocus;;;
// Основные
вычисленияTForm1.Edit5KeyPress(Sender: TObject; var Key: Char);
var, x1, xr, rx, g:vector;
k, m, i:integer;, e1, e2, mmm, mmm1,
u, u1, u2:double;
prizn, prizn1:boolean;Key=#13
then:=#0;
//считывание
данных[1]:=strtoint(edit1.Text);[2]:=strtoint(edit2.Text);[3]:=strtoint(edit3.Text);[4]:=strtoint(edit4.Text);:=strtoint(edit5.Text);
//Точность
и
начальные
значения
e1:=0.0001;:=0.0015;:=100;:=0;:=false;
while
not prizn
do
begin
//вывод текущей точки и номера итерации
rezultat(x);
// расчёт градиента (массив g)
в точке x.
for i:=1 to n do[i]:=x[i];i:=1 to n
do[i]:=x1[i]+e1;[i]:=(f(x1)-f(x))/e1;[i]:=x[i];;
//mmm = модуль градиента:=0;i:=1 to
n do:=mmm+sqr(g[i]);:=sqrt(mmm);mmm<e1 then
//если модуль градиента меньше установленной
точности,
// то установить флаг окончания поиска
prizn:=true;
for i:=1 to n do[i]:=x[i];k>=m
then
//если число итераций превысило допустимое,
// то установить флаг окончания поиска
prizn:=true;
// массив xr
с координатами точки результата
for i:=1 to n do[i]:=x[i];
else
begin
//Установить точку x1
равную x
for i:=1 to n do[i]:=x[i];
// признак, что функция в точке x1
< чем в x
prizn1:=false;not prizn1 do
// сместить x1
в направлении градиента на текущий шаг t
for i:=1 to n
do[i]:=x1[i]-t*g[i];:=f(x1); u2:=f(x); u:=u1-u2;u<0 then
//если функция в точке x1
< чем в x, то установить
соответствующий признак
prizn1:=true;
end
else
begin
//если функция в точке x1
< чем в x, то
//уменьшить шаг в 10 раз
t:=t/10;
// установить точку x1
равную x
for
i:=1 to
n do
x1[i]:=x[i];;;
//формирование вектора rx
из точки x в точку x1
for i:=1 to n do[i]:=x1[i]-x[i];
//mmm1
= модуль вектора rx
mmm1:=0;
for i:=1 to n do:=mmm1+sqr(rx[i]);
mmm1:=sqrt(mmm1);:=f(x1);
u2:=f(x);:=u1-u2;(mmm1<e2) and
(abs(u)<e2) then
//если модуль вектора rx
меньше установленной точности
//и разность значений функции в точках x
и x1 также меньше
установленной точности
// то установить флаг окончания поиска
prizn:=true;
// и подготовить массив xr
с координатами точки результата
for i:=1 to n do[i]:=x1[i];
else
begin
// иначе
// увеличить счётчик итераций на 1
k:=k+1;
// установить точку x
равную x1
for i:=1 to n do[i]:=x1[i];;;;;
//вывод
результата
- точки
xr(xr);;;.