Лабораторна робота №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 побудуємо графік функції та знайдемо точку екстремуму:
Поверхня відгуку
Карта ліній рівнів
Висновок: Отримані практичні навички по використанню експериментальних методів пошуку екстремумів функцій на прикладі методу Кіфера-Вольфовича, розроблена програма згідно індивідуального завдання.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.