Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.52/21: Рейтинг темы: голосов - 21, средняя оценка - 4.52
6 / 6 / 3
Регистрация: 12.03.2014
Сообщений: 341
1

Решение уравнения методом половинного деления и методом итераций

29.12.2015, 18:32. Показов 4260. Ответов 4
Метки нет (Все метки)

Решить уравнение следующими способами:
1) Метод половинного деления
2) Метод итераций
Уравнение: e^(x) - e^(-x) - 2 = 0
Отрезок, содержащий корень: [0;1]
Точное значение: 0,8814
---
Правильно ли я понимаю, что мне известны лишь уравнение и отрезок? Т.е. в самом конце дан ответ (0,8814), мне кажется.
В первом случае я делю отрезки пополам и выбираю для деления ту половину, которая по модулю ближе к 0, и все это происходит через рекурсию.
Про второй случай я ничего понятного для себя не смог найти. Можете рассказать про него простыми словами? Если исходить из названия метода, то кажется, что там надо перебирать по всему отрезку, и каждый раз, находя промежуток, уменьшать шаг и искать уже в более узком отрезке.
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.12.2015, 18:32
Ответы с готовыми решениями:

Решение уравнения методом половинного деления
Помогите пожалуйста с программой. Есть код для решения методом половинного деления для данного...

Решение уравнения методом половинного деления
Здравствуйте дорогие программисты, прошу помочь, только начал изучать программирование на языке...

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

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

4
Модератор
Эксперт С++
11117 / 9159 / 5502
Регистрация: 18.12.2011
Сообщений: 24,467
29.12.2015, 18:55 2
Цитата Сообщение от Bolbine84455 Посмотреть сообщение
выбираю для деления ту половину, которая по модулю ближе к 0
Выбирается та половина, где знаки остаются разные.

Метод итераций основан на том, что уравнение приводят к виду f(x)=x
Далее берется приближение x, вычисляется y=f(x), потом присваивается x=y
Повторяем до тех пор, пока модуль x-y станет меньше точности.
ex - e-x - 2 = 0
ex = e-x + 2
ln(ex) = ln(e-x + 2)
x= ln(e-x + 2)
1
6 / 6 / 3
Регистрация: 12.03.2014
Сообщений: 341
30.12.2015, 23:55  [ТС] 3
Можете оценить правильность решения?
Ответ не сходится с 0,8814. Я где-то ошибся? Менял тип на double, но результат не изменился.
Кликните здесь для просмотра всего текста

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
#include <iostream>
#include <stdlib.h>
#include <cmath>
 
using namespace std;
 
float solveEquation(float x)
{
    float y = log(exp((-1) * x) + 2);
    return y;
}
 
float solveByDivision(float a = 0.0, float b = 1.0, float eps = 0.001)
{
    float mid = (a + b) / 2;
    cout << (abs(solveEquation(mid))) << endl;
    float y;
    if (abs(b - a) > eps){
        if ( (solveEquation(a) * solveEquation(mid)) <= 0 ){
           y = solveByDivision(a, mid);
        }else{
           y = solveByDivision(mid, b);
        }
    }
    return y;
}
 
int main()
{
    setlocale(LC_ALL,"Russian");
    float res1 = solveByDivision();
    cout << "Ответ = " << res1 << endl;
    return 0;
}
Решение уравнения методом половинного деления и методом итераций


0
7 / 7 / 5
Регистрация: 27.07.2011
Сообщений: 32
31.12.2015, 00:01 4
Bolbine84455, а разве ответ там не должен зависеть от выбранной точности ? Может быть, причина именно в ней?
1
6 / 6 / 3
Регистрация: 12.03.2014
Сообщений: 341
31.12.2015, 01:39  [ТС] 5
в моем случае это не играет большую роль. 0,86 в любом случае получаю, сколько бы ни добавлял нулей.
wolfram alpha выдает график с приближенным ответом около 0,88. Все же я где-то ошибся ((

Добавлено через 34 минуты
Понятно, что я все неправильно понял. Переписываю код.

Вот теперь ответ меня устраивает: 0.881378
Кликните здесь для просмотра всего текста

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
#include <iostream>
#include <stdlib.h>
#include <cmath>
 
using namespace std;
 
float solveEquation(float x)
{
    return exp(x) - exp((-1) * x) - 2;
}
 
float solveByDivision(float a = 0.0, float b = 1.0, float eps = 0.0001)
{
    float mid = (a + b) / 2;
    if (abs(b - a) > eps){
        if ( (solveEquation(a) * solveEquation(mid)) <= 0 ){
           mid = solveByDivision(a, mid);
        }else{
           mid = solveByDivision(mid, b);
        }
    }
 
    return mid;
}
 
int main()
{
    setlocale(LC_ALL,"Russian");
    float res1 = solveByDivision();
    cout << "Ответ = " << res1 << endl;
    return 0;
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.12.2015, 01:39

Решение уравнения методом половинного деления
Помогите, пожалуйста, написать программу, которая будет решать уравнение на скрине методом...

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

Решение уравнения методом половинного деления
Здравствуйте! Задание прикрепил скриншотом. Никак не могу сообразить как его сделать. Только...

Методом деления отрезка пополам и методом итераций найти прибли-женное значение корня уравнения
Методом деления отрезка пополам и методом итераций найти прибли-женное значение корня уравнения x3...

Найти корни уравнения методом половинного деления
Здравствуйте!!! Найти корни уравнения методом половинного деления на интервале от a до b c...

Найти корень уравнения методом половинного деления
Найти корень уравнения методом половинного деления x^2-1/2=0


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

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

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