Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
1
Добавлен:
01.05.2014
Размер:
3.43 Кб
Скачать
/*
	File laba_4.cpp
	Created by Lavrentiev Danil, Sivkov Andrey.
	Copyright (C) 2005 Lavrentiev Danil, Sivkov Andrey.
	All rights reserved.
*/
#include "stdafx.h"
#include "stdio.h"
#include "conio.h"
#include "math.h"

#define E 0.00001

class GZ	{
				private:	
					double x1[3], p[3], X[3];
					int ID;
				
				public:
					double Func (void);
					double FuncDif(void);
					double FuncDifId (int id);
					void MoveXId (double Alfa);
					void LineFind (void);
					void Find (double *x);

					double mod (double x)
					{
						return (x > 0) ? x : -x;
					}
				
					GZ(double a, double b, double c)
					{
						x1[0]=a; x1[1]=b; x1[2]=c;
					}
			};

double GZ::Func (void)
{
	return (X[0]-1)*(X[0]-1)+(X[1]-3)*(X[1]-3)+4*(X[2]+5)*(X[2]+5);
}

double GZ::FuncDif (void)
{
	return p[0]*FuncDifId(0)+p[1]*FuncDifId(1)+p[2]*FuncDifId(2);
}

double GZ::FuncDifId (int id)
{
	if (id==0) return 2*(X[0]-1);
	if (id==1) return 2*(X[1]-3);
	if (id==2) return 8*(X[2]+5);
}


void GZ::MoveXId (double Alfa)
{
	X[ID] = x1[ID] + Alfa*p[ID];
	 
}

void GZ::LineFind (void)
{
	X[0] = x1[0]; X[1] = x1[1]; X[2] = x1[2];
	p[ID] = FuncDifId (ID);

	double AlfaA, AlfaB, AlfaC, AlfaD, Fa, Fb, Fc, Fd; 

	//************** Swann 4 **************
	Fa = FuncDif(), 
	AlfaB = 0.001*Func();
		
	if (FuncDif()>0) p[ID] = -p[ID];
	
	do
	{
		MoveXId (AlfaB); AlfaB = AlfaB*2;
	}
	while (Fa*(Fa=FuncDif()) < 0);
	
	AlfaA = AlfaB/2;

	//************** ЗС **************
	double t1 = (sqrt(5)-1)/2, t2 = 1-(sqrt(5)-1)/2;
	int k=3;
	
	AlfaC = AlfaA + t2*(AlfaB-AlfaA); 
	AlfaD = AlfaA + t1*(AlfaB-AlfaA);
	
	MoveXId (AlfaC); Fa = Func();
	MoveXId (AlfaD); Fb = Func();
	
	do
	{
		if (Fa < Fb)
		{
			AlfaB = AlfaD; AlfaD = AlfaC; AlfaC = AlfaA + t2*(AlfaB-AlfaA); 
			Fb = Fa; MoveXId (AlfaC);
			Fa = Func();
		}
		else
		{
			AlfaA = AlfaC; AlfaC = AlfaD; AlfaD = AlfaA + t1*(AlfaB-AlfaA);
			Fa = Fb; MoveXId (AlfaD);
			Fb = Func();
		}
	}
	while (k--);

	//************** Paulla **************
	bool b=1;
	AlfaC = AlfaB; AlfaB=(AlfaA+AlfaC)/2;
	k=1;
	
	MoveXId (AlfaA); Fa = Func();
	MoveXId (AlfaB); Fb = Func();
	MoveXId (AlfaC); Fc = Func();
	
	do
	{
		if (k==1) AlfaD=(Fa*(AlfaB*AlfaB-AlfaC*AlfaC)+Fb*(AlfaC*AlfaC-AlfaA*AlfaA)+Fc*(AlfaA*AlfaA-AlfaB*AlfaB))/(2*(Fa*(AlfaB-AlfaC)+Fb*(AlfaC-AlfaA)+Fc*(AlfaA-AlfaB)));
		else AlfaD = (AlfaA+AlfaB)/2 + ((Fa-Fb)*(AlfaB-AlfaC)*(AlfaC-AlfaA))/(2*(Fa*(AlfaB-AlfaC)+Fb*(AlfaC-AlfaA)+Fc*(AlfaA-AlfaB)));
		
		MoveXId (AlfaD); Fd = Func(); k++;

		if (mod(1-AlfaD/AlfaB)>E && mod(1-Fd/Fb)>E)
		{
			if (AlfaB < AlfaD && Fb < Fd) {AlfaC = AlfaD; Fc = Fd;}
			else if (AlfaB < AlfaD && Fb > Fd) {AlfaA = AlfaB; AlfaB = AlfaD; Fa = Fb; Fb = Fd;}
			else if (AlfaB > AlfaD && Fb < Fd) {AlfaA = AlfaD; Fa = Fd;}
			else if (AlfaB > AlfaD && Fb > Fd) {AlfaC = AlfaB; AlfaB = AlfaD; Fc = Fb; Fb = Fd;}
		}
		else b=0;

	}
	while (b);
	
	MoveXId ((AlfaB+AlfaD)/2);
	x1[ID] = X[ID];
}

void GZ::Find (double *x)
{
	do
	{
		p[0] = FuncDifId(0);
		p[1] = FuncDifId(1);
		p[2] = FuncDifId(2);
		ID = 0; LineFind();
		ID = 1; LineFind();
		ID = 2; LineFind();
	}
	while (mod(FuncDif())>E);

	x[0]=x1[0]; x[1]=x1[1]; x[2]=x1[2];
}

void main (void)
{
	double X[3];
	GZ F(4, -1, 2);
	
	F.Find(X);
	printf ("\nX={%f, %f, %f}\n", X[0], X[1], X[2]);
}
Соседние файлы в папке MO_Lab4