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

        //функция нахождения числа Фибоначчи с номером N
int fib(const int n){
   int f1=1,f2=1,f=1;
     for (int i=1;i<n;i++){
     f=f1+f2;
     f1=f2;
     f2=f;}
   return f;}

      //целевая функция
      //возвращает значение функции в точке абсциссы
double fun(const double x){
return 2*x*x-exp(x);
}
      //возвращает номер числа Фибоначчи
      //которое оказывается больше g
int get_n(const double g){
   int i=1,f1=1,f2=1,f=1;
   while (f<=g) {
     f=f1+f2;
     f1=f2;
     f2=f;
     i++;}
   return i;
}
      //алгоритм Свенна, выбирающий интервал неопределенности
bool Swann(float start_point,double *a,double *b){
double t=0.3,d,x1,x2,x3;
int k=0;
   if ((fun(start_point-t)>=fun(start_point))&&(fun(start_point)<=fun(start_point+t))){
        *a=start_point-t; *b=start_point+t; return true;}
   else if ((fun(start_point-t)<=fun(start_point))&&(fun(start_point)>=fun(start_point+t)))
        return false;
   if ((fun(start_point-t)>=fun(start_point))&&(fun(start_point)>=fun(start_point+t))) {
        d=t; *a=start_point; x1=start_point+t; k++;}
   else if ((fun(start_point-t)<=fun(start_point))&&(fun(start_point)<=fun(start_point+t))) {
        d=-t; *b=start_point; x1=start_point-t; k++;}
  x2=x1+2*d;
  if (fun(x2)<fun(x1))
   while (true){
     if (d==t) *a=x1; else *b=x1;
     k++;
     x1=x2;
     x2=x1+pow(2,k)*d;
     if (fun(x2)>=fun(x1)) break;
   }
   if (k==1) if (d==t) *b=x2; else *a=x2;
   else  if (d==t) *b=x1; else *a=x1;
return true;
}

int main() {
double x1,x2,a,b,eps=0.001;
if (!Swann(1,&a,&b)) printf("Функция на искомом интервале не является унимодальной");
printf("____Welocome to Algorithm Fibonacci I____ \n");
printf("Interval Swann's  [%.3f;%.3f]\n",a,b);
double g=(b-a)/eps;                  
int n=get_n(g);                      //рассчитываем количество итераций
eps=(b-a)/(double)fib(n+1);
x1=a+((double)fib(n-2)/fib(n))*(b-a); //начальный этап, выбор первых 2-х точек
x2=a+((double)fib(n-1)/fib(n))*(b-a);
printf(" ________________________________________________________\n");
printf("|  k |     a      |     x1     |     x2     |      b     |\n");
printf("|----|------------|------------|------------|------------|\n");
       //основной этап
  for (int k=1;k!=n-1;k++){
    printf("| %2d | %9.6f  | %9.6f  | %9.6f  | %9.6f  |\n",k,a,x1,x2,b);
        // рассматриваем два случая и вычисляем одну новую точку
    if (fun(x1)<fun(x2)) {b=x2;x2=x1;
                          x1=a+((double)fib(n-k-2)/fib(n-k))*(b-a);}
    else {a=x1;x1=x2;
          x2=a+((double)fib(n-k-1)/fib(n-k))*(b-a);};
  }
printf("|--------------------------------------------------------|\n");
x2=x1+eps;
if (fun(x1)>fun(x2)) x1=(x1+b)/2; else x1=(a+x2)/2;     //находим приближение к минимуму
   //выводим результаты
printf("Ln=%f\n",eps);
printf("K=%d\n",n-1);
printf("0.357403 - right answer\n");
printf("%f - our answer\n\n<PRESS  ANY  KEY TO QUIT>",x1);
getch();
}
//---------------------------------------------------------------------------
   








Соседние файлы в папке Лабораторная работа №13
  • #
    01.05.201498 б1Project2.bpf
  • #
    01.05.20143.48 Кб1Project2.bpr
  • #
    01.05.2014876 б1Project2.res
  • #
    01.05.2014196.61 Кб1Project2.tds
  • #
    01.05.20143.47 Кб1Project2.~bpr
  • #
    01.05.20143.35 Кб1Unit1.cpp
  • #
    01.05.2014328 б1Unit1.dfm
  • #
    01.05.2014750 б2Unit1.h
  • #
    01.05.201425.48 Кб1Unit1.obj
  • #
    01.05.20143.35 Кб1Unit1.~cpp
  • #
    01.05.2014750 б1Unit1.~h