Математические методы оптимизации производственных систем и объектов
Решения алгебраических уравнений методом выделения корней. Аппроксимация функций методом наименьших квадратов; дихотомия, бисекция. Одномерная оптимизация многоэкстремальных функций; метод золотого сечения. Многомерная оптимизация градиентным методом.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 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