- •Содержание
- •Введение
- •Глава 1.Численные методы минимизации функций. Минимизация функций одной переменной методом последовательного перебора
- •1.1. Постановка задачи
- •1.2. Локальный минимум и максимум. Унимодальные функции. Связь между задачами максимизации и минимизации.
- •1.3. Метод равномерного перебора. Условие Липшица.
- •Теорема 3.3.
- •Теорема 3.4.
- •1.4. Метод последовательного перебора
- •1.5. Классический метод решения задач минимизации функции одной переменной
- •1.6. Метод половинного деления
- •1.7.Метод парабол
- •1.8. Метод золотого сечения
- •1.9. Применение и особенности численных методов минимизации функций одной переменной
- •Глава 2. Реализация методов равномерного перебора, последовательного перебора.
- •2.1. Реализация методов
- •2.2. Тестирование программы
- •Заключение
- •Список литературы
- •Приложение 1. Текст программы, реализующей метод равномерного перебора.
- •Приложение 2.
Приложение 2.
Текст программы, реализующей метод последовательного перебора.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, jpeg, ComCtrls, TeeProcs, TeEngine, Chart,
Series;
type
TForm1 = class(TForm)
GroupBox1: TGroupBox;
Label1: TLabel;
Image1: TImage;
Label2: TLabel;
Edit1: TEdit;
Label3: TLabel;
Edit2: TEdit;
Label4: TLabel;
Edit3: TEdit;
Label5: TLabel;
Edit4: TEdit;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
Button1: TButton;
GroupBox2: TGroupBox;
Memo1: TMemo;
PageControl1: TPageControl;
TabSheet2: TTabSheet;
Chart1: TChart;
Series1: TLineSeries;
Series2: TLineSeries;
Series3: TLineSeries;
Series4: TLineSeries;
Series5: TLineSeries;
Series6: TLineSeries;
procedure Edit4Change(Sender: TObject);
procedure Edit3Change(Sender: TObject);
procedure Edit1Change(Sender: TObject);
procedure Edit2Change(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Edit1KeyPress(Sender: TObject; var Key: Char);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
a,b,c,d,e,h,j,n,Fmin,Jx,fuct:real; L,i,nn,k,m,x:integer;
u:array[1..1000] of real;
Ju:array[1..1000] of real;
F:array[1..1000] of real;
Kmin:string;
implementation
{$R *.dfm}
procedure TForm1.Edit4Change(Sender: TObject);
begin
if (length(Edit4.Text) = 0) then
begin
label9.Visible:=true;
end
else
begin
label9.Visible:=false;
end;
end; //выводит восклицательный знак если в поле не задано значение
procedure TForm1.Edit3Change(Sender: TObject);
begin
if (length(Edit3.Text) = 0) then
begin
Label8.Visible:=true;
end
else
begin
Label8.Visible:=false;
end;
end; //выводит восклицательный знак если в поле не задано значение
procedure TForm1.Edit1Change(Sender: TObject);
begin
if (Length(Edit1.Text) = 0) or (Length(Edit2.Text) = 0) or (Length(Edit1.Text) = 0) and (Length(Edit2.Text) = 0) then
begin
Label7.Visible:=true;
end
else
begin
Label7.Visible:=false;
end;
end; //выводит восклицательный знак если в поле не задано значение
procedure TForm1.Edit2Change(Sender: TObject);
begin
if (Length(Edit1.Text) = 0) or (Length(Edit2.Text) = 0) or (Length(Edit1.Text) = 0) and (Length(Edit2.Text) = 0) then
begin
Label7.Visible:=true;
end
else
begin
Label7.Visible:=false;
end;
end; //выводит восклицательный знак если в поле не задано значение
procedure TForm1.FormShow(Sender: TObject);
begin
if (Length(Edit1.Text) = 0) or (Length(Edit2.Text) = 0) or (Length(Edit1.Text) = 0) and (Length(Edit2.Text) = 0) then
begin
Label7.Visible:=true;
end
else
begin
Label7.Visible:=false;
end;
if (length(Edit3.Text) = 0) then
begin
Label8.Visible:=true;
end
else
begin
Label8.Visible:=false;
end;
if (length(Edit4.Text) = 0) then
begin
label9.Visible:=true;
end
else
begin
label9.Visible:=false;
end;
end; //выводит восклицательный знак если в поле не задано значение при открытии формы
procedure TForm1.Button1Click(Sender: TObject);
begin
//=========Очистка поля мемо1 и очистка графика=============//
Memo1.Clear;
Form1.Chart1.Series[0].Clear;
Form1.Chart1.Series[1].Clear;
Form1.Chart1.Series[2].Clear;
Form1.Chart1.Series[3].Clear;
Form1.Chart1.Series[4].Clear;
Form1.Chart1.Series[5].Clear;
//==========Проверка на введеные данные в поля=============//
if (Label7.Visible=true) or (Label8.Visible=true) or (Label9.Visible=true) then
begin
MessageBox(handle, 'Извините вы что-то забыли ввести!!', 'Ошибка данных!!', 0);
end
else
begin
//==================Значения с формы======//
// отрезок
a:=StrToFloat(Edit1.Text); // отрезок от а {c формы значение от}
b:=StrToFloat(Edit2.Text); // отрезок до б {с формы значение до}
// искомая погрешность
e:=StrToFloat(Edit3.Text); // значение искомой погрешности.
// Константа Липшица
L:=StrToInt(Edit4.Text); //Значение константы Липшица.
//===============Построение графика по формуле============//
for x:=-10 to 10 do
begin
Jx:=sqr(x)+2*x;
form1.Chart1.Series[0].AddXY(x,Jx);
form1.Chart1.Series[1].AddXY(x,0);
form1.Chart1.Series[2].AddXY(0,x);
form1.Chart1.Series[3].AddXY(a,x);
form1.Chart1.Series[4].AddXY(b,x);
form1.Chart1.Series[5].AddXY(x,L);
end;
//==================Начало================//
d:=(2*e)/L; // первое значение для шага разбития
c:=b-a; // второе значение для шага раазбития
//Шаг разбития
if d>c then
begin
h:=c; //если первоезначение больше второго то минимум равен второму значению
end
else
begin
h:=d; //иначе обратная процедура, минимум равен первому
end; // шаг разбития
//значение n отрезков
n:=(abs(a)+abs(b))/h; // кол-во отрезков
nn:=StrToInt(FloatToStr(n));
//==================Пред шаговая================//
u[1]:=a+(h/2); //первое значение u1
///////////////////////////////////////////////////
Ju[1]:=sqr(u[1])+2*u[1]; //J(u1) по формеле c формы
///////////////////////////////////////////////////
Fmin:=Ju[1]; // функция, для нахождения следующей точки разбиения
///////////////////////////////////////////////////
//==================Шаги================//
// Заполняет Fmin из F[1..n] и Ju[i]
for i:=2 to nn do
begin
if u[i-1]<(b-(h/2)) then
begin
u[i]:=u[i-1]+h+((Ju[i-1]-Fmin)/L);
Ju[i]:=sqr(u[i])+2*(u[i]);
for k:=1 to i do
begin
if Fmin>=Ju[k] then
begin
Fmin:=Ju[k];
end
else
begin
Fmin:=Fmin;
end;
end;
end // Шаги и их заполнением и выполнение
else
begin
u[nn]:=u[nn-1]+h+((Ju[nn-1]-Fmin)/L);
if u[nn]>b then
begin
Fmin:=b;
end
else
begin
Fmin:=u[nn];
end;
end;
end;
//проверка минимума в минимальном значении
F[1]:=u[1];
for i:=1 to nn do
begin
if Fmin = Ju[i] then
begin
if F[1] > u[i] then
begin
F[1]:=F[1];
end
else
begin
F[1]:=u[i];
end;
end;
end;
//вывод результата на форму в поле мемо1
Memo1.Lines.Add('Минимум функции : '+FloatToStr(Fmin));
Memo1.Lines.Add('Значение функции в минимуме: '+FloatToStr(F[1]));
Memo1.Lines.Add('Данные, полученные в ходе решения поставленной задачи,'+#13+'являются не точными и предполагают наличие погрешности связанной с выбором e и L');
end;
end;
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if key in ['a'..'z','A'..'Z','а'..'я','А'..'Я' ,'ё',' ','.','+','*','/','=',')','(','&','^','%','$','#','@','!',';',':','?','"','[',']','{','}','\','|','/','_','<','>','¦','№'] then key:=#0;
end; //защита от ввода букв
end.