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