Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Лабораторная работа №43 / MO_Lab4 / laba_4
.cpp/*
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