Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Реализации различных алгоритмов на Си / поиск метод золотого сечения

.doc
Скачиваний:
24
Добавлен:
20.06.2014
Размер:
28.67 Кб
Скачать

Метод золотого сечения

#include <stdio.h>

#include <conio.h>

#include <math.h>

#include <locale.h>

float func(float x)

{

return sin(x*x/1)*exp(x/10)/(x*x+1);

}

void main()

{

char s[10];

FILE *fp;

float a, b, g, h, f1, f2, eps; //а,b - исходный интервал, g,h - точки золотого сечения, f1, f2 -

значение функции в этих точках

setlocale(LC_ALL,"Russian");

printf("введите имя файла для записи результатов:\n");

fp=fopen(gets(s), "w");

printf("введите границы вычисления:\n");

fprintf(fp, "введите границы вычисления:\n");

scanf("%f %f", &a, &b);

fprintf(fp, "%f %f\n", a, b);

printf("введите точность вычисления:\n");

fprintf(fp, "введите точность вычисления:\n");

scanf("%f", &eps);

fprintf(fp, "%f\n", eps);

g = a+(b-a)*(3-sqrtf(float(5)))/2;

h = a+(b-a)*(sqrtf(float(5))-1)/2;

f1 = func(g);

f2 = func(h);

printf ("находим минимум на [%f; %f]\n g=%f, f(g)=%f\n h=%f, f(h)=%f", a, b, g, f1, h, f2);

fprintf (fp, "находим минимум на [%f; %f]\n g=%f, f(g)=%f\n h=%f, f(h)=%f", a, b, g, f1, h,

f2);

while (abs(f1-f2) > eps)// проверка точности

{

if( f1<=f2 ) // минимум слева от f2

{

b = h;

h = g; //получили интервал от a до h

f2 = f1; //значение функции в новой точке h(которая раньше была точкой g)

g = a+(b-a)*(3-sqrtf(float(5)))/2;

f1 = func(g);

printf("\nминимум в пределах [%f; %f]\n g=%f h=%f\n f(g)=%f f

(h)=%f", a, b, g, h, f1, f2);

fprintf(fp, "\nминимум в пределах [%f; %f]\n g=%f h=%f\n f(g)=

%f f(h)=%f", a, b, g, h, f1, f2);

}

else // справа от f1

{

a = g;

g = h;

f1 = f2;

h = a+(b-a)*(sqrtf(float(5))-1)/2;

f2 = func(h);

printf("\nминимум в пределах [%f; %f]\n g=%f h=%f\n f(g)=%f f

(h)=%f", a, b, g, h, f1, f2);

fprintf(fp, "\nминимум в пределах [%f; %f]\n g=%f h=%f\n f(g)=

%f f(h)=%f", a, b, g, h, f1, f2);

}

}

printf("\nТОЧКА МИНИМУМА = %f\nМИНИМУМ ФУНКЦИИ = %f", (a+b)/2, func((a

+b)/2));

fprintf(fp, "\nТОЧКА МИНИМУМА = %f\nМИНИМУМ ФУНКЦИИ = %f", (a+b)/2, func

((a+b)/2));

fclose(fp);

getch();

}