Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Семестровая МО Главная редакция.doc
Скачиваний:
3
Добавлен:
20.12.2018
Размер:
380.93 Кб
Скачать

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;

}

//---------------------------------------------------------------------------