Смекни!
smekni.com

Минимизация функций нескольких переменных. Метод спуска (стр. 3 из 4)

x1 x2 R
0 -0,5 -1 7,375
1 0,1750 1,4 -2,1996
2 1,0473 0,9200 -3,9804
3 0,9600 1,016 -3,9948
4 1,0305 0,9968 -3,9972
5 0,9747 0,0006 -3,9981
6 1,0196 0,9999 -3,9988
7 0,9839 1,0000 -3,9992
8 1,0126 1,0000 -3,9995
9 0,9898 1,0000 -3,9997
10 1,0081 1,0000 -39998
11 0,9935 1,0000 -3,9999
12 1,0052 1,0000 -3,9999
13 0,9958 1.0000 -3,9999
14 1,0033 1,0000 -4,0000
15 0,9973 1,0000 -4,0000
16 1,0021 1,0000 -4,0000
17 0,9983 1,0000 -4,0000
18 1,0013 1,0000 -4,0000

h=1; x1 =-0,5; x2=-1 ; x1нач=-2, x1кон=2, x2нач=-2, x2кон=2

x1 x2 R
0 -0,5 -1 7,375
1 0,6250 3 4,3692
2 1,5391 -1,0000 5,0283
3 0,5125 1 -3,4029
4 1,0655 1 -3,9869
5 0,9640 1 -3,9961
6 1,0170 1 -3,9991
7 0,9913 1,0000 -3,9998
8 1,0043 1 -3,9999
9 0,9978 1 -4,0000
10 1,0011 1 -4,0000

Заключение

Практика порождает все новые и новые задачи оптимизации, причем их сложность растет. Требуются новые математические модели и методы, которые учитывают наличие многих критериев, проводят глобальный поиск оптимума. Другими словами, жизнь заставляет развивать математический аппарат оптимизации.

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


Список используемой литературы

1. Корнеенко В. П. Методы оптимизации: Учебник / В. П. Корнеенко. – М.: Высш. шк., 2007.

2. Пантелеев А. В. Методы оптимизации в примерах и задачах: Учеб. пособие / А. В. Пантелеев, Т. А. Летова. – М.: Высш. шк., 2005.

3. Батищев Д. И. Оптимизация в САПР: Учебник / Д. И. Батищев, Я. Е. Львович, В. Н. Фролов. – Воронеж: Изд-во ВГУ, 1997.

4. Банди Б. Методы оптимизации. Вводный курс / Б. Банди. – М.: Радио и связь, 1988.

5. Реклейтис Г. Оптимизация в технике: в 2 кн. / Г. Реклейтис, А. Рейвиндран. – М.: Мир, 1986.


Приложение

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

#include <vcl.h>

#pragma hdrstop

#include "Math.hpp"

#include "math.h"

#include "Unit1.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

}

//---------------------------------------------------------------------------

int ii=0,n=0,s=0;

AnsiString Formula[3]={"U=A*x1^3+B*x2^2-C*x1-D*x2","U=x1^2+x1*x2+x2^2","U=X1^2+X2^2"};

int KolPer[3]={2,2,2};// массив в котором хранится кол-во перемен. для каждой ф-ии

bool DD=true,Diapozon=true; // если true то точка входит в диапозон иначе нет

double PeremenN[5]={0};//double *PeremenN =new double[n]; //нул.приб

double InterN[5]={0};//double *InterN =new double[n]; //нач

double InterK[5]={0};//double *InterK =new double[n]; //кон

double Param[4]={0}; //параметры

double T1[5]={0};//double *T1 =new double[n]; //tochka i -я

double T2[5]={0};//double *T2 =new double[n]; //tochka i+1 -я

double TempT[5]={0};//double *TempT =new double[n]; // временная tochka i+1 -я

double BB[5]={0};//double *BB= new double [n]; // BB - массивсизмененой i-ойточкойX[i]+g

double B[5]={0};//double *B= new double [n]; //B - массивсизмененой i-ойточкойX[i]-g

int g=0;

double ModG =0; //модульградиента

int ss=0,ind=0;

double **Tochki; // указатель на массив с точками приближения

//---------------------------------------------------------------------------

double TForm1::F1( double T[]) //Formula1 U=A*x1^3+B*x2^2-C*x1-D*x2

{ double U = 0;

U=IntPower(T[0],3)+2*IntPower(T[1],2)-3*T[0]-4*T[1];

return U; }

//---------------------------------------------------------------------------

double TForm1::F2( double T[]) //Formula2 U=x1^2+x1*x2+x2^2

{ double U = 0;

U = IntPower(T[0],2)+T[0]*T[1]+IntPower(T[1],2);

return U; }

//---------------------------------------------------------------------------

double TForm1::F3( double T[]) //Formula3 U=X1^2+X2^2

{ double U = 0;

U =T[0]*T[0]+T[1]*T[1]+1;

return U; }

//---------------------------------------------------------------------------

void TForm1::Tochka(double shag) // функциясчитаеткоординатыследующейточки

{ // n - количествопеременных

for (int i = 0; i < n; i++)

{

TempT[i]=T2[i]-shag*Gr(i);

//точка X[j+1]=точка X[j]- h козфшага *градиет grad R(X[j])

}

}

//---------------------------------------------------------------------------

double TForm1::Gr( int i) //gradient i-номерпеременной

{

double dR=0; // dR - градиентпо i

for (int j=0;j<n;j++) //BB,B==T1;

{

BB[j]=T2[j];

B[j]=T2[j];

}

BB[i]=T2[i]+ Param[1] ; // добавляемиотнимаемпробныйшаг

B[i]=T2[i]- Param[1] ; // к i-ойпеременной

switch (UD->Position) {

case 0: dR = (F1(BB)- F1(B))/(2*Param[1]) ; break;

case 1: dR = (F2(BB)-F2(B))/(2*Param[1]); break;

case 2: dR = (F3(BB)-F3(B))/(2*Param[1]); break;

}

return dR;

}

//--------------------------------------------------------------------------

void TForm1::Min()

{ // массив в котором

//double Tochki[1][5]; //хранится первое приближение

//double **Tochki; //создаеммассив Temp[ss][n]

Tochki = new double*[100];

for (int j = 0; j < 100; j++)

Tochki[j] = new double[3];

bool Minimum=false,Pogresh=false,shag=false;

double sh=Param[0];

for (int j=0;j<n;j++) //T1,T2,TempT=PeremenN;

{

T1[j]=PeremenN[j];

T2[j]=PeremenN[j];

TempT[j]=PeremenN[j];

Tochki[0][j]=PeremenN[j];

}

while ( Minimum == false ) // после выхода из цикла

{ // минимум в точке T2

shag=false;

// началоблока 2

while (shag == false)

{

double R=0;

Tochka(sh);

switch (UD->Position) {

case 0: R=F1(TempT)-F1(T1) ; break;

case 1: R=F2(TempT)-F2(T1); break;

case 2: R=F3(TempT)-F3(T1); break; }

if (R > 0) // шаг большой то

{ // уменьшаем его в 2 раза

sh= sh/2;

}

else

{ shag =true; }

}

// конец блока 2

// Проверяем входит ли точка в указанный диапозон

// если нет то считаем предыдущую точку минимальной

if (DD==true )

{

for ( int i=0; i<n; i++)

{

if ( InterN[i] > TempT[i])

{

Diapozon=false;

Minimum = true;

}

if (InterK[i] < TempT[i])

{

Diapozon=false;

Minimum = true;

}

}

}

for (int j=0;j<n;j++)

{

T1[j]=T2[j]; //T1=T2

T2[j]=TempT[j]; //T2=TempT

}

// началоблока 3

ModG=0; //- модульградиента

for (int i = 0; i < n; i++)

{

ModG+= Gr(i)*Gr(i);

}

ModG=sqrt(ModG);

if ( ModG < Param[2]) // /gradient/ < e где e-погрешность

{ Minimum=true; } // /gradient/ - модульградиента

// конецблока 3

ss++;

if (Param[3] != -1 )

if (ss == Param[3])

Minimum=true;

// началоблока 4

if ( ss > 99 )

{ MessageDlg("Предел превышен ...точек более 100 ..измените шаг",mtWarning,

TMsgDlgButtons() << mbOK , 0);break;}

if(Diapozon==true)

{

for (int j = 0; j < n; j++)

Tochki[ss][j] = T2[j];

}

}

for (int j = 0; j <= ss; j++)

{

for (int i = 0; i < n; i++)

TempT[i]= Tochki[j][i];

switch (UD->Position) {

case 0: Tochki[j][2] = F1(TempT) ; break;

case 1: Tochki[j][2] = F2(TempT); break;

case 2: Tochki[j][2] = F3(TempT); break; }

}

//

/* double **Temp; //создаеммассив Temp[ss][n]

Temp = new double*[ss];

for (int j = 0; j < ss; j++)

Temp[j] = new double[n];

//

for (int i = 0; i < ss; i++)

for (int j = 0; j < n; j++)

Temp[i][j]=Tochki[i][j];

//

//for (int i = 0; i < ss; i++) //удаляеммассив Tochki[ss][n]

//delete[] Tochki[i];

//delete Tochki;

//

int mm=ss+1;

double **Tochki; //создаеммассив Tochki[ss+1][n]

Tochki = new double*[mm];

for (int j = 0; j < mm; j++)

Tochki[j] = new double[n];

//

for (int i = 0; i < mm-1; i++)

for (int j = 0; j < n; j++)

Tochki[i][j] = Temp[i][j];

//

for (int j = 0; j < n; j++)

Tochki[ss][j] = T2[j];

//

//for (int i = 0; i < ss; i++) //удаляеммассив Temp[ss][n]

//delete[] Temp[i];

//delete [] Temp;

}

// конецблока 4 */

}

//--------------------------------------------------------------------------

void __fastcall TForm1::UDClick(TObject *Sender, TUDBtnType Button)

{

Edit2->Text=Formula[UD->Position];

}

//---------------------------------------------------------------------------

void __fastcall TForm1::StartClick(TObject *Sender)

{

Panel1->Visible=false;

Edit2->Text=Formula[UD->Position];

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Sh1NextClick(TObject *Sender)

{

ii++;

PageControl1->ActivePageIndex=ii;

g=1;

switch (UD->Position) {

case 0: Kol->Caption=KolPer[0];break;

case 1: Kol->Caption=KolPer[1];break;

case 2: Kol->Caption=KolPer[2];break;

}

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Sh2NextClick(TObject *Sender)

{

ii++;

PageControl1->ActivePageIndex=ii;

g=3;

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Sh3BackClick(TObject *Sender)

{

ii--;

PageControl1->ActivePageIndex=ii;

Panel5->Visible=false;

Sh2Next->Visible=false;

g=2;

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Sh2BackClick(TObject *Sender)

{

if (g ==1 )

{

ii--;

PageControl1->ActivePageIndex=ii;

Panel2->Visible=true;

Panel3->Visible=false;

Panel4->Visible=false;

Panel5->Visible=false;

}

if (g == 2)

{

Panel3->Visible=true;

Panel4->Visible=false;

Panel5->Visible=false;

n=KolPer[UD->Position];

Per->Caption="X1 =";

s=0;

g=1;

}

if (g == 3)

{

Panel5->Visible=false;

Sh2Next->Visible=false;

g=2;

}

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)

{

Panel3->Visible=true;

n=KolPer[UD->Position];

Per->Caption="X1 =";

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)

{

PeremenN[s]=StrToFloat(Edit4->Text); //нул.приб

InterN[s]=StrToFloat(Edit3->Text); //нач

InterK[s]=StrToFloat(Edit5->Text); //кон

s++;

Per->Caption="X"+ IntToStr(s+1)+"=";

g=2;

if (s == n)

{Panel4->Visible=true;g=2;}

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button3Click(TObject *Sender)

{

Param[0]=StrToFloat(Edit6->Text); //коэ.шага

Param[1]=StrToFloat(Edit7->Text); // проб.шаг

Param[2]=StrToFloat(Edit8->Text); // погр.

if(CB1->Checked == true )

{Param[3]=StrToFloat(NT->Text); }

else

{Param[3]=-1;}

Sh2Next->Visible=true;

Panel5->Visible=true;

g=3;

}

//---------------------------------------------------------------------------

void __fastcall TForm1::PuskClick(TObject *Sender)

{

ss=0; //количество точек которых получилось

Diapozon=true;

Min();

if (Diapozon==false)

ss=ss-1;

Sh3Back->Visible=true;

Panel6->Visible=true;

Series1->Clear();

for(int i = 0; i <ss; i++)

{

Series1->AddXY(i,Tochki[i][2],"",clBlue);

Nomer->Items->Add(i);

}

Nomer->Items->Add(ss);

//Nomer->Items->St

//ListT->Items->Add(123);

//if ( Diapozon=true )

//{ Itog->Caption="Точкаминимумавуказанномдиапозоне "; }

}

//---------------------------------------------------------------------------

//---------------------------------------------------------------------------

void __fastcall TForm1::CB1Click(TObject *Sender)

{

if(CB1->Checked == true )

NT->Visible=true;

if(CB1->Checked == false )

NT->Visible=false;

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button8Click(TObject *Sender)

{

Panel6->Visible=false;

ListT->Items->Clear();

Nomer->Items->Clear();

Nomer->ItemIndex=-1;

}

//---------------------------------------------------------------------------

void __fastcall TForm1::NomerChange(TObject *Sender)

{

int ind=Nomer->ItemIndex;

ListT->Items->Clear();

for (int i=0;i<n;i++)

ListT->Items->Add(Tochki[ind][i]);

ListT->Items->Add(Tochki[ind][2]);

if (ind == ss)