|
|||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Метод Хука и ДживсаМетод Хука и Дживса осуществляет два типа поиска - исследующий поиск и поиск по образцу. Первые две итерации процедуры показаны на рисунке. 1-поиск по образцу; 2- исследующий поиск вдоль координатных осей. При заданном начальном векторе x1 исследующий поиск по координатным направлениям приводит в точку x2. Последующий поиск по образцу в направлении x1- x2 приводит в точку y. Затем исследующий поиск, начинающийся из точки y, дает точку x3. Следующий этап поиска по образцу вдоль направления x3- x2 дает y*. Затем процесс повторяется. Фрагментыисходногокода.
#include"stdafx.h" usingnamespace std;
typedeffloat coord[2]; constfloat eps=0.0001; coord xf; float ff;
void prisv(coord x1,coord x2) { x1[0]=x2[0]; x1[1]=x2[1]; }
float func(float x1,float x2) { float y; y=100*(x2-x1*x1)*(x2-x1*x1)+(1-x1)*(1-x1); return y; }
void issled(coord xb0, float fb, float h) { float ft; coord xk;
prisv(xf,xb0); prisv(xk,xb0); xk[0]+=h; //dvizhenie vpravo po osi x1; ff=func(xk[0],xk[1]); if (ff<fb) { prisv(xf,xk); xk[1]+=h; //vverh ft=func(xk[0],xk[1]); if (ft<fb) { ff=ft; prisv(xf,xk); } else { xk[1]-=2*h; //vniz ft=func(xk[0],xk[1]); if (ft<fb) { ff=ft; prisv(xf,xk); } } } else { prisv(xk,xb0); xk[0]-=h;//dvizhenie vlevo po osi x1 ff=func(xk[0],xk[1]); if (ff<fb) { prisv(xf,xk); xk[1]+=h; //vverh ft=func(xk[0],xk[1]); if (ft<fb) { ff=ft; prisv(xf,xk); } else { xk[1]-=2*h; //vniz ft=func(xk[0],xk[1]); if (ft<fb) { ff=ft; prisv(xf,xk); } } } } }
int _tmain(int argc, _TCHAR* argv[]) { setlocale(LC_ALL,"Russian"); coord xb[2], p; float h, fb[2], fp; h=10; xb[0][0]=3; xb[0][1]=0; while (h>eps) { fb[0]=func(xb[0][0],xb[0][1]); issled(xb[0],fb[0],h); while ((h>eps) && (xb[0][0]==xf[0]) && (xb[0][1]==xf[1])) { h=h/2; issled(xb[0],fb[0],h); //issled poisk do teh por poka ne umenshim } if (xb[0]!=xf) //xf-new basic point; ff - znachenie v xf; { do { prisv(xb[1],xf); fb[1]=ff; p[0]=xb[1][0]+(xb[1][0]-xb[0][0]); p[1]=xb[1][1]+(xb[1][1]-xb[0][1]); fp=func(p[0],p[1]); issled(p,fp,h); if (p!=xf) prisv(xb[0],xb[1]); } while (ff<fb[1]); prisv(xb[0],xb[1]); } } cout<<"значение минимума: "<<fb[1]<<"\n"<<"Точка минимума: "<<xb[1][0]<<" "<<xb[1][1]; getch(); return 0; }
Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.004 сек.) |