Реализации различных алгоритмов на Си / поиск метод золотого сечения
.docМетод золотого сечения
#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();
}