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