Методы нахождения условного и безусловного экстремума

Автор работы: Пользователь скрыл имя, 10 Марта 2012 в 19:02, курсовая работа

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

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

Содержание работы

. Задание на курсовую работу
2. Реферат
3. Введение
4. Нахождение безусловного экстремума
4.1 Нахождение стационарной точки
4.2 Метод равномерного симплекса
4.3 Метод Хука-Дживса
4.4 Метод сопряженных направлений Пауэлла
4.5 Метод Коши
4.6 Метод Ньютона
4.7 Метод сопряженных градиентов
4.8 Квазиньютоновский метод
5. Нахождение условного экстремума
5.1 Метод штрафных функций (квадратичный штраф)
6. Заключение
7. Приложение 1. Листинг программы
8. Список литературы

Содержимое работы - 1 файл

ОСНОВА ОСНОВ.DOC

— 1.47 Мб (Скачать файл)

       FTable->Tablica->Cells[1][i]=h; i++;

     } x-=htemp; Points->Add("-");

 

     if (f<fun(x,y+h)) htemp=-h; else htemp=h;

     Points->Add(x); Points->Add(y);

     FTable->Tablica->RowCount++;

     FTable->Tablica->Cells[1][i]=h; i++;

     f1=fun(x,y+=htemp);

     Points->Add(x); Points->Add(y);

     FTable->Tablica->RowCount++;

     FTable->Tablica->Cells[1][i]=h; i++;

     if (f1>f) h/=k;

     while (f1<f)

     { f=f1;

       y+=htemp; f1=fun(x,y); Points->Add(x); Points->Add(y);

       FTable->Tablica->RowCount++;

       FTable->Tablica->Cells[1][i]=h; i++;

     } y-=htemp; Points->Add("-");

   }

   FTable->Tablica->RowCount--;

   while (Points->Strings[Points->Count-1]=="-") Points->Delete(Points->Count-1);

   }

   if (!Step->Checked) Timer->Enabled=true;

   else TimerTimer(Sender);

}

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

 

double fun(double x,double y)

{  double a=StrToFloat(GaussZeidel->Waa->Text),

          b=StrToFloat(GaussZeidel->Wbb->Text),

          A=StrToFloat(GaussZeidel->WA-> Text),

          B=StrToFloat(GaussZeidel->WB->Text),

          C=StrToFloat(GaussZeidel->WC->Text);//задаваемые параметры функции

  return A*(x-a)*(x-a)+B*(y-b)*(y-b)+C*x*y;

}

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

 

void __fastcall TGaussZeidel::WAKeyPress(TObject *Sender, char &Key)

{

  AnsiString s=((TEdit *)Sender)->Text;

  s.Delete(((TEdit *)Sender)->SelStart+1,((TEdit *)Sender)->SelLength);

  s.Insert(Key,((TEdit *)Sender)->SelStart+1);

  if (s=="-" || Key==VK_BACK) return;

  try

  { if (Key==' ') throw EConvertError("");

    StrToFloat(s);

  }

  catch (EConvertError &) {Key=0;}

}

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

 

void __fastcall TGaussZeidel::WeKeyPress(TObject *Sender, char &Key)

{

  AnsiString s=((TEdit *)Sender)->Text;

  s.Delete(((TEdit *)Sender)->SelStart+1,((TEdit *)Sender)->SelLength);

  s.Insert(Key,((TEdit *)Sender)->SelStart+1);

  if (Key==VK_BACK) return;

  try

  { if (Key==' ' || Key=='-') throw EConvertError("");

    StrToFloat(s);

  }

  catch (EConvertError &) {Key=0;}

}

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

 

void __fastcall TGaussZeidel::WAChange(TObject *Sender)

{

  CountLins->Enabled=false;

  ParFun->Enabled=true;

  Start->Enabled=false;

  Start->Caption="По&ехали!";

  Stepp->Enabled=false;

  Step->Enabled=false;

  Table->Enabled=false;

}

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

 

void __fastcall TGaussZeidel::WeChange(TObject *Sender)

{

  if (Step->Checked) Stepp->Enabled=true;

  else Start->Enabled=true;

  Step->Enabled=true;

  Start->Caption="По&ехали!";

  Point->Enabled=true;

  Table->Enabled=false;

}

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

 

void __fastcall TGaussZeidel::TimerTimer(TObject *Sender)

{

  static int i=0;

  if (!Step->Checked) Pause->Enabled=true;

  if (!fl)

     { TLineSeries *Demo=new TLineSeries(GaussZeidel);

      ListPoints->AddObject("",Demo);

      Demo->ParentChart=LevelLines;

      Demo->SeriesColor=clRed;

      Demo->Pointer->Visible=true;

      Demo->Pointer->Style=psCircle;

      Demo->Pointer->HorizSize=3;

      Demo->Pointer->VertSize=3;

      i=0;

     }

  fl=true;

  if (i==Points->Count)

  { Timer->Enabled=false;

    Stop->Enabled=false;

    Pause->Enabled=false;

    Table->Enabled=true;

    if (!Step->Checked) Start->Enabled=true;

    else Stepp->Enabled=true;

    Start->Caption="Повто&рить";

    double Xmin, Ymin, Zmin;//точное решение

    double a, b, A, B, C;//задаваемые параметры функции

     a=StrToFloat(Waa->Text),

     b=StrToFloat(Wbb->Text),

     A=StrToFloat(WA-> Text),

     B=StrToFloat(WB->Text),

     C=StrToFloat(WC->Text);

     Xmin=(4*A*B*a-2*B*C*b)/(4*A*B-C*C);

     Ymin=b-C*Xmin/(2*B);

     Zmin=fun(Xmin,Ymin);

    Application->MessageBox(("Точное решение:\nx1*="+FloatToStr(Xmin)+"\nx2*="+

                             FloatToStr(Ymin)+"\nf(x1*,x2*)="+FloatToStr(Zmin)+

                             "\nПолученное решение:\nx1="+Points->Strings[i-2]+"\nx2="+

                             Points->Strings[i-1]+"\nf(x1,x2)="+

                             FloatToStr(fun(StrToFloat(Points->Strings[i-2]),

                             StrToFloat(Points->Strings[i-2])))).c_str(),"Решение",MB_OK);

    fl=false;

    WA->Enabled=true; WB->Enabled=true; WC->Enabled=true;

    Waa->Enabled=true; Wbb->Enabled=true; We->Enabled=true;

    Wh->Enabled=true; Wk->Enabled=true; Wx->Enabled=true; Wy->Enabled=true;

  }

  else

  { if (Points->Strings[i]=="-")

    { TLineSeries *Demo=new TLineSeries(GaussZeidel);

      ListPoints->AddObject("",Demo);

      Demo->ParentChart=LevelLines;

      Demo->SeriesColor=clRed;

      Demo->Pointer->Visible=true;

      Demo->Pointer->Style=psCircle;

      Demo->Pointer->HorizSize=3;

      Demo->Pointer->VertSize=3;

      Points->Delete(i);

    }

    ((TLineSeries *)ListPoints->Objects[ListPoints->Count-1])->

    AddXY(StrToFloat(Points->Strings[i++]),StrToFloat(Points->Strings[i++]),"",clRed);

  }

}

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

 

void __fastcall TGaussZeidel::StepClick(TObject *Sender)

{

  if (Step->Checked)

  { Stepp->Enabled=true;

    Start->Enabled=false;

    Pause->Enabled=false;

    if (fl) Timer->Enabled=false;

    Pause->Caption="&Остановиться";

  }

  else

  { Stepp->Enabled=false;

    Start->Enabled=true;

  }

}

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

 

void __fastcall TGaussZeidel::SteppClick(TObject *Sender)

{

  if (!fl) StartClick(Sender);

  else TimerTimer(Sender);

}

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

 

void __fastcall TGaussZeidel::StopClick(TObject *Sender)

{

  fl=false;

  Stop->Enabled=false;

  Pause->Enabled=false;

  Timer->Enabled=false;

  Start->Caption="По&ехали!";

  WA->Enabled=true; WB->Enabled=true; WC->Enabled=true;

  Waa->Enabled=true; Wbb->Enabled=true; We->Enabled=true;

  Wh->Enabled=true; Wk->Enabled=true; Wx->Enabled=true; Wy->Enabled=true;

  for (int i=ListPoints->Count-1;i>=0;i--)

  { delete ListPoints->Objects[i];

    ListPoints->Delete(i);

  }

  Points->Clear();

  if (!Step->Checked) Start->Enabled=true;

  else Stepp->Enabled=true;

}

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

 

void __fastcall TGaussZeidel::PauseClick(TObject *Sender)

{

  if (Timer->Enabled) Pause->Caption="Про&должить";

  else Pause->Caption="&Остановиться";

  if (!Step->Checked) Timer->Enabled=!Timer->Enabled;

}

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

 

void __fastcall TGaussZeidel::DelayKeyPress(TObject *Sender, char &Key)

{

  AnsiString s=((TEdit *)Sender)->Text;

  s.Delete(((TEdit *)Sender)->SelStart+1,((TEdit *)Sender)->SelLength);

  if (s=="")

  { try { StrToInt(Key);}

    catch (EConvertError &) { Key=0; }

    if (Key!=0) Delay->Value=StrToInt(Key);

    Key=0;

    return;

  }

  s.Insert(Key,((TEdit *)Sender)->SelStart+1);

  if (Key==VK_BACK) return;

  try

  { if (Key==' ' || Key=='-' || Key=='+' || Key==',') throw EConvertError("");

    StrToFloat(s);

  }

  catch (EConvertError &) {Key=0;}

}

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

 

void __fastcall TGaussZeidel::DelayChange(TObject *Sender)

{

Timer->Interval=Delay->Value;

}

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

 

void __fastcall TGaussZeidel::PointClick(TObject *Sender)

{

  try

  { static double x=StrToFloat(Wx->Text), y=StrToFloat(Wy->Text);

    StartPoint->Clear();

    if (Point->ModalResult==2)

    { x=StrToFloat(Wx->Text); y=StrToFloat(Wy->Text); Point->ModalResult=0;}

    if (Point->ModalResult || x!=StrToFloat(Wx->Text) || y!=StrToFloat(Wy->Text))

    { Point->ModalResult=0;

      x=StrToFloat(Wx->Text); y=StrToFloat(Wy->Text);

      StartPoint->AddXY(StrToFloat(Wx->Text),StrToFloat(Wy->Text),"",clLime);

    }

    else Point->ModalResult=1;

  }

  catch (EConvertError &)

  { Application->MessageBox("Проверте параметры поиска","Ошибка!",MB_OK);}

}

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

 

void __fastcall TGaussZeidel::TimeTimer(TObject *Sender)

{

  StartPoint->Pointer->Visible=!StartPoint->Pointer->Visible;

}

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

 

void __fastcall TGaussZeidel::TableClick(TObject *Sender)

{

  FTable->ShowModal();

}

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

 

void __fastcall TGaussZeidel::MExitClick(TObject *Sender)

{

  Close();

}

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

 

void __fastcall TGaussZeidel::MAboutClick(TObject *Sender)

{

  Application->MessageBox

  ("           ВЯТСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ\n\n"

   "ФАКУЛЬТЕТ АВТОМАТИКИ И ВЫЧИСЛИТЕЛЬНОЙ ТЕХНИКИ\n\n"

   "           КАФЕДРА \"АВТОМАТИКИ И ТЕЛЕМЕХАНИКИ\"\n\n"

   "                    Курсовая работа по дисциплине\n"

   "                            \"Методы оптимизации\"\n\n"

   "    МЕТОД НАХОЖДЕНИЯ БЕЗУСЛОВНОГО ЭКСТРЕМУМА\n"

   "   ЦЕЛЕВОЙ ФУНКЦИИ МЕТОДОМ ГАУССА-ЗАЙДЕЛЯ ИЛИ\n"

   "                      ПОКООРДИНАТНОГО СПУСКА\n\n"

   "Выполнил студент гр. У-22\n"

   "Огарков Александр Владимирович","О разработчике",MB_OK);

}

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

 

 

 

Файл Table.cpp

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

 

#include <vcl.h>

#pragma hdrstop

 

#include "Table.h"

#include "Unit1.h"

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

#pragma package(smart_init)

#pragma resource "*.dfm"

TFTable *FTable;

extern TStringList *Points;

double fun(double x,double y);

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

__fastcall TFTable::TFTable(TComponent* Owner)

        : TForm(Owner)

{

}

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

void __fastcall TFTable::FormActivate(TObject *Sender)

{

  Tablica->Cells[0][0]="Число шагов N";

  Tablica->Cells[1][0]="Шаг h";

  Tablica->Cells[2][0]="Текущее значение x1";      

  Tablica->Cells[3][0]="Текущее значение x2";

  Tablica->Cells[4][0]="f(x1,x2)";

  for (int i=1;i<=Points->Count-1;i+=2)

  { Tablica->Cells[0][(i+1)/2]=(i+1)/2;

    Tablica->Cells[2][(i+1)/2]=Points->Strings[i-1];

    Tablica->Cells[3][(i+1)/2]=Points->Strings[i];

    Tablica->Cells[4][(i+1)/2]=fun(StrToFloat(Points->Strings[i-1]),StrToFloat(Points->Strings[i]));

  }

}

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

8.     Список литературы

 

1.      Дегтярев Ю. И. Методы оптимизации – М.: Советское радио, 1980.

2.      Архангельский А. Я. Программирование в C++ Builder 5 – М.: Бином, 2001.

3.      Голубев А. Д. Методы оптимизации – Киров: ВятГТУ, 1997.

4.      Микрюкова В. И.: курс лекций по дисциплине «Методы оптимизации».

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 



Информация о работе Методы нахождения условного и безусловного экстремума