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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 26, средняя оценка - 4.62
Basill
40 / 40 / 13
Регистрация: 16.02.2013
Сообщений: 197
#1

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

07.05.2013, 00:04. Просмотров 4058. Ответов 3
Метки нет (Все метки)

Вообщем проблема такая, препод сказал реализовать метод половинного деления для нахождения экстремума функции с точностью 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
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.05.2013, 00:04
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Нахождение экстремума min методом половинного деления (C++):

Нахождение площади методом половинного деления - C++
Народ подскажите как находить площадь фигуры методом половинного деления, Вот фигура напрвте как решать метод половинного деления знаю...

Нахождение минимума функции методом половинного деления - C++
Есть программа нахождения корня методом половинного деления. Как ее переделать, чтобы она находила минимум функции и выводила график не...

Поиск экстремума методом деления отрезка пополам - C++
Выдаёт ошибку в 15 строчке. Не могу понять в чём дело, помогите) #include&lt;iostream&gt; #include&lt;math.h&gt; #include&lt;cmath&gt; ...

Решение уравнения методом половинного деления и методом итераций - C++
Решить уравнение следующими способами: 1) Метод половинного деления 2) Метод итераций Уравнение: e^(x) - e^(-x) - 2 = 0 Отрезок,...

Решение уравнения методом половинного деления - C++
sin(ln x) - cos(ln x) + 2ln x интервал значение корня 1.3749

Угадать число методом половинного деления - C++
Загадывается число от 1 до 1000 и компьютер его угадывает согласно подсказкам больше или меньше. Используем метод половинного деления.

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
sl_k
12 / 12 / 0
Регистрация: 15.04.2010
Сообщений: 61
07.05.2013, 14:28 #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¦)
1
Basill
40 / 40 / 13
Регистрация: 16.02.2013
Сообщений: 197
07.05.2013, 15:52  [ТС] #3
Это то все понятно мне то как подправить то?
0
sl_k
12 / 12 / 0
Регистрация: 15.04.2010
Сообщений: 61
08.05.2013, 19:36 #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;
}
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.05.2013, 19:36
Привет! Вот еще темы с ответами:

Решение уравнения методом половинного деления - C++
Написать программу, которая решает заданное уравнение численным методом деления пополам. Должен быть найден один действительный корень с...

Кубическое уравнение методом половинного деления - C++
Дано кубическое уравнение x^3 + a*x^2 + b*x + c = 0 имеющие три действительных корня на отрезке (-10; 10). Найти корни уравнения с...

Решение уравнения методом половинного деления - C++
Решение уравнения методом половинного деления. \sqrt{x} - x + 3 = 0 Программа работает только положительных значениях...

Где тут в коде происходит нахождение корня? (метод половинного деления) - C++
не пойму где в коде происходит вычисление корня по методу половинного деления #include &lt;stdio.h&gt; #include &lt;windows.h&gt; #include...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
08.05.2013, 19:36
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru