Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Градиентные методы / 4_gaysazeidelya+ZS
.CPP#include<conio.h>
#include<stdio.h>
#include<math.h>
double funcxy (double, double, double);
double funca (double, double*);
double defx (double);
double defy (double);
double defz (double);
double DEF ( double*, double*);
double ZS1 (double,double,int);
double X0[3]={0,0,0};
double t[3];
double p[3][3]= {
{ 1,0,0 },
{ 0,1,0 },
{ 0,0,1 },
};
void main (void)
{
clrscr();
double x[3], y[3], step, a, b, norma, E=0.1 ;
int i;
t[0]=X0[0];
t[1]=X0[1];
t[2]=X0[2];
do
{
for(i=0;i<3;i++)
{
//p[i][i]=1;
step=0.01; a=0; b=0;
x[0]=y[0]=t[0];
x[1]=y[1]=t[1];
x[2]=y[2]=t[2];
switch(i)
{
case 1: p[1][1]=defx(t[1]);
break;
case 2: p[2][2]=defy(t[2]);
break;
case 3: p[3][3]=defz(t[3]);
break;
}
if( DEF(x,*(p+i))>0 )
{
p[i][0]=-p[i][0];
p[i][1]=-p[i][1];
p[i][2]=-p[i][2];
}
do
{
x[0]=y[0]; x[1]=y[1]; x[2]=y[2];
y[0]=t[0]+step*p[i][0];
y[1]=t[1]+step*p[i][1];
y[2]=t[2]+step*p[i][2];
a=b;
b=step;
step=step*2;
}
while( DEF(x,*(p+i))*DEF(y,*(p+i))>0 );
a=ZS1(a,b,i);
t[0]=t[0]+a*p[i][0];
t[1]=t[1]+a*p[i][1];
t[2]=t[2]+a*p[i][2];
}
norma = sqrt( pow( defx(t[0]),2 ) + pow( defy(t[1]),2 ) + pow( defz(t[2]),2 ) );
}
while( norma>E );
printf("Minimum: ( %f , %f , %f )", t[0],t[1],t[2]);
while(getch()!=32);
}
double funcxy (double x, double y, double z)
{
// return( (x-1)*(x-1)+(y-3)*(y-3)+4*(z-5)*(z-5) );
return( 3*(x-4)*(x-4) + 5*(y+3)*(y+3)+7*(2*z+1)*(2*z+1) );
}
double funca (double a, double*p)
{
return( funcxy( t[0]+a*p[0], t[1]+a*p[1], t[2]+a*p[2] ) );
}
double defx ( double x )
{
// return( 2*x-2 );
return( 6*x-24 );
}
double defy ( double y )
{
// return( 2*y-6 );
return( 10*y+30 );
}
double defz ( double z )
{
// return( 8*z-40 );
return( 56*z+28 );
}
double DEF ( double *x, double*p )
{
return( defx( *x ) * (*p) + defy( *(x+1) ) * (*(p+1)) + defz( *(x+2) ) * (*(p+2)) );
}
double ZS1 (double a, double b, int v)
{
double q, w, E=0.001;
q=a+0.381966011*fabs(b-a);
w=a+0.618033988*fabs(b-a);
do
{
if( fabs(funca(q,*(p+v)))<fabs(funca(w,*(p+v))) )
{
b=w;
w=q;
q=a+0.381966011*fabs(b-a);
}
else
{
a=q;
q=w;
w=a+0.618033988*fabs(b-a);
}
}while(fabs(b-a)>E);
return((a+b)/2);
}
Соседние файлы в папке Градиентные методы