4. Программное решение
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include <stdio.h>
#include <conio.h>
#include <math.h>
//---------------------------------------------------------------------------
#pragma argsused
struct TValue
{
float x;
float y;
};
//---------------------------------------------------------------------------
struct TValue CalculateValue(struct TValue yi,float qi,struct TValue di)
{
struct TValue res;
res.x=yi.x+qi*di.x;
res.y=yi.y+qi*di.y;
return res;
}
//---------------------------------------------------------------------------
float CalculateFunction(struct TValue val)
{
float res;
res=100*((val.y-(val.x*val.x))*(val.y-(val.x*val.x)))+((1-val.x)*(1-val.x))
return res;
}
//---------------------------------------------------------------------------
float CalculateX(struct TValue val1,struct TValue val2)
{
float res;
res=sqrt((val1.x-val2.x)*(val1.x-val2.x)+(val1.y-val2.y)*(val1.y-val2.y));
return res;
}
//---------------------------------------------------------------------------
struct TValue CalculateRaznost(struct TValue val1,struct TValue val2)
{
TValue res;
res.x=val1.x-val2.x;
res.y=val1.y-val2.y;
return res;
}
//---------------------------------------------------------------------------
float CalcKoren(struct TValue b1)
{
return sqrt(b1.x*b1.x+b1.y*b1.y);
}
//---------------------------------------------------------------------------
int main(int argc, char* argv[])
{
struct TValue val;
struct TValue xk[100],d1,d2,y1,y2,y3,X;
float a,b,q01,q02,e,q1,q2,lam1,lam2,end;
int i,N,k=0,n=2,l=0;
float f1,f2;
int direction;
//Вводим начальные условия
printf("\nVvedite 1-yu tochku: ");
printf("\nKoordimata po X: ");scanf("%f",&xk[k].x);
printf("Koordimata po Y: ");scanf("%f",&xk[k].y);
printf("Vvedite chislo dlya ostanovki algoritma e>0: ");scanf("%f",&e);
printf("Vvedite koef. rastez. a>1: ");scanf("%f",&a);
printf("Vvedite koef. szatiya -1<b<0: ");scanf("%f",&b);
printf("Vyberete 1-e koordinatnoe napravlenie: \n");scanf("%f",&d1.x);scanf("%f",&d1.y);
printf("Vyberete 2-e koordinatnoe napravlenie: \n");scanf("%f",&d2.x);scanf("%f",&d2.y);
printf("Vyberete nachalnuu dlinnu shaga po 1-mu napravleniu: ");scanf("%f",&q01);
printf("Vyberete nachalnuu dlinnu shaga po 2-mu napravleniu: ");scanf("%f",&q02);
printf("Vvedite kol-vo neudachnyh shagov N: ");scanf("%f",&N);
i=1; y1=xk[k]; q1=q01; q2=q02;
direction=1;
STEP2:
if(direction==1)
{
val=CalculateValue(y1,q1,d1);
f1=CalculateFunction(val);
f2=CalculateFunction(y1);
if(f1<f2)
{
y2=val; q1=a*q1;
goto STEP3;
}
else
{
y2=y1; q1=b*q1;
goto STEP3;
}
}
if(direction==2)
{
val=CalculateValue(y2,q2,d2);
f1=CalculateFunction(val);
f2=CalculateFunction(y2);
if(f1<f2)
{
y3=val; q2=a*q2;
goto STEP3;
}
else
{
y3=y2; q2=b*q2;
goto STEP3;
}
}
STEP3:
if(i<n)
{
i=i+1;
if(direction==1) {direction=2;goto STEP2;}
if(direction==2) {direction=1;goto STEP2;}
}
if(i==n)
{
if(CalculateFunction(y3)<CalculateFunction(y1))
{
y1=y3; i=1;
if(direction==1) {direction=2;goto STEP2;}
if(direction==2) {direction=1;goto STEP2;}
}
if(CalculateFunction(y3)==CalculateFunction(y1))
{
if(CalculateFunction(y3)<CalculateFunction(xk[k]))
{
goto STEP4;
}
if(CalculateFunction(y3)==CalculateFunction(xk[k]))
{
l++;
if(l>=N){goto STEP4;}
else
{
if((fabs(q1)<=e)&&(fabs(q2)<=e))
{
X=xk[k];
goto EXIT;
}
if((fabs(q1)>e)||(fabs(q2)>e))
{
y1=y3; i=1;
if(direction==1) {direction=2;goto STEP2;}
if(direction==2) {direction=1;goto STEP2;}
}
}
}
}
}
STEP4:
xk[k+1]=y3;
if(CalculateX(xk[k+1],xk[k])<=e)
{
X=xk[k+1];
}
else
{
TValue raz,a1,a2,b1,b2;
float Koren,b3;
raz=CalculateRaznost(xk[k+1],xk[k]);
lam1=d1.x*raz.x+d1.y*raz.y;
lam2=d2.x*raz.x+d2.y*raz.y;
a1.x=lam1*d1.x+lam1*d1.y; a1.y=lam2*d1.x+lam2*d1.y;
a2.x=lam2*d2.x; a2.y=lam2*d2.y;
b1=a1;
Koren=CalcKoren(b1);
d1.x=b1.x/Koren;
d1.y=b1.y/Koren;
b3=a2.x*d1.x+a2.y*d1.y;
b2.x=a2.x-b3*d1.x;
b2.y=a2.y-b3*d1.y;
q1=q01; q2=q02;
k++;
y1=xk[k];i=1;
if(direction==1) {direction=2;goto STEP2;}
if(direction==2) {direction=1;goto STEP2;}
}
EXIT:
clrscr();
end=CalculateFunction(X);
printf("\nOtvet");
printf("\nTochka minimuma: ");
printf("\nx*=x%d=(%f;%f)",k+1,X.x,X.y);
printf("\nZnachenie f-i v min ");
printf("\nF(x*)=%f",end);
getch();
return 0;
}
//---------------------------------------------------------------------------