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

Автор: Пользователь скрыл имя, 01 Декабря 2010 в 00:31, реферат

Краткое описание

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

Оглавление

1. Методы спуска (Общая схема) _________________________ 3
2. Метод покоординатного спуска._____________________ 4
3. Метод градиентного спуска.________________________________ 7
4. Метод наискорейшего спуска.______________________________ 9
5. Описание программы._____________________________________10
6. Общая блок схема.________________________________________ 11
7. Руководство для пользования.______________________________12
8. Приложение А (Листинг программы)__________________________13
IX. Приложение B
(Исследование функции U=A*x1^3+B*x2^2-C*x1-D*x2 (изменение шага))_____ 25

Файлы: 1 файл

Методы спуска.doc

— 248.00 Кб (Скачать)

    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;

           }

    }

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