Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.78/50: Рейтинг темы: голосов - 50, средняя оценка - 4.78
40 / 40 / 34
Регистрация: 16.02.2013
Сообщений: 197
1

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

07.05.2013, 00:04. Просмотров 9207. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.05.2013, 00:04
Ответы с готовыми решениями:

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

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

Нахождение корня уравнения методом половинного деления
Вообщем дорогие друзья спасайте. Препод сказал сделать программу которая решает методом половинного...

Решение уравнения методом половинного деления и методом итераций
Решить уравнение следующими способами: 1) Метод половинного деления 2) Метод итераций Уравнение:...

3
12 / 12 / 4
Регистрация: 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
40 / 40 / 34
Регистрация: 16.02.2013
Сообщений: 197
07.05.2013, 15:52  [ТС] 3
Это то все понятно мне то как подправить то?
0
12 / 12 / 4
Регистрация: 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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.05.2013, 19:36

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

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

Поиск элемента методом половинного деления
Привет ребята. Такая проблема не могу реализовать метод половинного деления для поиска...

Решение уравнения методом половинного деления
Решение уравнения методом половинного деления. \sqrt{x} - x + 3 = 0 Программа работает...

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


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

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