Метод сопряженных градиентов (оптимизация) / Записка к курсачу
.docxМинистерство образования республики Беларусь
Учреждение образования
Белорусский государственный университет информатики и радиоэлектроники
Факультет информационных технологий и управления
Кафедра вычислительных методов и программирования
Дисциплина: Основы алгоритмизации и программирования
ПОЯСНИТЕЛЬНАЯ ЗАПИСКА
к курсовой работе
на тему
«Нахождение минимума функции n переменных. Метод Сопряженных градиентов Флетчера-Ривса»
Студентка: гр.120603 Лисовская Д.Л.
Руководитель: профессор Синицын А.К
Минск-2012
Содержание
Введение ……………………………………………………………………………………….. 3
Постановка задачи ………………………………………………………………………… 4
Описание алгоритма решения поставленной задачи…………………… 5
Описание программы …………………………………………………………………….7
Примеры тестовых задач………………………………………………………………..8
Заключение…………………………………………………………………………………….10
Литература……………………………………………………………………………………..11
Приложение 1. Текст программы………………………………………………….12
Приложение 2. Блок-схема……………………………………………………………16
Введение
Все люди решают какие-то задачи. Нередко, при решении этих задач, жизнь ставит нас перед сложным выбором из множества вариантов:
сколько и куда вложить денег, чтобы получить наибольшую прибыль, по какой дороге поехать, чтобы сэкономить бензин и время, как выбрать параметры прибора, чтобы при этом достигался максимум КПД.
В таких ситуациях очень важно не ошибиться и принять оптимальное решение. Именно в этом и состоит задача методов оптимизации.
В математике задача поиска оптимального решения сводится к поиску минимума или максимума целевой функции, но так как нахождение минимума эквивалентно нахождению максимума, то стандартные программы разрабатываются, как правило, для нахождения минимума. Практически все методы минимизации функции n переменных основаны на многократном повторении следующих двух действий:
-
выбор в области параметров некоторого направления спуска;
-
спуск к минимуму вдоль выбранного направления.
Таким образом, все многообразие методов минимизации определяется множеством способов выбора направлений и методов спуска в выбранном направлении. Различают:
-
методы нулевого порядка (при выборе направления спуска требуют только вычисления значений функции);
-
методы первого порядка (требуют вычисления градиента функции);
-
методы второго порядка (требуют вычисления как градиента, так и матрицы вторых производных);
-
методы с переменной метрикой (занимают промежуточное место между методами первого и второго порядка).
Цель моей курсовой работы – написать программу нахождения минимума функции n переменных с помощью метода сопряженных градиентов Флетчера-Ривса, который относится к методам минимизации первого порядка.
Постановка задачи
Главной целью большинства выполняемых на компьютере расчетов является принятие оптимального в конкретной ситуации решения или, что тоже самое, сделать наилучший выбор из множества допустимых вариантов.
В каждом случае при решении задачи выбора требуется построить математическую модель, описывающую конкретную ситуацию. Формулировка модели содержит некоторое количество параметров, значение которых определяет конкретный вариант.
![]()
Ценность каждого варианта определяется числом, которое называется критерием. Если удается сопоставить каждому варианту определенное значение критерия, то получаем целевую функцию.
![]()
В результате, задача принятия оптимального решения приводит к нахождению оптимального (максимального или минимального) значения целевой функции. Отметим, что нахождения максимума эквивалентно нахождению минимума, поэтому стандартные программы разрабатываются, как правило, для нахождения минимума целевой функции.
Постановка задачи о локальном минимуме
Пусть в Евклидовом пространстве задана функция
![]()
Говорят,
что функция имеет локальный минимум в
точке
если
существует некоторая ε-окрестность
этой точки, в которой выполняется
![]()
![]()
Будем полагать, что функция непрерывная и дважды дифференцируемая.
Описание алгоритмов решения поставленной задачи
В методах первого порядка при выборе следующего направления спуска используется градиент функции:

Как известно, направление градиента является направлением наискорейшего возрастания функции. Следовательно, противоположное направление –g является направлением наискорейшего убывания функции. При этом направление наискорейшего убывания в данной точке не всегда оказывается наилучшим для спуска к минимуму, поэтому для повышения эффективности вводят различные поправки. При выборе очередного направления используют накопленную информацию о функции из предыдущих спусков. Множество возможностей введения таких поправок определяет многообразие различных методов первого порядка.
Алгоритм этих методов одинаков, различие состоит лишь в правиле выбора очередного направления. Задается начальная точка x0 , начальный шаг одномерного спуска h и точность ε .
Два
направления d1
и d2
называются сопряженными относительно
симметричной, положительно определенной
матрицы G
если
Известно, что для квадратичной функции можно построить n взаимно сопряженных направлений, спуск по которым приведет к точке минимума ровно за n шагов. На этом свойстве основана большая группа методов - сопряженных градиентов, сопряженных направлений, параллельных касательных и др.
В простейшем варианте метода сопряженных градиентов, обоснованном
Флетчером
и Ривсом очередное направление
определяется следующим образом![]()
,
где
Последовательность вычислений
![]()
1. Вычисляется и выбирается направление
2.
С помощью метода одномерной оптимизации
найти zm
доставляющее![]()
3.
Перейти в новую точку
4.
Вычислить
5. Проверить условие сходимости
если
оно выполняется, тогда конец,![]()
иначе переходим к п.6.
6. Выбор нового направления спуска
7. Повторить с п.2.
Программная реализация содержит отдельные подпрограммы для
вычисления функции, ее градиента и нахождения минимума.
Описание программы
При запуске программы пользователю предоставляется окно, в котором он может выбрать функцию, для которой программа будет искать минимум, и задать начальные данные. Выбор функции осуществляется с помощью компонента RadioGroup, начальные данные вводятся в компоненты Edit и StringGrid. При нажатии кнопки ВЫПОЛНИТЬ программа начинает работу и выдает результат в компонент Memo. В случае функции от двух переменных в компоненте Chart строится график спуска по градиенту.
Примеры тестовых задач
Заключение
Данная программа минимизирует заданную функции с помощью метода сопряженных градиентов Флетчера-Ривса и выводит результат в Memo1, а также показывает график минимизации в компоненте TChart (в случае функции от двух переменных). Начальные данные можно изменять. Скорость минимизации зависит от количества переменных функции. Метод сопряжённых градиентов позволяет решать квадратичные задачи за конечное число шагов. На многих других задачах данный метод превосходит метод градиентного спуска.
Литература
Синицын, А.К., Навроцкий, А.А. Вычислительная математика / А.К. Синицын, А.А. Навроцкий. – Минск, 2008 – 50 с.
http://ru.wikipedia.org/wiki/Метод_сопряжённых_градиентов
Приложение 1. Текст программы
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, TeeProcs, TeEngine, Chart, Series, StdCtrls, ComCtrls,
unit2, Grids;
type
TForm1 = class(TForm)
Chart1: TChart;
Memo1: TMemo;
Button1: TButton;
Series1: TLineSeries;
Label4: TLabel;
Label5: TLabel;
Edit1: TEdit;
Button2: TButton;
StringGrid1: TStringGrid;
Label6: TLabel;
Edit2: TEdit;
RadioGroup1: TRadioGroup;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
n,m,l:integer;
implementation
{$R *.dfm}
Function F(x:TMas):real;
begin
case Form1.RadioGroup1.ItemIndex of
0:F:=sqr(x[0]-x[1])+5*sqr(x[1]);
1:F:=2*sqr(x[0])+5*sqr(x[1])-4*x[0]*x[1];
2:F:=sqr(1-x[0])+100*sqr(x[1]-sqr(x[0]));
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Edit1.Text:='2';
Edit2.Text:='0,001';
StringGrid1.Cells[0,0]:='x1';
StringGrid1.Cells[0,1]:='x2';
StringGrid1.Cells[1,0]:='-2';
StringGrid1.Cells[1,1]:='2';
Memo1.Lines.Clear;
with chart1 do begin
AnimatedZoom:=true;
SeriesList[0].Clear;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var i,n:integer;
x,g:TMas;
eps:single;
ss:TNC;
begin
Chart1.SeriesList[0].Clear;
Memo1.Lines.Clear;
n:=strtoint(Edit1.Text);
SetLength(x,n);
SetLength(g,n);
for i:=0 to n-1 do
x[i]:=strtofloat(StringGrid1.Cells[1,i]);
eps:=strtofloat(Edit2.Text);
l:=Form1.RadioGroup1.ItemIndex;
ss:=TNC.Create(x,n,eps,F,Chart1,l);
ss.SearchMin;
x:=ss.x1;
g:=ss.g1;
Memo1.Lines.Add('минимум при х=');
for i:=0 to n-1 do
Memo1.Lines.Add(floattostrf(x[i],fffixed,4,4));
Memo1.Lines.Add('f(x)='+floattostrf(F(x),fffixed,4,4));
Memo1.Lines.Add('градиент g=');
for i:=0 to n-1 do
Memo1.Lines.Add(floattostrf(g[i],fffixed,4,4));
end;
procedure TForm1.Button2Click(Sender: TObject);
var i:integer;
begin
n:=strtoint(Edit1.Text);
StringGrid1.RowCount:=n;
for i:=0 to n-1 do
StringGrid1.Cells[0,i]:='x'+inttostr(i+1);
end;
end.
unit Unit2;
interface
uses Dialogs,Chart;
Type Tmas=array of real;
fun=function(x:Tmas):real;
TNC=class(TObject)
n,m,l:integer;
dk,v,u,g1,g0,x0,x1,hu,uh:TMas;
zm,eps,ht:real;F:fun;
chart:TChart;
constructor Create(x:TMas;enum:integer;meps:single;mfunc:fun;mchart:TChart;ml:integer);
function GradF(x:TMas):TMas;
function F1(z:real):real;
function mp(x0,h,e:real):real;
procedure SearchMin;
end;
implementation
Constructor TNC.Create(x:TMas;enum:integer;meps:single;mfunc:fun;mchart:TChart;ml:integer);
var i:integer;
begin
eps:=meps;
n:=enum;
F:=mfunc;
chart:=mchart;
SetLength(g1,n);
SetLength(g0,n);
SetLength(dk,n);
SetLength(v,n);
SetLength(u,n);
SetLength(x1,n);
SetLength(x0,n);
ht:=0.00000000000001;
for i:=0 to n-1 do
x0[i]:=x[i];
l:=ml;
end;
Function TNC.F1(z:real):real;
var t:TMas;i:integer;
begin
SetLength(t,n);
for i:=0 to n-1 do
t[i]:=x0[i]+z*dk[i];
result:=F(t);
end;
Function TNC.GradF(x:TMas):TMas;
var t,grad:TMas;i:integer;
begin
SetLength(t,n);
SetLength(grad,n);
for i:=0 to n-1 do
t[i]:=x[i];
for i:=0 to n-1 do
begin
t[i]:=t[i]+ht;
grad[i]:=f(t);
t[i]:=t[i]-2*ht;
grad[i]:=(grad[i]-f(t))/(2*ht);
end;
result:=grad;
end;
function TNC.mp(x0,h,e:real):real;
var comput:boolean;
x1,x2,x3,y1,y2,y3,z1,z2,p,q,zm:real;
begin
x1:=x0-h;
x2:=x0;
x3:=x0+h;
y1:=F1(x1);
y2:=F1(x2);
y3:=F1(x3);
comput:=false;
if (y1-(2*y2)+y3)>0 then
begin
while comput=false do
begin
z1:=x1-x3;
z2:=x2-x3;
p:=((y1-y3)*z2-(y2-y3)*z1)/(z1*z2*(z1-z2));
q:=(((y1-y3)*sqr(z2))-((y2-y3)*sqr(z1)))/(z1*z2*(z2-z1));
if p=0 then break;
zm:=-q/(2*p);
x1:=x2;
x2:=x3;
y1:=y2;
y2:=y3;
x3:=x3+zm;
y3:=F1(x3);
if abs(zm)<e then
begin
Result:=x3+zm;
comput:=true;
end;
end;
end;
end;
Procedure TNC.SearchMin;
var i:integer;
ag1,ag0:real;
begin
g0:=gradf(x0);
for i:=0 to n-1 do
dk[i]:=-g0[i];
if n=2 then
chart.SeriesList[0].AddXY(x0[0],x0[1]);
zm:=0;
m:=0;
repeat
ag1:=0;
ag0:=0;
inc(m);
zm:=mp(3,0.5,0.00001);
for i:=0 to n-1 do
x1[i]:=x0[i]+zm*dk[i];
if n=2 then
chart.SeriesList[0].AddXY(x1[0],x1[1]);
g1:=gradf(x1);
if (m mod n=1)and(m>1) then
begin
for i:= 0 to n-1 do
dk[i]:=-gradF(x1)[i];
zm:=0;
end
else
begin
for i:= 0 to n-1 do
begin
ag1:=ag1+sqr(g1[i]);
ag0:=ag0+sqr(g0[i]);
end;
For i:= 0 to n-1 do
dk[i]:=-gradf(x1)[i]+ag1/ag0*dk[i] ;
end;
for i:=0 to n-1 do
x0[i]:=x1[i];
until (zm+sqrt(ag1)<eps);
end;
end.
Приложение 2. Блок-схема.

