
Void main()
{ clrscr();
printf("Poisk metodom -grad\n");
printf("eps=%f epsOP=%f",eps, epsOP);
x[0]=x0[0]; x[1]=x0[1]; f0=Fq();
printf("\nf%i/%i(%f,%f)=%f",it,ko,x0[0],x0[1], f0);
do
{ it++; UnGrad(); f=O_Poshuk();
printf("\nf%2i/%3i(%9.6f,%9.6f)=%10.7f",it,ko,x[0],x[1], f);
stop=1;
for(i=0;i<n;i++) if (fabs(x[i]-x0[i])>=eps) stop= 0;
x0[0]=x[0]; x0[1]=x[1]; f0=f;
}
while ((stop==0)||(it>100));
printf("\nko=%i Press <Enter>", ko);
getch();
}
Рис.1
Рис.2
Рис.3
Алгоритм програми:
Початок
fk=
f(Х(k))
; f(k)
у точці Х(k)
K=0;
Знайти
точку Х(k+1)
min
у
напрямку
-f(k)
Так
Ні
k=k+1;
виведення
Х(k+1)-Х(k)
Кінець
Міністерство освіти і науки України Національний технічний університет України «Київський політехнічний інститут» Радіотехнічний факультет Кафедра радіоконструювання та виробництва радіо апаратури
Лабораторна робота №5
МЕТОД «НЕЛДЕРА-МІДА»
Роботу прийняла: Роботу виконали: Роботу прийняла: Студенти гр.. РВ-91,
Тимофеєва Ю.Ф. IV курс, РТФ Іщенко Костянтин
Кальнюк Василь
Київ 2013р
Налагоджена програма:
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <vcl.h>
char ch;
int it=0, m, b, i, j, ko, No_Xm=0, Fr_Xm=0, pause=0, n=3;
double eps=0.001, fp, fp1, F_Xm, Fx[3+1], Xx[3+1][3]={{8,4},{9,5},{10,4}};
double Xo[3], X[3], X1[3];
// Дослiджувана фyнкцiя
double F(){ ko++; return X[0]*X[0]+4*X[1]*X[1];}
void SetFx(int k) // Pозрахунок значення фyнкцii
{ for(i=0; i<=n; i++)
if(i!=k) {for(j=0;j<n;j++) X[j]=Xx[i][j]; Fx[i]= F();}
}
double SymplSize() // Calc size of symplex
{ double s, xjmin, xjmax;
s=0;
for(j=0; j<n; j++)
{ xjmin= 1e30; xjmax=-1e30;
for(i=0; i<=n; i++)
{ if(Xx[i][j]<xjmin) xjmin=Xx[i][j];
if(Xx[i][j]>xjmax) xjmax=Xx[i][j];
}
s=s+(xjmax-xjmin);
}
s=s/n;
printf(" Sos=%lf",s);
return s;
}
double Mirror(double a) //Вiддзеркалення Xm для заданого а
{for(i=0; i<n; i++)
{ X[i]= Xo[i]+ a*(Xo[i]-Xx[m][i]);
}
double fp=F(); //printf(")->%lf ",fp);
return fp;
}
void Reduction(double a) // Редукцiя cимплекса
{ printf("Reduction"); // Bибiр найкращоi Xb точки
b=0; for(i=1; i<=n;i++) if(Fx[i]<=Fx[b]) b=i;
for(i=0; i<=n; i++)
if(i!=b)
for(j=0;j<n;j++) Xx[i][j]=Xx[b][j]+a*(Xx[i][j]-Xx[b][j]);
SetFx(b);
}