Скачиваний:
6
Добавлен:
03.06.2014
Размер:
3.11 Кб
Скачать
// 2_laba_03_14.cpp: определяет точку входа для консольного приложения.
//

#include "stdafx.h"

#include <iostream>
#include <conio.h>
#include <math.h>
using namespace std;


int k,temp;


double f (double x)
 {
  return (2*pow(x,2)-exp(x));
}



long fibonachi (long x)
{
 long s, tmp;
 if(x>=1)
  {
   s=1; //F1
   tmp=0;
   for(long k=0; k<x; k++)
    {
     s=s+tmp;//Fn=F(n-1)+F(n-2) 
     tmp = s-tmp;//F(n-1)=F(n)-F(n-2) 
    }
   return s;
  }
 else
  return 1;
}



void swann(double *a, double *b, double x0, double h)
 {
   
   double x1=x0+h;
    if(f(x0)<f(x1))
     {
      h=-h;
      x1=x0+h;
     }
    do
     {
      h=2*h;
      x1=x1+h;
      k++;
     }
    while(f(x1-h)>f(x1));
	if(h > 0){
		*a = x1-h;// определение а и b в зависимости от направления h
		*b = x1+h;
	} else {
		*a = x1+h;
		*b = x1-h;
	}
 }


void fib( double a,  double b)
{
 double x2, x0 , x1;
 int k=0, n=0;
 double a1, b1;
 double L1, Ln, Fn, e;
 
L1 = fabs(b - a);
Ln = 0.000001;
Fn = L1/Ln;

	while (fibonachi(n)<Fn) {n++;}
	Fn=fibonachi(n);

	e = ( L1 / fibonachi(n+1) ) - Ln * 0.1;
	if (e<0) {cout<<"Error!"<<endl; exit;}


	x1 = a + fibonachi(n-1) * L1 / Fn + pow(double(-1),n) * e / Fn;
k=1;
	while (n!=k)
	 {
	   x2 = a + b - x1;
	   if ((x1<x2) & (f(x1)<f(x2)))
	    {
	      b=x2;
	    }
	   if ((x1<x2) & (f(x1)>=f(x2)))
	    {
	      a=x1;
	      x1=x2;
	    }
	   if ((x1>x2) & (f(x1)<f(x2)))
	    {
	      a=x2;
	    }
	   if ((x1>x2) & (f(x1)>=f(x2)))
	    {
	      b=x1;
	      x1=x2;
	    }
	   k++;
	 }
cout<<endl;
cout<<"Fibbonachi - "<<x2<<", Iterations  n="<<k<<endl;
}
void Sveng3( double x1, double *a, double* b, double* c, double h, double d) {
		double x2, mu, la;
 int k=0;
 if(d!=0)
 x1=d;
 x2=x1+h;
 if (f(x2)>f(x1)){
 h=-h;
 x2=x1+h;}
 while(f(x2)<f(x1)){
 x1=x2;
 x2=x1+h;
 k++;}
 mu=(x1+x2)/2;
 la=x1-0.5*h;
 if(f(x1)<f(mu)){
 *b=x1;
 if(la<mu){
 *a=la;
 *c=mu;}
 else{
 *a=mu;
 *c=la;}}
 else{
 *b=mu;
 if(x1<x2){
 *a=x1;
 *c=x2;}
 else{
 *a=x2;
 *c=x1;}}}

		
		


double d_swann_k(double *a,double *b, double *c,double x0, double h)
{
  k=1;
  temp=1;
  double x1,d,x,e=0.00000001;
  d=0;

 do {
	 Sveng3(x0, a, b, c, h, d);

    d = *b + 0.5*(*b - *a)*(f(*a) - f(*c))/(f(*a) - 2*f(*b) + f(*c));
 if(fabs((*b-d)/(*b))<=e && fabs((f(*b)-f(d))/f(*b))<=e)
     return (*b+d)/2;
    else
     {
      if(f(*b)<f(d))
       x0=(*b);
      else
       x0=d;
     }
    h=h/2;
    temp++;
   }
  while(1);
}



void main()
{

   double h=0.01,a,b,c,x0=1,e=0.001;
   cout<<"Epsilon="<<e<<"  x0="<<x0<<endl;
   cout<<endl;
   cout<<"Swann "<<endl;
   swann(&a,&b,x0,h);
   cout<<"a="<<a;
   cout<<"  b="<<b;
   cout<<"  k="<<k<<endl;
   cout<<endl;

   double x=x0;
   fib(a,b);


  double min=d_swann_k(&a,&b,&c,x0,h);

   cout<<"d_Swann_k"<<"  "<<   min <<"  Iterations" <<" " << temp;
   getch();
}

Соседние файлы в папке р 1-5, 2 вар.; 7 лаб. метод Полака Рибьера + Лекции МО + перевод ГА