Найти минимум и максимум заданной функции - C (СИ)
Формулировка задачи:
можно ли сделать так чтобы прогамма находил и выдавала минимум и максимум заданной функции (допустим y=x^2/2) при определенном шаге от х до какого нить числа неиспользуя массивы?
кто-нить помогите(
Решение задачи: «Найти минимум и максимум заданной функции»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define MAX_I 100000 //максимальное число итераций: так как не у всякой функции есть минимум или максимум, нужно учесть это, что бы программа была отказоустойчивой
double f (double x)
{
return 0.5*x*x; //f возвращает значение туда, где она вызывается
}
int lin_search (double (*f)(double), double a, double b, double eps, double *x)
{
double h = (b-a)/100; //это шаг линейного поиска, с шагом h мы будем идти по оси х и проверять значения функции
double t = a;
double prev = f(t); //это первое значение функции
double cur = f(t+h); //это следующее
int i;
for (i=0; i < MAX_I; i++) //здесь ставим ограничение на тот самый MAX_I, что бы программа не зацикливалась
{
while (cur > prev && t+h < b) //просто проверяем значения функции, если cur > prev, то максимум еще не найден и нужно идти дальше
{
t+=h;
prev = cur; //здесь продвигаем cur и prev на один шаг h
cur = f(t+h);
}
//если есть максимум на этом отрезке, то найдется cur < prev и цикл оборвется
//в этом случае поворачиваем назад и уменьшаем шаг поиска для увеличения точности
h /= -10;
if (fabs(h) < eps) break; //когда h станет достаточно малым, то выходим из цикла
}
if (i < MAX_I) // проверяем не зациклилась ли у нас функция, если нет, то меняем х и возвращаем положительный результат
{
*x = prev;
return i;
}
return -1; //иначе возвращаем отрицательное значение
}
int main (void)
{
double a, b, eps, x;
printf("Input a: "); scanf("%lf", &a);
printf("Input b: "); scanf("%lf", &b);
printf("Input eps: "); scanf("%lf", &eps);
if ( lin_search(f, a, b, eps, &x) > 0 ) printf("x = %lf - f(x) = %lf\n", x, f(x));
else printf("Bad luck, dude\n");
return 0;
}
Объяснение кода листинга программы
- Подключение необходимых библиотек для работы с числами и выполнения математических операций.
- Объявление функции
f, которая будет представлять собой квадратичную функцию видаf(x) = 0.5*x*x. - Объявление функции
lin_search, которая реализует метод линейного поиска минимума или максимума функцииfв заданном интервале[a, b]. В этой функции используется шаг поискаh, который изначально равен1/100от разностиb-a. - В цикле
forс ограничениемMAX_Iпроисходит поиск минимума или максимума функцииf. Если текущее значение функцииcurменьше предыдущегоprev, то происходит увеличение шага поискаhв 10 раз с целью уменьшения количества итераций и повышения точности результата. - Если в цикле найдено значение функции
curменьше предыдущегоprev, то текущий шаг поискаhуменьшается в 10 раз, и выполняется повторный поиск с новым шагом. - Если в цикле найдено значение функции
curменьше предыдущегоprev, то выполняется выход из цикла и возврат найденного значенияxи результата поиска. - Если цикл не был прерван из-за нахождения минимума или максимума, то программа выводит сообщение об ошибке.
- В функции
mainпроисходит ввод исходных данных: интервала[a, b]и точностиeps. - Вызов функции
lin_searchс передачей функцииf, интервала[a, b]и точностиepsв качестве аргументов. - Вывод результатов работы программы: найденного значения
xи значения функцииf(x).