Математические методы оптимизации производственных систем и объектов

Решения алгебраических уравнений методом выделения корней. Аппроксимация функций методом наименьших квадратов; дихотомия, бисекция. Одномерная оптимизация многоэкстремальных функций; метод золотого сечения. Многомерная оптимизация градиентным методом.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 04.03.2013
Размер файла 956,7 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

1. Решения алгебраических уравнений методом выделения корней

1.1 Краткие теоретические сведения

1. Приращения и принимаются достаточно большими числами

2. Переменные квадратного трехчлена принимаются равными , .

3. Первые элементы вспомогательных векторов: , .

4. До тех пор, пока и ( - точность расчетов) выполнять вычисления по следующей схеме (удобно воспользоваться циклом while):

; для ; ; для ; ; ; ; .

5. Если , то корни будут действительными, иначе - комплексно сопряженными. Необходимо предусмотреть расчет и вывод таких корней: при действительных корнях

, ;

при комплексно сопряженных корнях

,

6. Если (здесь N - порядок уравнения), то ; для ; и переходим к пункту 1. Иначе осуществляем вывод полученных значений x и завершение работы программы.

1.2 Листинг программы

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, Grids, Buttons, StdCtrls, ExtCtrls;

type

TKovalenko_Form1 = class(TForm)

Kovalenko_Label1: TLabel;

Kovalenko_Button1: TButton;

Kovalenko_Edit1: TEdit;

Kovalenko_Edit2: TEdit;

Kovalenko_Edit3: TEdit;

Kovalenko_Edit4: TEdit;

Kovalenko_Edit5: TEdit;

Kovalenko_Edit6: TEdit;

Kovalenko_Edit7: TEdit;

Kovalenko_BitBtn1: TBitBtn;

Kovalenko_StringGrid1: TStringGrid;

Image1: TImage;

procedure Kovalenko_Button1Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

type mas=array[1..7] of real;

var

Kovalenko_Form1: TKovalenko_Form1;

a,B,C,xRe,xIm:mas;n,i:integer;p,q,dp,dq,d:real;

const e=0.001;

implementation

{$R *.dfm}

procedure TKovalenko_Form1.Kovalenko_Button1Click(Sender: TObject);

label 1;

var i:integer;

begin

Kovalenko_StringGrid1.ColWidths[0]:=80;

Kovalenko_StringGrid1.ColWidths[1]:=80;

Kovalenko_StringGrid1.Cells[0,0]:=' xRe';

Kovalenko_StringGrid1.Cells[1,0]:=' xIm';

Kovalenko_StringGrid1.DefaultRowHeight:=10;

Kovalenko_StringGrid1.DefaultRowHeight:=20;

Kovalenko_StringGrid1.GridLineWidth:=2;

Kovalenko_StringGrid1.RowCount:=2;

a[1]:= StrToFloat(Kovalenko_Edit1.Text);

a[2]:= StrToFloat(Kovalenko_Edit2.text);

a[3]:= StrToFloat(Kovalenko_Edit3.text);

a[4]:= StrToFloat(Kovalenko_Edit4.text);

a[5]:= StrToFloat(Kovalenko_Edit5.text);

a[6]:= StrToFloat(Kovalenko_Edit6.text);

a[7]:= StrToFloat(Kovalenko_Edit7.text);

n:=6;

1: dp:=10000;dq:=10000;

b[1]:=a[1];c[1]:=b[1];

p:=a[2];q:=a[3];

while (abs(dp)>e) and (abs(dq)>e) do

begin

b[2]:=a[2]-p*b[1];

for i:=3 to n+1 do

b[i]:=a[i]-p*b[i-1]-q*b[i-2];

c[2]:=b[2]-p*c[1];

for i:=3 to n-1 do

c[i]:=b[i]-p*c[i-1]-q*c[i-2];

c[n]:=-p*c[n-1]-q*c[n-2];

d:=sqr(c[n-1])-c[n]*c[n-2];

dp:=(b[n]*c[n-1]-b[n+1]*c[n-2])/d;

dq:=(b[n+1]*c[n-1]-b[n]*c[n])/d;

p:=p+dp; q:=q+dq;

end;

if (p*p/4)-q>0 then

begin

xRe[1]:=-p/2+sqrt(p*p/4-q); xIm[1]:=0;

xRe[2]:=-p/2-sqrt(p*p/4-q); xIm[2]:=0;

end

else

begin

xIm[1]:=sqrt(abs(p*p/4-q)); xRe[1]:=-p/2;

xIm[2]:=-sqrt(abs(p*p/4-q)); xRe[2]:=-p/2;

end;

Kovalenko_StringGrid1.Cells[0,Kovalenko_StringGrid1.RowCount-

1]:=FloatToStrF(xRe[1],ffGeneral,3,3);

Kovalenko_StringGrid1.Cells[1,Kovalenko_StringGrid1.RowCount-

1]:=FloatToStrF(xIm[1],ffGeneral,3,3);

Kovalenko_StringGrid1.Cells[0,Kovalenko_StringGrid1.RowCount]:=Float

ToStrF(xRe[2],ffGeneral,3,3);

Kovalenko_StringGrid1.Cells[1,Kovalenko_StringGrid1.RowCount]:=Float

ToStrF(xIm[2],ffGeneral,3,3);

Kovalenko_StringGrid1.RowCount:=Kovalenko_StringGrid1.RowCount+2;

if n>2 then

begin

a[1]:=1;

for i:=2 to n-1 do

a[i]:=b[i];

n:=n-2;

goto 1

end;

end;

end.

1.3 Блок-схема

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

1.4 Результаты

Рисунок 1

Уравнение: X6+6.5X5-14X4+14X3-17X2+21X-22.5=0

Корни уравнения: 1.39; -8.4; 0.761+0.915i; 0.761-0.915i; -0.506+1.05i; -0.506-1.05i;

Вывод: метод применяется для решения алгебраических уравнений четной степени (при решении уравнений не четной степени получается большая погрешность)

2. Решение нелинейных уравнений с одним неизвестным

2.1 Метод половинного деления (дихотомии, бисекции)

Краткие теоретические сведенья

Допустим, что корень уравнения равен и расположен на отрезке .В качестве начального значения корня выбирают середину отрезка . Если , то является корнем уравнения, если нет, то далее исследуем значение функции на концах отрезков и и тот из них, на концах которого принимает значения разных знаков, содержит искомый корень и поэтому принимается в качестве нового отрезка. Таким образом, если функция меняет значение на отрезке , то переменная a не изменяется, переменная b примет значение , а переменная установится в середине нового отрезка. Этот укороченный отрезок вновь делится пополам и цикл вычислений повторяется. Итерационный процесс прекращается, если , где - текущее значение корня, а е - заданная точность.

2.2 Листинг программы

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, TeEngine, Series, ExtCtrls, TeeProcs, Chart, Grids,

Buttons, BubbleCh,Math;

type

TKovalenko_Form1 = class(TForm)

Label1: TLabel;

Kovalenko_BitBtn1: TBitBtn;

Kovalenko_Edit2: TEdit;

Label3: TLabel;

Kovalenko_Button1: TButton;

Image1: TImage;

Kovalenko_Chart1: TChart;

Series1: TLineSeries;

Series2: TPointSeries;

procedure Kovalenko_Button1Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Kovalenko_Form1: TKovalenko_Form1;

implementation

Function f(x:real):real;

begin

f:=sin(ln(x))-cos(ln(x))+2*(ln(x));

end;

{$R *.dfm}

procedure TKovalenko_Form1.Kovalenko_Button1Click(Sender: TObject);

const e=0.00001;a=1;b=3;

var ax,bx,C,i:real;

begin

C:=(a+b)/2;

ax:=a;bx:=b;

while abs(F(c))>e do

begin

if F(c)=0 then

Kovalenko_Edit2.Text:=FloatToStr(c)

else

begin

if (F(ax))*(f(c))<0 then

begin

bx:=c;

C:=(ax+bx)/2;

end;

if (F(c))*(f(bx))<0 then

begin

ax:=c;

C:=(ax+bx)/2;

end;

end;

Kovalenko_Chart1.SeriesList.Series[1].AddXY(c,F(c),' ',clblue);

end;

Kovalenko_Chart1.SeriesList.Series[1].AddXY(ax,F(ax),' ',clyellow);

Kovalenko_Chart1.SeriesList.Series[1].AddXY(bx,F(bx),' ',clyellow);

Kovalenko_Edit2.Text:=FloatToStr(c);

i:=a;

while i<b do

begin

i:=i+0.01;

Kovalenko_Chart1.SeriesList.Series[0].AddXY(i,f(i), ' ',clRED);

end;

2.3 Блок-схема

Размещено на http://www.allbest.ru/

2.4 Результаты

Рисунок 2

Уравнение: Sin(ln(x))-Cos(ln(x))+2ln(x)

Корни уравнения: 1.3748779Вывод: метод биссекций всегда даёт приближения к действительному значения корня С с разных концов.Комбинация двух методов биссекций и иттераций, значительно быстрей приводит к вычислению корня С с заданной точностью.

3. Аппроксимация функций методом наименьших квадратов

3.1 Краткие теоретические сведенья

1. По известным значениям и , , где - порядок аппроксимирующего уравнения (в данной задаче , где количество экспериментальных точек - 6 или 7), в цикле вычисляют , ,, предварительно (до открытия цикла) определив начальное значение .

2. Вычисляют , .

3. Решают систему уравнений , где B - квадратная матрица коэффициентов, d - вектор правых частей уравнений, a - искомый вектор коэффициентов аппроксимирующего уравнения . Решение системы уравнений осуществляется методом Гаусса.

4. Строят в одной системе координат аппроксимирующую функцию и экспериментальные точки.

3.2 Листинг программы

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, TeEngine, Series, ExtCtrls, TeeProcs, Chart, StdCtrls, Buttons,

Grids,Math, jpeg;

type

TKovalenko_Form1 = class(TForm)

Kovalenko_Button1: TButton;

Kovalenko_Chart1: TChart;

Series1: TLineSeries;

Kovalenko_BitBtn1: TBitBtn;

Series2: TPointSeries;

Kovalenko_StringGrid1: TStringGrid;

Kovalenko_StringGrid2: TStringGrid;

Grehov_Label4: TLabel;

Image1: TImage;

RadioButton1: TRadioButton;

RadioButton2: TRadioButton;

RadioButton3: TRadioButton;

RadioButton4: TRadioButton;

RadioButton5: TRadioButton;

RadioButton6: TRadioButton;

procedure Kovalenko_Button1Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

type matr=array[1..7,1..7] of real;

type mass=array[1..7] of real;

var

Kovalenko_Form1: TKovalenko_Form1;

B,a,c:matr;X,Y,d,YY,XX:mass;

i,j,k,n,m:integer;

s,q,f:real;

implementation

{$R *.dfm}

procedure TKovalenko_Form1.Kovalenko_Button1Click(Sender: TObject);

begin

Kovalenko_Chart1.Visible:=true;

Kovalenko_StringGrid2.Visible:=true;

n:=7;

for i:=1 to m+1 do

YY[i]:=0; d[i]:=0;XX[I]:=0;

s:=0;q:=0;f:=0;

x[1]:=0.5; y[1]:=-5.5;

x[2]:=1; y[2]:=0.55;

x[3]:=1.5; y[3]:=-10;

x[4]:=2; y[4]:=11.5;

x[5]:=2.5; y[5]:=9.5;

x[6]:=3; y[6]:=-10.2;

x[7]:=3.5; y[7]:=11.5;

for j:=1 to 7do

begin

Kovalenko_Chart1.SeriesList.Series[1].AddXY(x[j],y[j],' ',clyellow);

end;

if RadioButton1.Checked then m:=1;

if RadioButton2.Checked then m:=2;

if RadioButton3.Checked then m:=3;

if RadioButton4.Checked then m:=4;

if RadioButton5.Checked then m:=5;

if RadioButton6.Checked then m:=6;

a[1,1]:=n;

for i:=1 to m+1 do

for k:=1 to m+1 do

begin

s:=0;

for j:=1 to n do

s:=s+power(x[j],(i+k-2));

a[i,k]:=s;

end;

for i:=1 to m+1 do

begin

s:=0;

for j:=1 to n do

s:=s+((power(x[j],i-1))*y[j]);

d[i]:=s;

end;

{Метод Гаусса}

for i:=1 to (m+1) do

begin

b[i,i]:=1;

b[1,i]:=a[1,i]/a[1,1];

c[i,1]:=a[i,1];

end;

YY[1]:=d[1]/a[1,1];

for i:=2 to (m+1) do

begin

for k:=i to (m+1) do

begin

s:=0;

for j:=1 to i-1 do

s:=s+c[k,j]*b[j,i];

c[k,i]:=a[k,i]-s;

end;

for k:=i+1 to (m+1) do

begin

s:=0;

for j:=1 to i-1 do

s:=s+c[i,j]*b[j,k];

b[i,k]:=(a[i,k]- s)/c[i,i];

end;

end;

for i:=2 to (m+1) do

begin

for j:=1 to i-1 do

s:=s+c[i,j]*YY[j];

YY[i]:=(d[i]-s)/c[i,i];

end;

XX[n]:=YY[n];

for i:=1 to n-1 do

begin

s:=0;

for j:=n-i+1 to n do

s:=s+b[n-i,j]*XX[j];

XX[n-i]:=YY[n-i]-s;

end;

for i:=1 to m+1 do

begin

Kovalenko_StringGrid1.Cells[Kovalenko_StringGrid1.colCount-

1,0]:='a['+FloatToStrF(i,ffGeneral,6,6)+']';

Kovalenko_StringGrid1.Cells[Kovalenko_StringGrid1.colCount-

1,1]:=FloatToStrF(XX[i],ffGeneral,6,6);

Kovalenko_StringGrid1.colCount:=Kovalenko_StringGrid1.colCount+1;

end;

Kovalenko_stringGrid2.Cells[0,0]:='X';

Kovalenko_stringGrid2.Cells[0,1]:='f(x)'; q:=x[1];

Kovalenko_chart1.SeriesList.Series[0].Clear;

for k:=1 to 1500 do

begin

for i:=1 to (m+1) do

s:=s+XX[i]*(power(q,i-1)); {y}

f:=s; q:=q+0.002;

Kovalenko_chart1.SeriesList.Series[0].AddXY(q,s,'',clRED);

Kovalenko_StringGrid2.Cells[Kovalenko_StringGrid2.colCount-

1,0]:=FloatToStrF(q,ffGeneral,6,6);

Kovalenko_StringGrid2.Cells[Kovalenko_StringGrid2.colCount-

1,1]:=FloatToStrF(f,ffGeneral,6,6);

Kovalenko_StringGrid2.ColCount:= Kovalenko_StringGrid2.ColCount+1;

end;

end;

end.

3.3 Блок-схема

3.4 Результаты

Рисунок 3

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Стартовые точки аппроксимирующей функции:

0,5;5.5, 1;0.55, 1.5;-1, 2;11.5, 2.5;9.5, 3;-10.2, 3.5;1.5.

Аппроксимирующие значения функции:

-520.15, 2281.1, -3643.52, 2768.05, -1075.68, 206.173, -15.4311;

Вывод: при расчете данным методом достигается высокая степень точности для аппроксимации различных функций. Метод может применяться для решения инженерных задач всевозможных видов.

аппроксимация золотой сечение градиентный

4. Одномерная оптимизация многоэкстремальных функций. Метод золотого сечения
4.1 Краткие теоретические сведенья
Если на заданном интервале функция не унимодальная, то при использовании этого метода вначале исходный интервал существования функции сужают до интервала унимодальности (существования одного экстремума). Золотым сечением отрезка называется деление отрезка на две неравные части так, отношение длины всего отрезка к длине большей его части равно отношению длины большей части к меньшей .
Очевидно, что существует два варианта разбиения:
С учетом использования счетчика итераций в точке
, .
Алгоритм реализации метода:
1. Принимают базовые значения интервала унимодальности , , счетчик .
2. Задают значения точности .
3. Вычисляют вспомогательные значения
,
4. Если , то , , . Иначе , , .
5. Вычисляют длину сужаемого интервала .
6. Если , то оптимальной точкой будет . Иначе вычисления продолжают, начиная с пункта 3.

На каждой итерации считаем по одному значению функции, поскольку одно уже посчитано ранее и представляет собой точку золотого сечения.

4.2 Листинг программы

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, TeEngine, Series, ExtCtrls, TeeProcs, Chart, StdCtrls, Buttons,

Grids,Math, jpeg;

type

TKovalenko_Form1 = class(TForm)

Kovalenko_Button1: TButton;

Kovalenko_Chart1: TChart;

Series1: TLineSeries;

Kovalenko_BitBtn1: TBitBtn;

Series2: TPointSeries;

Kovalenko_StringGrid1: TStringGrid;

Kovalenko_StringGrid2: TStringGrid;

Kovalenko__Label4: TLabel;

Image1: TImage;

RadioButton1: TRadioButton;

RadioButton2: TRadioButton;

RadioButton3: TRadioButton;

RadioButton4: TRadioButton;

RadioButton5: TRadioButton;

RadioButton6: TRadioButton;

Series3: TPointSeries;

Label1: TLabel;

Label2: TLabel;

Edit1: TEdit;

Edit2: TEdit;

Label3: TLabel;

procedure Kovalenko_Button1Click(Sender: TObject);

procedure Kovalenko_BitBtn1Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

type matr=array[1..7,1..7] of real;

type mass=array[1..7] of real;

var

Kovalenko_Form1: TKovalenko_Form1;

B,a,c:matr;X,Y,d,YY,XX:mass;

i,j,k,n,m:integer;

s,q,f,L,X1,X2,XXX,YYY,G1,G2,ax,bx:real;

implementation

{$R *.dfm}

procedure TKovalenko_Form1.Kovalenko_Button1Click(Sender: TObject);

const r=0.000001; a0=1; b0=2;

begin

Kovalenko_Chart1.Visible:=true;

Kovalenko_StringGrid2.Visible:=true;

n:=7;

for i:=1 to m+1 do

YY[i]:=0; d[i]:=0;XX[I]:=0;

s:=0;q:=0;f:=0;

x[1]:=0.5; y[1]:=-5.5;

x[2]:=1; y[2]:=0.55;

x[3]:=1.5; y[3]:=-10;

x[4]:=2; y[4]:=11.5;

x[5]:=2.5; y[5]:=9.5;

x[6]:=3; y[6]:=-10.2;

x[7]:=3.5; y[7]:=11.5;

for j:=1 to 7 do

begin

Kovalenko_Chart1.SeriesList.Series[1].AddXY(x[j],y[j],' ',clyellow);

end;

if RadioButton1.Checked then m:=1;

if RadioButton2.Checked then m:=2;

if RadioButton3.Checked then m:=3;

if RadioButton4.Checked then m:=4;

if RadioButton5.Checked then m:=5;

if RadioButton6.Checked then m:=6;

a[1,1]:=n;

for i:=1 to m+1 do

for k:=1 to m+1 do

begin

s:=0;

for j:=1 to n do

s:=s+power(x[j],(i+k-2));

a[i,k]:=s;

end;

for i:=1 to m+1 do

begin

s:=0;

for j:=1 to n do

s:=s+((power(x[j],i-1))*y[j]);

d[i]:=s;

end;

{Метод Гаусса}

for i:=1 to (m+1) do

begin

b[i,i]:=1;

b[1,i]:=a[1,i]/a[1,1];

c[i,1]:=a[i,1];

end;

YY[1]:=d[1]/a[1,1];

for i:=2 to (m+1) do

begin

for k:=i to (m+1) do

begin

s:=0;

for j:=1 to i-1 do

s:=s+c[k,j]*b[j,i];

c[k,i]:=a[k,i]-s;

end;

for k:=i+1 to (m+1) do

begin

s:=0;

for j:=1 to i-1 do

s:=s+c[i,j]*b[j,k];

b[i,k]:=(a[i,k]- s)/c[i,i];

end;

end;

for i:=2 to (m+1) do

begin

s:=0;

for j:=1 to i-1 do

s:=s+c[i,j]*YY[j];

YY[i]:=(d[i]-s)/c[i,i];

end;

XX[n]:=YY[n];

for i:=1 to n-1 do

begin

s:=0;

for j:=n-i+1 to n do

s:=s+b[n-i,j]*XX[j];

XX[n-i]:=YY[n-i]-s;

end;

for i:=1 to m+1 do

begin

Kovalenko_StringGrid1.Cells[Kovalenko_StringGrid1.colCount-

1,0]:='a['+FloatToStrF(i,ffGeneral,6,6)+']';

Kovalenko_StringGrid1.Cells[Kovalenko_StringGrid1.colCount-

1,1]:=FloatToStrF(XX[i],ffGeneral,6,6);

Kovalenko_StringGrid1.colCount:=Kovalenko_StringGrid1.colCount+1;

end;

Kovalenko_stringGrid2.Cells[0,0]:='X';

Kovalenko_stringGrid2.Cells[0,1]:='f(x)';

q:=x[1];

Kovalenko_chart1.SeriesList.Series[0].Clear;

for k:=1 to 1500 do

begin

s:=0;

for i:=1 to (m+1) do

s:=s+XX[i]*(power(q,i-1)); f:=s;

q:=q+0.002;

Kovalenko_chart1.SeriesList.Series[0].AddXY(q,s,'',clRED);

Kovalenko_StringGrid2.Cells[Kovalenko_StringGrid2.colCount-

1,0]:=FloatToStrF(q,ffGeneral,6,6);

Kovalenko_StringGrid2.Cells[Kovalenko_StringGrid2.colCount-

1,1]:=FloatToStrF(f,ffGeneral,6,6);

Kovalenko_StringGrid2.ColCount:= Kovalenko_StringGrid2.ColCount+1;

end;

{Метод золотого сечения}

ax:=1;bx:=2; X1:=0;X2:=0;

while abs(bx-ax)>=r do

begin

X1:=ax+0.382*(bx-ax);

X2:=ax+0.618*(bx-ax);

G1:=0;s:=0;

for i:=1 to n do

s:=s+XX[i]*(power(X1,i-1)); G1:=s;

G2:=0;s:=0;

for i:=1 to n do

s:=s+XX[i]*(power(X2,i-1)); G2:=s;

if (G1)<=(G2) then

begin

ax:=ax;

bx:=X2;

end else

begin

ax:=X1;

bx:=bx;

end;

end;

XXX:=(ax+bx)/2;

YYY:=0;

for i:=1 to n do

YYY:=YYY+XX[i]*(power(XXX,i-1));

Edit1.Text:= FloatToStr(XXX);

Edit2.Text:= FloatToStr(YYY);

Kovalenko_chart1.SeriesList.Series[2].AddXY(XXX,YYY);

end;

procedure TKovalenko_Form1.Kovalenko_BitBtn1Click(Sender: TObject);

begin

Application.Terminate;

end;

end

4.3 Блок-схема

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

4.4 Результаты

Рисунок 4. Минимальное значение функции на интервале [1; 2] -12.324

Вывод:

Метод золотого сечения является древним методом деления отрезка. Впервые метод был рассмотрен Евклидом. Тогда этим методом делили окружность на равные пять частей для построения пятиконечной звезды. Сегодня этот метод применяется на практике для оптимизации производственных систем и объектов.

5. Многомерная оптимизация градиентным методом с переменным шагом
5.1 Краткие теоретические сведения
Все методы многомерной оптимизации строят последовательность точек ,,…таких, что ,т.е. чтобы функция убывала. Перед началом расчетов необходимо задать начальную точку, остальные будут вычислены автоматически. Направление движения при поиске точек выбирается по антиградиенту функции - вектору, показывающему направление наиболее быстрого убывания функции. Точки вычисляются по формуле:
,
где - предыдущее значение; - следующее значение; - переменная величина шага; - значение градиента в точке ; - длина вектора-градиента.
Значение градиента вычисляется по формуле:
,
где ,
;
;
- достаточно малая положительная величина, используемая для приближенного вычисления градиента.
5.2 Листинг программы
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, TeeProcs, TeEngine, Chart, Buttons, Series;
type
TKovalenko_Form1 = class(TForm)
Kovalenko_Image1: TImage;
Kovalenko_Memo1: TMemo;
Kovalenko_Button1: TButton;
Kovalenko_BitBtn1: TBitBtn;
Kovalenko_Edit1: TEdit;
Kovalenko_Chart1: TChart;
Series1: TLineSeries;
Series2: TPointSeries;
Series3: TPointSeries;
Kovalenko_Chart3: TChart;
Series10: TLineSeries;
Series11: TLineSeries;
Series12: TLineSeries;
Series13: TLineSeries;
Series14: TLineSeries;
Series15: TPointSeries;
RadioButton1: TRadioButton;
RadioButton2: TRadioButton;
RadioButton3: TRadioButton;
Kovalenko_Chart2: TChart;
Series4: TLineSeries;
Series5: TLineSeries;
Series6: TLineSeries;
Series7: TLineSeries;
Series8: TLineSeries;
Series9: TPointSeries;
procedure Kovalenko_Button1Click(Sender: TObject);
procedure RadioButton1Click(Sender: TObject);
procedure RadioButton2Click(Sender: TObject);
procedure RadioButton3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
const n=2;e=0.0001;
type mass=array[1..2] of real;
var XK,G:mass;
Kovalenko_Form1: TKovalenko_Form1;
implementation
{$R *.dfm}
function f(x:mass):real;
begin
f:=exp(x[1])+sqr(x[1])+sqr(x[2]);
end;
procedure gradient;
var i:integer;fp,fo:real;
begin
for i:=1 to N do
begin
XK[i]:=XK[i]+E;fp:=f(XK);
XK[i]:=XK[i]-2*E;fo:=f(XK);
XK[i]:=XK[i]+E;
G[i]:=(fp-fo)/(2*E);
end;
end;
procedure TKovalenko_Form1.Kovalenko_Button1Click(Sender: TObject);
var gamma,Y,OD,xx1,xx2,yy:real;i,k:integer;XX:mass;
begin
gamma:=1; ;k:=0;
XK[1]:=-2;XK[2]:=2
Kovalenko_Memo1.Lines.Add('X[1]='+FloatToStr(XK[1]));
Kovalenko_Memo1.Lines.Add('X[2]='+FloatToStr(XK[2]));
Kovalenko_Chart1.SeriesList.Series[0].AddXY(XK[1],XK[2]);
while gamma>E do
begin
gradient;
OD:=0;
for i:=1 to N do
OD:=OD+sqr(G[i]);
OD:=sqrt(OD);
Y:=F(XK);
for i:=1 to N do
begin
XK[i]:=XK[i]-gamma*G[i]/OD;
Kovalenko_Memo1.Lines.Add('X['+IntToStr(i)+']='+FloatToStr(XK[i]));
end;
Kovalenko_Memo1.Lines.Add('Предыдущее f='+FloatToStr(Y));
Kovalenko_Memo1.Lines.Add('Новое f='+FloatToStr(F(XK)));
Kovalenko_Memo1.Lines.Add('Шаг gamma='+FloatToStr(gamma));
Kovalenko_Chart1.SeriesList.Series[0].AddXY(XK[1],XK[2]);
if f(XK)<Y then k:=k+1
else
begin
for i:=1 to N do
XK[i]:=XK[i]+gamma*G[i]/OD;
gamma:=gamma/2;
kovalenko_Memo1.Lines.Add('Уменьшение шага
gamma='+FloatToStr(gamma));
k:=k+1;
end;
end;
Kovalenko_Chart2.SeriesList.Series[5].AddXY(XK[1],Y);
Kovalenko_Chart3.SeriesList.Series[5].AddXY(XK[2],Y);
Kovalenko_Chart1.SeriesList.Series[1].AddXY(XK[1],XK[2]);
Kovalenko_Edit1.Text:='';
Kovalenko_Edit1.Text:='X1='+FloatToStr(XK[1])+'
'+'X2='+FloatToStr(XK[2])+' '+Kovalenko_Edit1.Text+'Y='+FloatToStr(Y);
XK[1]:=-0.5;XK[2]:=0.2;
for k:=0 to 4 do
for i:=0 to 400 do
begin
xx1:=-2*XK[1]+0.01*XK[1]*i;
XX[1]:=xx1;XX[2]:=(k-2)*XK[2];
Kovalenko_Chart2.SeriesList.Series[k].AddXY(xx1,f(XX));
end;
for k:=0 to 4 do
for i:=0 to 400 do
begin
xx2:=-8*XK[2]+0.01*XK[2]*i;
XX[1]:=(k-2)*XK[1];XX[2]:=xx2;
Kovalenko_Chart3.SeriesList.Series[k].AddXY(xx2,f(XX));
end;
end;
procedure TKovalenko_Form1.RadioButton1Click(Sender: TObject);
begin
Kovalenko_Chart1.Visible:=True;
Kovalenko_Chart2.Visible:=False;
Kovalenko_Chart3.Visible:=False;
end;
procedure TKovalenko_Form1.RadioButton2Click(Sender: TObject);
begin
Kovalenko_Chart2.Visible:=True;
Kovalenko_Chart1.Visible:=False;
Kovalenko_Chart3.Visible:=False;
end;
procedure TKovalenko_Form1.RadioButton3Click(Sender: TObject);
begin
Kovalenko_Chart3.Visible:=True;
Kovalenko_Chart1.Visible:=False;
Kovalenko_Chart2.Visible:=False;
end;
end.
5.3 Блок-схема

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

5.4 Результаты

Рисунок 5.1

Рисунок 5.2

Рисунок 5.3

Исходная функция:

exp(x1)+x22 +x12

Оптимальные точки:

X1=-0.3517 X2=1.7918 Y=0.8271

Вывод:

Данная задача основана на следующих свойствах градиента скалярного поля:

1) направление в котором производная скалярного поля имеет наибольшее выражение совпадает с направлением градиентом скалярного поля.

2) Наибольшее значение производной скалярного поля в точке М0 равна модулю градиента скалярного поля в этой точке.

Размещено на Allbest.ru


Подобные документы

  • Создание программы в среде программирования MatLab для решения задачи одномерной оптимизации (нахождение минимума и максимума заданных функций) методом золотого сечения, построение блок-схемы алгоритма и графическое изображение исследованных функций.

    реферат [112,0 K], добавлен 14.06.2010

  • Построение эмпирических формул методом наименьших квадратов. Линеаризация экспоненциальной зависимости. Элементы теории корреляции. Расчет коэффициентов аппроксимации, детерминированности в Microsoft Excel. Построение графиков функций, линии тренда.

    курсовая работа [590,9 K], добавлен 10.04.2014

  • Отделение корней методом простых интеграций. Дифференцирование и аппроксимация зависимостей методом наименьших квадратов. Решение нелинейного уравнения вида f(x)=0 методом Ньютона. Решение системы линейных уравнений методом Зейделя и методом итераций.

    курсовая работа [990,8 K], добавлен 23.10.2011

  • Построение эмпирических формул методом наименьших квадратов. Линеаризация экспоненциальной зависимости. Элементы теории корреляции. Расчет аппроксимаций в табличном процессоре Excel. Описание программы на языке Turbo Pascal; анализ результатов ее работы.

    курсовая работа [390,2 K], добавлен 02.01.2015

  • Одномерная оптимизация, метод "золотого сечения". Условная нелинейная оптимизация, применение теоремы Джона-Куна-Таккера. Исследование функции на выпуклость и овражность. Безусловная оптимизация неквадратичной функции, метод Дэвидона-Флетчера-Пауэлла.

    курсовая работа [2,1 M], добавлен 12.01.2013

  • Теоретические основы метода оптимизации. Разработка компьютерной системы для решения задач многомерной безусловной оптимизации методом Хука-Дживса с минимизацией по направлению. Описание структуры программы и результаты ее отладки на контрольных примерах.

    курсовая работа [595,4 K], добавлен 13.01.2014

  • Традиционные языки высокоуровневого программирования. Обзор методов интегрирования. Оценка апостериорной погрешности. Численное решение систем линейных уравнений. Аппроксимация функций методом наименьших квадратов. Решение дифференциальных уравнений.

    методичка [6,4 M], добавлен 23.09.2010

  • Разработка алгоритма аппроксимации данных методом наименьших квадратов. Средства реализации, среда программирования Delphi. Физическая модель. Алгоритм решения. Графическое представление результатов. Коэффициенты полинома (обратный ход метода Гаусса).

    курсовая работа [473,6 K], добавлен 09.02.2015

  • Системы линейных алгебраических уравнений. Код программы для решения систем линейных алгебраических уравнений. Математические и алгоритмические основы решения задачи методом Гаусса. Программная реализация решения. Алгоритмы запоминания коэффициентов.

    лабораторная работа [23,5 K], добавлен 23.09.2014

  • Матричная форма записи системы линейных уравнений, последовательность ее решения методом исключений Гаусса. Алгоритмы прямого хода и запоминания коэффициентов. Решение задачи о сглаживании экспериментальных данных с помощью метода наименьших квадратов.

    курсовая работа [610,7 K], добавлен 25.06.2012

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.