Void main()
{ clrscr(); printf("\n Tochnist poshuku ekstremumu %lf",eps);
//printf("\n' ' - stop; Enter - continue by step; a - to end.");
SetFx(-1);
// 1. рoзрахунок значень функцii
do
{ it++;
// 2. Виведення значень функцii симплекса
printf("\n%d:",it);
for(i=0; i<=n; i++)
printf(" F(%5.3lf,%5.3lf)=%6.5lf",Xx[i][0],Xx[i][1],Fx[i]);
if(pause==0)
{ scanf("%c",&ch);
switch (ch)
{ case '\n': break;
case 'a' : pause=1; break;
case ' ' : exit(1);
}
}
// 3. Bибiр найгiршоi Xm точки cимплекса
m=0; for(i=1; i<=n;i++) if(Fx[i]> Fx[m]) m=i;
// 4. perevirka povtoren
if(No_Xm!=m) { No_Xm=m; Fr_Xm=1;}
else { if(Fr_Xm==3) goto m1; else Fr_Xm++;}
// 5. Pозрахунок центра вiдзеркалення
for(j=0; j<n; j++)
{ Xo[j]= 0; for(i=0; i<=n; i++) if(i!=m) Xo[j]+=Xx[i][j];
Xo[j]= Xo[j]/n; // áåç Xm
}
// 6. Деформацiя cимплекса
F_Xm= Fx[m]; printf("\n");
fp1= Mirror(1); for(i=0; i<n; i++) X1[i]=X[i];
if(fp1<F_Xm)
{ fp= Mirror(2);
if(fp<fp1) {for(i=0; i<n; i++) Xx[m][i]=X [i]; Fx[m]=fp;}
else {for(i=0; i<n; i++) Xx[m][i]=X1[i]; Fx[m]=fp1;}
} else
{ fp= Mirror(0.5);
if(fp<F_Xm) {for(i=0;i<n;i++) Xx[m][i]=X[i]; Fx[m]=fp;}
else m1: Reduction(0.5);
}
} while (SymplSize()>eps);
printf("\nFmin(%.7lf,%.7lf)=%.7f",Xx[b][1],Xx[b][2],Fx[b]);
printf(". ko=%d. Push <Enter>",ko);
getch();
}
Результати:
Рис.1
Рис.2
Рис.3
Рис.4
Алгоритм програми:
Початок
Задаємо
X0,X1…Xn
Задаємо
F
Так
Ні
Віддзеркалення
Ні
Так
Ні
Так
F<
Редукція
Стиснення
Ні
Так
Розширення
Кінець
