Скачиваний:
14
Добавлен:
01.05.2014
Размер:
2.68 Кб
Скачать
#include <stdio.h>
#include <conio.h>
#include <math.h>

double proizv(double);
double func(double);
double funcdsk(double, double*);
void svenn(double*);
void DIH();
int DSK(double*);

double Q=0.00005;
double P[2]={0,1};

void main(void)
{
 double X[2]={5,2};
 clrscr();
 svenn(X);
 printf("\nA:[%f,%f]",X[0]+Q*P[0],X[1]+Q*P[1]);
 printf("\nB:[%f,%f]",X[0]+Q*P[0]/2,X[1]+Q*P[1]/2);
 DIH();
 printf("\nMetod Dihotomii:[%f,%f]",X[0]+Q*P[0],X[1]+Q*P[1]);
 if(DSK(X)) printf("\nMetod DSK:[%f,%f]",X[0]+Q*P[0],X[1]+Q*P[1]);
 getch();
}
//***********************************************
double func(double q)
{
 double X[2]={5,2},Z[2];
 Z[0]=X[0]+q*P[0];
 Z[1]=X[1]+q*P[1];
 return(2*Z[0]*Z[0]*Z[0]+4*Z[0]*Z[1]*Z[1]-10*Z[0]*Z[1]+Z[1]*Z[1]);
}
//***********************************************
double funcdsk(double q, double *X)
{
 double Z[2];
 Z[0]=X[0]+q*P[0];
 Z[1]=X[1]+q*P[1];
 return(2*Z[0]*Z[0]*Z[0]+4*Z[0]*Z[1]*Z[1]-10*Z[0]*Z[1]+Z[1]*Z[1]);
}
//***********************************************
double proizv(double q)
{
 double a,b;
 double X[2]={5,2},Z[2];
 Z[0]=X[0]+q*P[0];
 Z[1]=X[1]+q*P[1];
 a=6*Z[0]*Z[0]+4*Z[1]*Z[1]*Z[1]-10*Z[1];
 b=12*Z[0]*Z[1]*Z[1]-10*Z[0]+2*Z[1];
 return(a*P[0]+b*P[1]);
}
//***********************************************
void svenn(double *X)
{
 double Z[2];
 if( proizv(0) >0) {P[0]=-P[0];P[1]=-P[1];}
 int k=0;
 do
 {
  k++;
  Q=2*Q;
  Z[0]=X[0]+Q*P[0];
  Z[1]=X[1]+Q*P[1];
 }
 while( (proizv(0)*proizv(Q) ) >0);
}
//***********************************************
void DIH()
{
 double e=0.0001,d=0.00001,alfaa=Q/2,alfab=Q,alfa1,alfa2,l[2],m[2];
 int k=0;
 do
 {
  k++;
  alfa1=(alfab+alfaa)/2-d/2;
  alfa2=(alfab+alfaa)/2+d/2;
  if(func(alfa1)<func(alfa2))  alfab=alfa2;
  else alfaa=alfa1;
 }
 while(fabs(alfab-alfaa)>e);
 printf("\n\nk=%d",k);
 Q=(alfaa+alfab)/2;
}
//***********************************************
int DSK(double *X)
{
 double H,a,b,c,d,e=0.001,Z[2];
 int k=0;
 if( proizv(0) >0) {P[0]=-P[0];P[1]=-P[1];}
 Q=H=0.00005;
 for(;;)
 {
  k++;
  while(funcdsk(H,X)>funcdsk(2*H,X)) { H=2*H;  }
  d=3*H/2;
  if(funcdsk(d,X)>funcdsk(H,X))
  {
   a=H/2; b=H; c=2*H;
  }
  else
  {
   a=H; b=d; c=2*H;
  }
  d=b+0.5*( (b-a)*(b-a)*(funcdsk(b,X)-funcdsk(c,X))-(b-c)*(b-c)*(funcdsk(b,X)-funcdsk(a,X)) )/( (b-a)*(funcdsk(b,X)-funcdsk(c,X))-(b-c)*(funcdsk(b,X)-funcdsk(a,X)) );
  if( fabs((d-b)/b)<=e || fabs((funcdsk(d,X)-funcdsk(b,X))/funcdsk(b,X))<=e ) {Q=(b+d)/2;printf("\n\nk=%d",k); return(1);}
  Q=H=Q/2;
  if(funcdsk(b,X)>funcdsk(d,X)) {X[0]=X[0]+d*P[0];X[1]=X[1]+d*P[1];}
  else {X[0]=X[0]+b*P[0];X[1]=X[1]+b*P[1];}
 }
}
Соседние файлы в папке all