Найти минимум и максимум заданной функции - 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)
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д