Форум программистов, компьютерный форум CyberForum.ru

Нахождение экстремума min методом половинного деления - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 26, средняя оценка - 4.62
Basill
 Аватар для Basill
40 / 40 / 13
Регистрация: 16.02.2013
Сообщений: 197
07.05.2013, 00:04     Нахождение экстремума min методом половинного деления #1
Вообщем проблема такая, препод сказал реализовать метод половинного деления для нахождения экстремума функции с точностью 10^-4.
Сделал лабу предоставив код преподу:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#define _USE_MATH_DEFINES
#include <cmath>
#include <math.h>
#include <iostream> 
#include <clocale>
#include <conio.h>
using namespace std;
 
float f(float x)
{
    return  (2*x)*(2*x)+x*0.5;
}
void main()
{   setlocale (LC_ALL, "Russian");
    float a,b,d,x;
    int N=1;
    cout << "Метод половинного деления (метод дихотомии):" << endl;
    cout << "a = "; cin >> a;
    cout << "b = "; cin >> b;
    cout << "Точность: "; cin >> d;
    do
    {
        x = (a + b) / 2.;
        if (f(a) * f(x) < 0)
        {
            b = x;
        }
        else if (f(x) * f(b) < 0)
        {
            a = x;
        }
        else if ((f(x) * f(b) == 0) && (f(x) * f(a) == 0))
        {
            cout << "Корень x = " << x << endl;
            break;
        }
        else
        {
            cout << "В указанном интервале корней нет, или больше одного." << endl;
            break;
        }
        cout << "N = " << N << "  x = " << x << endl;
        N++;
    }
    while (fabs(a - b) > d);
   getch();
}
Препод глянул и сказал что я нашел корень этого уравнения, а надо найти минимум и сказал про 3 отрезка каких то, типо наш заданный интервал [a,b] делится на 3 отрезка и там находится.

Добавлено через 56 секунд
мое уравнение
Цитата Сообщение от Basill Посмотреть сообщение
(2*x)*(2*x)+x*0.5;
Добавлено через 3 часа 4 минуты
upp
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.05.2013, 00:04     Нахождение экстремума min методом половинного деления
Посмотрите здесь:

C++ Кубическое уравнение методом половинного деления
C++ Нахождение площади методом половинного деления
Найти корень уравнения методом половинного деления C++
C++ Вычислить корень уравнения на отрезке [a; b] с точностью eps=0.000001, методом половинного деления
Решение уравнения методом половинного деления C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
sl_k
12 / 12 / 0
Регистрация: 15.04.2010
Сообщений: 61
07.05.2013, 14:28     Нахождение экстремума min методом половинного деления #2
Минимум функции находится в точке, где производная функции равна нулю.
Производную, действительно, можно искать методом половинного деления (метод конечных разностей).
f'(x)=(f(a) - f(b))/2, и так в обе стороны, пока a_i, b_i не будут бесконечно близки и f'(x) не будет равен нулю (c нужной точностью). Среди всех нулевых значений производной f'(x) выбрать минимальное значение самой функции f(x) в точке x.
Экстремумы функции

Добавлено через 1 час 31 минуту
f'(x)=(f(a)-f(b))/(¦a-b¦)
Basill
 Аватар для Basill
40 / 40 / 13
Регистрация: 16.02.2013
Сообщений: 197
07.05.2013, 15:52  [ТС]     Нахождение экстремума min методом половинного деления #3
Это то все понятно мне то как подправить то?
sl_k
12 / 12 / 0
Регистрация: 15.04.2010
Сообщений: 61
08.05.2013, 19:36     Нахождение экстремума min методом половинного деления #4
Вроде должно работать проверил на интервале [-1; 50]
Теория тут:
http://webmath.exponenta.ru/s/kiselev1/node87.htm

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <cmath>
#include <math.h>
#include <iostream>
#include <clocale>
using namespace std;
 
float f(float x)
{
    return  (2*x)*(2*x)+x*0.5;
}
int main()
{   setlocale (LC_ALL, "Russian");
    float a,b,d,x;
    int N=1;
    cin << a;
    cin << b;
    cin << d;
    double sigma = d/2-d/4;
 
    cout << "Метод половинного деления (метод дихотомии):" << endl;
     do
    {
        x = (a + b) / 2.;
        float l = x - sigma;
        float r = x + sigma;
 
        if (f(l) <=  f(r))
        {
            b = r;
        }
        else if (f(l) > f(r))
        {
            a = l;
        }
          cout << "N = " << N << "  x = " << x << endl;
        N++;
    }
    while (fabs(a - b) > d);
   return 0;
}
Yandex
Объявления
08.05.2013, 19:36     Нахождение экстремума min методом половинного деления
Ответ Создать тему
Опции темы

Текущее время: 19:37. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru