Експериментальні методи пошуку екстремумів функцій

Страницы работы

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

Лабораторна робота №11                 

Тема: Експериментальні методи пошуку екстремумів функцій.

Мета: Отримання практичних навичок по використанню експериментальних методів пошуку екстремумів функцій.

Опис ходу виконання:

       Згідно індивідуального завдання необхідно створити алгоритм та написати програму знаходження  екстремуму (min) за допомогою методу Кіфера-Вольфовича для функції виду z=100+x-y+(x-120)^2+(y+140)^2-(x+20)*y.

Текст головної підпрограми:

#include <vcl.h>

#pragma hdrstop

#include "Unit1.h"

#include <sysvari.h>

#include <conio.h>

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

float z[5];

float a[2];

float mx, my,n, d;

double aa, bb;

const float e = 0.1;

__fastcall TForm1::TForm1(TComponent* Owner)

        : TForm(Owner)

{

}

float func(float x, float y)

{

   return (100+x-y+(x-120)*(x-120)+(y+140)*(y+140)-(x+20)*y);

}

void plan(float x, float y, float zm[5])

{

   zm[1]=func(x-d,y-d);

   zm[2]=func(x+d,y-d);

   zm[3]=func(x-d,y+d);

   zm[4]=func(x+d,y+d);

}

void grad(float zm[5], float am[2])

{

   am[0]=0.25*(-zm[1]+zm[2]-zm[3]+zm[4]);

   am[1]=0.25*(-zm[1]-zm[2]+zm[3]+zm[4]);

}

void __fastcall TForm1::FormCreate(TObject *Sender)

{

 Form1->Image1->Canvas->MoveTo(20,190);

 Form1->Image1->Canvas->LineTo(500,190);

 Form1->Image1->Canvas->MoveTo(260,20);

 Form1->Image1->Canvas->LineTo(260,350);

 Form1->Image1->Canvas->TextOutA(270,10,"Y");

 Form1->Image1->Canvas->TextOutA(500,200,"X");

 Form1->Image1->Canvas->TextOutA(270,200,"0");

 Form1->Image1->Canvas->TextOutA(330,200,"74");

 Form1->Image1->Canvas->TextOutA(270,270,"-92");

 Form1->Image1->Canvas->MoveTo(500,190);

 Form1->Image1->Canvas->LineTo(490,200);

 Form1->Image1->Canvas->MoveTo(500,190);

 Form1->Image1->Canvas->LineTo(490,180);

 Form1->Image1->Canvas->MoveTo(260,20);

 Form1->Image1->Canvas->LineTo(250,30);

 Form1->Image1->Canvas->MoveTo(260,20);

 Form1->Image1->Canvas->LineTo(270,30);

    mx=my=0;

    bb = func(mx,my);

    n=1;

    d=0.2;

    Form1->Image1->Canvas->MoveTo(mx+260,-my+190);

    do {

    aa=bb;

    plan(mx, my, z);

    grad(z, a);

    mx = mx - (1/n)*a[0];

    my = my - (1/n)*a[1];

    bb = func(mx, my);

    Form1->Image1->Canvas->LineTo(mx+260,-my+190);

    Form1->Memo1->Lines->Add("x="+FloatToStr(mx)+" y="+FloatToStr(my));

    Form1->Memo1->Lines->Add("значение z="+FloatToStr(bb));

    n++;

   } while (aa>bb);

  }

Результати роботи програми:

За допомогою пакету Statgraphics побудуємо графік функції та знайдемо точку екстремуму:


Поверхня відгуку

        Карта ліній рівнів


Висновок: Отримані практичні навички по використанню експериментальних методів пошуку екстремумів функцій на прикладі методу Кіфера-Вольфовича, розроблена програма згідно індивідуального завдання.

Похожие материалы

Информация о работе