Найти минимум и максимум заданной функции - 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;
}

Объяснение кода листинга программы

  1. Подключение необходимых библиотек для работы с числами и выполнения математических операций.
  2. Объявление функции f, которая будет представлять собой квадратичную функцию вида f(x) = 0.5*x*x.
  3. Объявление функции lin_search, которая реализует метод линейного поиска минимума или максимума функции f в заданном интервале [a, b]. В этой функции используется шаг поиска h, который изначально равен 1/100 от разности b-a.
  4. В цикле for с ограничением MAX_I происходит поиск минимума или максимума функции f. Если текущее значение функции cur меньше предыдущего prev, то происходит увеличение шага поиска h в 10 раз с целью уменьшения количества итераций и повышения точности результата.
  5. Если в цикле найдено значение функции cur меньше предыдущего prev, то текущий шаг поиска h уменьшается в 10 раз, и выполняется повторный поиск с новым шагом.
  6. Если в цикле найдено значение функции cur меньше предыдущего prev, то выполняется выход из цикла и возврат найденного значения x и результата поиска.
  7. Если цикл не был прерван из-за нахождения минимума или максимума, то программа выводит сообщение об ошибке.
  8. В функции main происходит ввод исходных данных: интервала [a, b] и точности eps.
  9. Вызов функции lin_search с передачей функции f, интервала [a, b] и точности eps в качестве аргументов.
  10. Вывод результатов работы программы: найденного значения x и значения функции f(x).

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 3.667 из 5
Похожие ответы