
Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Метод Дэвидсона / zs1-pauella
.cpp#include<conio.h>
#include<stdio.h>
#include<math.h>
double funcxy (double,double);
double funca (double);
double defx (double,double);
double defy (double,double);
double DEF ( double*);
void ZS1 (double,double);
void pawell (double,double);
double X0[2]={-1,0}, p[2]={5,1};
void main (void)
{
// clrscr();
double x[2], y[2], step=0.01, a=0, b=0 ;
x[0]=y[0]=X0[0];
x[1]=y[1]=X0[1];
if( DEF(x)<0 )
{
p[0]=p[0];
p[1]=p[1];
}
else
{
p[0]=-p[0];
p[1]=-p[1];
}
do
{
x[0]=y[0]; x[1]=y[1];
y[0]=X0[0]+step*p[0];
y[1]=X0[1]+step*p[1];
a=b;
b=step;
step=step*2;
}
while( DEF(x)*DEF(y)>0 );
printf("A=%f,\tB=%f\n",a,b);
while(getch()!=32);
ZS1(a,b);
printf("\nA=%f,\tB=%f\n",a,b);
while(getch()!=32);
pawell(a,b);
}
double funcxy (double x, double y)
{
return( 100*(y-x*x)*(y-x*x)+(1-x)*(1-x) );
}
double funca (double a)
{
return( funcxy( X0[0]+a*p[0], X0[1]+a*p[1] ) );
}
double defx (double x, double y)
{
return( -400*y*x+400*pow(x,3)-2+2*x );
}
double defy (double x, double y)
{
return( 200*y-200*x*x );
}
double DEF ( double *x)
{
return( defx( *x,*(x+1) ) * (*p) + defy( *x,*(x+1) ) * (*(p+1)) );
}
void ZS1 (double a, double b)
{
double q, w, x[2], y[2], E=0.001;
q=a+0.381966011*fabs(b-a);
w=a+0.618033988*fabs(b-a);
int z=0;
do
{
x[0]=X0[0]+q*p[0];
x[1]=X0[1]+q*p[1];
y[0]=X0[0]+w*p[0];
y[1]=X0[1]+w*p[1];
if( fabs(DEF(x))<fabs(DEF(y)) )
{
b=w;
w=q;
q=a+0.381966011*fabs(b-a);
}
else
{
a=q;
q=w;
w=a+0.618033988*fabs(b-a);
}
z++;
}while(fabs(b-a)>E);
a=(a+b)/2;
x[0]=X0[0]+a*p[0];
x[1]=X0[1]+a*p[1];
printf("Minimum:(%f, %f)\nIteratsii: %d\n",x[0],x[1],z);
while(getch()!=32);
}
void pawell (double a, double b)
{
double E=0.001, c=b, d, x[2], y[2];
int z=0;
b=(a+c)/2;
d=(a+b)/2 + 0.5*( ( (funca(a)-funca(b))*(b-c)*(c-a) )/( funca(a)*(b-c)+funca(b)*(c-a)+funca(c)*(a-b) ) );
while( ( fabs((d-b)/2)>E )||( fabs((funca(d)-funca(b))/funca(b))>E ) )
{
if(b<d)
{
if( funca(b)<funca(d) )
c=d;
else
{
a=b;
b=d;
}
}
else
{
if( funca(b)<funca(d) )
a=d;
else
{
c=b;
b=d;
}
}
d=(a+b)/2 + 0.5*( ( (funca(a)-funca(b))*(b-c)*(c-a) )/( funca(a)*(b-c)+funca(b)*(c-a)+funca(c)*(a-b) ) );
z++;
}
a=(b+d)/2;
x[0]=X0[0]+a*p[0];
x[1]=X0[1]+a*p[1];
printf("Minimum:(%f, %f)\nIteratsii: %d\n",x[0],x[1],z);
while(getch()!=32);
}
Соседние файлы в папке Метод Дэвидсона