Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
7
Добавлен:
01.05.2014
Размер:
2.52 Кб
Скачать
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <iostream.h>

  double P[2];
  double X0[2];

double f(double X[2])    //Возвращает значение функции
{
  return (1*pow(X[0],2)+3*pow(X[1],2)+2*X[0]*X[1]);
}

double df(double X[2])    //Возвращает производную исследуемой функции
{
 double g1=2*X[0]+2*X[1];
 double g2=6*X[1]+2*X[0];
 return(g1*P[0]+g2*P[1]);
}

double Alpha(double x)    //Alpha
{
  double X2[2];
  X2[0]=X0[0]+x*P[0];
  X2[1]=X0[1]+x*P[1];
  return (f(X2));
}

void DSK(void) //Method DSK 
{
  int k=0;
  double e=0.01;
  double xf, Y[2];
  double tmp;
  double e1=0.001;
  double h=0.01;
  double c, d;
  double x1=fabs(2*(f(X0)-df(X0))/df(X0));
while(1)
{
  double x2=x1+h;
  if(Alpha(x2)>Alpha(x1)) h=-h;
  x2=x1+h;
  while (Alpha(x2)<Alpha(x1))
  {
    h=2*h;
    x1=x2;
    x2=x1+h;
  }
 double a=x1-h/2;
 double b=x2;
  if (b<a) {tmp=a; a=b; b=tmp;}
  if (Alpha(x1)>Alpha((b+x1)/2)) {
     a=x1;
     c=b;
     b=(b+x1)/2;   }
  else  {
     a=a;
     c=(b+x1)/2;
     b=x1;
   }
  if ((Alpha(a)>=Alpha(b)) && (Alpha(b)<=Alpha(c)))
    d=b+0.5*((b-a)*(b-a)*(Alpha(b)-Alpha(a))-(b-c)*(b-c)*(Alpha(b)-
    Alpha(c)))/((b-a)*(Alpha(b)-Alpha(a))-(b-c)*(Alpha(b)-Alpha(c)));
  else
    d=b+0.5*((b-a)*(Alpha(a)-Alpha(c)))/(Alpha(a)-2*Alpha(b)+Alpha(c));

  if ((fabs((b-d)/b)<=e)&&(fabs((Alpha(b)-Alpha(d))/Alpha(b))<=e1))
   {
    xf=(b+d)/2; Y[0]=X0[0]+xf*P[0]; Y[1]=X0[1]+xf*P[1];
    break;
   }
	h=h/2;
	if (Alpha(b)<Alpha(d)) x1=b;
	else x1=d;
	k=k++;
}//while?
	//vyvod rezyltata
 


cout<<"Method DSK"<<endl;
 cout<<"\nx1= " << Y[0];
 cout<<"\nx2= " << Y[1];
 cout<<"\nk= " << k << " число итераций\n";
}//DSK proc

double david() //метод Давидона
{
	int k=1;
	double e=0.000000001, dfun, a, b, n, h, r, z, w, a0;
	dfun=df(0);
	cout<<"David--> ";
	/*h=2*fabs(f(0)-5.998)/fabs(dfun);
	if(h>1) h=1;*/
	h=0.00001;
	if(dfun>0)
	{
		p.x1=-p.x1;
		p.x2=-p.x2;
		dfun=df(0);
	}
	do
	{
		h=h+2*h;
	}
	while(dfun*df(h)<0);
	a=h/3;
	b=h;
	/*a0=a;
	b=b-a;
	a=0;*/
	do
	{
		z=df(a)+df(b)+3*(f(a)-f(b))/(b-a);
		w=sqrt(z*z-df(a)*df(b));
		r=(w-df(a)+z)/(2*w-df(a)+df(b));
		r*=(b-a);
		if(df(r)<=e) return r;
		if(df(r)>0) b=r;
		else a=r;
	}
	while(k<10);
	return r;
} 

int main(void) //Осн. процедура
{
	P[0]=2; //Нач. направление.
	P[1]=3; //Нач. направление.
	X0[0]=1; Х0[1]=1;
    clrscr();
    DSK();
    Cout<<David();
    getch();
		return 0;
}
Соседние файлы в папке Метод Дэвидсона