Скачиваний:
1
Добавлен:
01.05.2014
Размер:
3.11 Кб
Скачать
#include "stdafx.h"
#include "math.h"
FILE *fp;// создаем файл для хранения результатов
// структура для вектора
struct vect { 
			double x; //координата х
			double y; //координата у
			double norm() {return sqrt(x*x+y*y);} //норма вектора
   		 }; 

vect p={1,0};// направление
vect x0={-0.5, 1};//начальная точка

// заданная функция
inline double y(double x1, double x2)
{
return -12*x2 + 4*x1*x1 + 4*x2*x2 - 4*x1*x2;
}

// возвращаем значение функции у от вектора х
inline double y(vect x)
{
return y(x.x,x.y);
}
// двигаемся вдоль прямой по направлению
inline double y(double a)
{
return y(x0.x+p.x*a,x0.y+p.y*a);
}

//считаем производную
double dy(double a, double e=0.001)
{
	return (y(x0.x+p.x*(a+e),x0.y+p.y*(a+e))-y(x0.x+p.x*a,x0.y+p.y*a))/(p.norm()*e);
}

#define min(a,b) (((a)>(b))?(b):(a))// функция для определения минимума
#define max(a,b) (((a)<(b))?(b):(a))//функция для определения максимума

// метод Свенна 4
double Swann4()
{
	fprintf(fp,"\nSwann 4:\n");
	double dy1=dy(0);// берем производную в начальной точке
	double a=min(2,fabs(2*(y(x0)-dy1)/dy1));
	if(dy1>0)//меняем направление
	{p.x=-p.x;p.y=-p.y;}
	fprintf(fp,"\Шаг, 	a, 		x\n");
	int i=1;
	fprintf(fp,"%d\t%f\t[%f,%f]\n",i,a,x0.x+p.x*a,x0.y+p.y*a);
	while(dy(a)*dy1>0)// пока производная не поменяла знак
	{
		i++;
		a*=2;// удваиваем шаг
		fprintf(fp,"%d\t%f\t[%f,%f]\n",i,a,x0.x+p.x*a,x0.y+p.y*a);
	};
	return a;
}

vect Davidon()
{
	double e=0.0000001;// погрешность
	double a=Swann4();
	fprintf(fp,"\nDavidon:\n");
	// устанавливаем интервал [a,b]
	double b=max(a,a/2);
	       a=min(a,a/2);
	double x1=0, z=0, w=0,delta=0;
	fprintf(fp,"\nШаг, 	[a	  b	  ]	 x1  			x\n");
	int i=1;
	fprintf(fp,"%d\t[%f %f]\n",i,a,b);
	do{
		z =dy(a)+dy(b)+3*(y(a)-y(b))/(b-a);
		w =sqrt(z*z-dy(a)*dy(b));
		delta =(z-dy(a)+w)/(dy(b)-dy(a)+2*w);
		x1=a+delta*(b-a);
		//сокращаем текущий интервал локализации
		if(dy(x1)>0) {b=x1;}
		else {a=x1;}
		fprintf(fp,"%d\t[%f %f]\t%f\t[%f%f]\n",i,a,b,x1,x0.x+p.x*x1,x0.y+p.y*x1);
		i++;
	}while(fabs(dy(x1))>e);
	vect res;
	res.x=x0.x+p.x*x1;
	res.y=x0.y+p.y*x1;
	printf("RESULT DAVIDON: x= [%f,%f]",res.x,res.y);
	return res;
}


vect Bolchan()
{
	double x1=0;
	double e=0.0000001;//погрешность
	double a=Swann4();// находим начальный шаг методом Свенна
	fprintf(fp,"\nBolchan:\n");
	// устанавливаем интервал [a,b]
	double b=max(a,a/2);
	       a=min(a,a/2);
	fprintf(fp,"\nШаг, 	[a	  b	  ]		x\n");
	int i=1;
		fprintf(fp,"%d\t[%f %f]\n",i,a,b);
	do{ x1=(a+b)/2;
		//сокращаем текущий интервал локализации
	    if(dy(x1)>0)
			b=x1;
		else
			a=x1;
		i++;	
	   fprintf(fp,"%d\t[%f %f]\t[%f %f]\n",i,a,b,x0.x+p.x*x1,x0.y+p.y*x1);
	  }while(abs(dy(x1))>e);
      vect res1;
	res1.x=x0.x+p.x*x1;
	res1.y=x0.y+p.y*x1;
	printf("\nRESULT BOLCHAN: x= [%f,%f]",res1.x,res1.y);
	return res1;
}

int _tmain(int argc, _TCHAR* argv[])
{
fp=fopen("log.txt","w");//открываем файл для записи
vect x=Davidon();
vect x2=Bolchan();
fclose(fp);
	return 0;
}

















Соседние файлы в папке Лабораторная работа №32