Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Лабораторная№1 вариант№4 / lab1v4
.cpp#include <conio.h>
#include <stdio.h>
#include <math.h>
//структура для передачи интервала
struct interval
{
double min_val;
double max_val;
};
//расчет значения функции в точке Х
double function(double x)
{
double x2 = x*x;
return (x2*x2-14*x2*x+60*x2-70*x);
}
//Реализация метода Свенна
struct interval Svenn(double x0)
{
struct interval result;
double d = 1;
int k;
double x1,x2,x3;
//Начальный этап
double func_x0 = function(x0);
double func_x1 = function(x0-d);
double func_x2 = function(x0+d);
double func_x3;
printf("\nMethod Svenna\n");
//Определяем направление поиска интервала
if (func_x1 <= func_x0 && func_x0 <= func_x2)
d *= -1;
//Если условие выполняется, то интервал найден
if (func_x1 > func_x0 && func_x0 <= func_x2)
{
result.min_val = x0-fabs(d);
result.max_val = x0+fabs(d);
return result;
}
//Получить точки Х1 и Х2
k = 0;
x1 = x0;
x2 = x0+d*(1<<k);
k++;
//Получить точку Х3
x3 = x1+d*(1<<k);
//Рассчитать значения функций в этих точках
//для уменьшения кол-ва вычислений функции
func_x1 = function(x1);
func_x2 = function(x2);
func_x3 = function(x3);
printf("Iteration %d. x1=%f x2=%f x3=%f d=%f\n",k,x1,x2,x3,d*(1<<k));
//Основной этап
while (func_x3 < func_x2)
{
k++;
//Находим следующие точки
x1 = x2;
x2 = x3;
x3 += d*(1<<k);
printf("Iteration %d. x1=%f x2=%f x3=%f d=%f\n", k, x1, x2, x3, d*(1<<k));
func_x2 = func_x3;
func_x3 = function(x3);
}
//Возвращаем найденный интервал
if (x1 > x3)
{
result.min_val = x3;
result.max_val = x1;
}
else
{
result.min_val = x1;
result.max_val = x3;
}
return result;
}
//Получение числа Фибоначчи
//Рекурсивная функция
int FNumber(int n)
{
if (n <= 1)
return 1;
else
return FNumber(n-1)+FNumber(n-2);
}
//Реализация метода Фибоначчи
double Fibonachchi(struct interval val,double eps)
{
int n;
double l,m;
//Начальный этап.
int k = 1;
printf("\nMethod Fibonachchi\n");
//Находим начальное число Фибоначчи
double Lk = val.max_val-val.min_val;
for (n=1;n<30;n++)
{
if ((double)FNumber(n) >= Lk/eps)
break;
}
//Находим две пробные точки
l = val.min_val+((double)FNumber(n-2)/(double)FNumber(n))*(val.max_val-val.min_val);
m = val.min_val+((double)FNumber(n-1)/(double)FNumber(n))*(val.max_val-val.min_val);
//Основной этап.
while (k < n-1)
{
//Сокращаем ТИЛ
//и находим новые точки для проверки
if (function(l)<function(m))
{
val.max_val = m;
m = l;
l = val.min_val + (double)FNumber(n-k-2)/(double)FNumber(n-k)*(val.max_val - val.min_val);
}
else
{
val.min_val = l;
l = m;
m = val.min_val+(double)FNumber(n-k-1)/(double)FNumber(n-k)*(val.max_val - val.min_val);
}
printf("Iteration %d: (%f,%f)\n",k,val.min_val,val.max_val);
k++;
}
//Находим аппроксимирующий минимум.
m = l + eps;
if (function(l) > function(m))
return (l+val.max_val)/2;
else
return (val.min_val+m)/2;
}
//Основная программа
int main(int argc,char* argv[])
{
double x;
double eps;
struct interval sv;
double res;
clrscr();
//Установка начальных данных
x = 2;
eps = 1e-2;
printf("Function: x^4-14*x^3+60*x^2-70*x\n");
printf("Begin point: %f\n",x);
printf("Eps: %f\n",eps);
//Получение интервала методом Свенна.
sv = Svenn(x);
printf("Svenn return interval = (%f,%f)\n",sv.min_val,sv.max_val);
//Получение локального минимума методом Фибоначчи
res = Fibonachchi(sv,eps);
printf("Fibonachchi result: %f\n",res);
getch();
return 0;
getch();
}
Соседние файлы в папке Лабораторная№1 вариант№4