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

double proizv(double);
double f(double);
void svenn(double*);
int DSK(double*);

double fdsk(double, double*);



double P[2]={44,-241};
double Q=0.00005;


void main(void)
{
 double X[2]={0,3};
 clrscr();
 svenn(X);
 printf("\nA:[%.4f,%.4f]",X[0]+Q*P[0],X[1]+Q*P[1]);
 printf("\nB:[%.4f,%.4f]",X[0]+Q*P[0]/2,X[1]+Q*P[1]/2);
 printf("\n\nMetod DSK:[%.4f,%.4f]",X[0]+Q*P[0],X[1]+Q*P[1]);
 DSK(X);

}

///////////////////////////////////////////////////////////////////
double f(double q)
{
 double X[2]={0,3},Z[2];
 Z[0]=X[0]+q*P[0];
 Z[1]=X[1]+q*P[1];
 return((Z[0]-2)*(Z[0]-2)*(Z[0]-2)*(Z[0]-2)*(Z[0]-2)+(Z[0]-2*Z[1])*(Z[0]-2*Z[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);
 printf("Metod Swenna:\nk=%d",k);
}
/////////////////////////////////////////////////////////
double proizv(double q)
{
 double a,b;
 double X[2]={0,3},Z[2];
 Z[0]=X[0]+q*P[0];
 Z[1]=X[1]+q*P[1];
 a=4*(Z[0]-2)*(Z[0]-2)*(Z[0]-2)+2*(Z[0]-2*Z[1]);
 b=-4*(Z[0]-2*Z[1]);
 return(a*P[0]+b*P[1]);
}
///////////////////////////////////////////////////////////////////
int DSK(double *X)
{
 double H,a,b,c,d,e=0.001,Z[2];
 int k=1;
 if( proizv(0) >0) {P[0]=-P[0];P[1]=-P[1];}
 Q=H=0.00005;
 for(;;)
 {
  k++;
  while(fdsk(H,X)>fdsk(2*H,X)) { H=2*H;  }
  d=3*H/2;
  if(fdsk(d,X)>fdsk(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)*(fdsk(b,X)-fdsk(c,X))-(b-c)*(b-c)*(fdsk(b,X)-fdsk(a,X)) )/( (b-a)*(fdsk(b,X)-fdsk(c,X))-(b-c)*(fdsk(b,X)-fdsk(a,X)) );
  if( fabs((d-b)/b)<=e || fabs((fdsk(d,X)-fdsk(b,X))/fdsk(b,X))<=e ) {Q=(b+d)/2;printf("\nk=%d",k); return(1);}
  Q=H=Q/2;
  if(fdsk(b,X)>fdsk(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];}
 }
}
//////////////////////////////////////////////////////////
double fdsk(double q, double *X)
{
 double Z[2];
 Z[0]=X[0]+q*P[0];
 Z[1]=X[1]+q*P[1];
 return((Z[0]-2)*(Z[0]-2)*(Z[0]-2)*(Z[0]-2)*(Z[0]-2)+(Z[0]-2*Z[1])*(Z[0]-2*Z[1]));
}
Соседние файлы в папке all