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

Посчитать корни уравнения по методу дихотомии - C++

Восстановить пароль Регистрация
 
Андрей213
0 / 0 / 0
Регистрация: 21.04.2014
Сообщений: 13
21.04.2014, 19:25     Посчитать корни уравнения по методу дихотомии #1
Помогите найти ошибку
Нужно посчитать корни по методу дихотомии.
Когда в функции pow(x,4) - (13)*pow(x,2)+6; есть +6, не считает, когда нету, считает
И только один коень.
Заранее спасибо.
Если можно, объясните поп подробнее, а то Хочется все понять.


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
#include <iostream>
#include <stdio.h>
#include <conio.h>
#include <math.h>
using namespace std;
long float f(long float x, double const c = 1)
{
    return pow(x,4) - (13)*pow(x,2)+6;
    
}
long float n (long float x1, long float x2)
{
    long float x= (x2 + x1)/2;
    while (abs (f(x)) > 0.000001)
    {
        if ( f(x) > 0)
            x2= x1;
        else
        x1=x;
        x= (x1+x2)/2;
        
    }
    return x;
    
}
int main ()
{
    cout<<"x="<< n(-4, 4) << endl;
    
    
    
    system("pause");
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.04.2014, 19:25     Посчитать корни уравнения по методу дихотомии
Посмотрите здесь:

C++ корни уравнения
C++ корни квадратного уравнения
Найдите корни уравнения C++
C++ Корни квадратного уравнения
C++ Корни квадратного уравнения
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Меорн
74 / 59 / 29
Регистрация: 01.02.2014
Сообщений: 201
21.04.2014, 20:27     Посчитать корни уравнения по методу дихотомии #2
потому что http://www.cyberforum.ru/cgi-bin/latex.cgi?{x}^{4} - 13{x}^{2} + 6 = 0 не имеет корней.

Добавлено через 30 минут
сори это http://www.cyberforum.ru/cgi-bin/latex.cgi?{x}^{4} + 13{x}^{2} + 6 = 0 не имеет корней. Знак перепутал.

Добавлено через 2 минуты
нужно не:
C++
1
2
3
4
if ( f(x) > 0)
x2=x1;
else
x1=x;
а:
C++
1
2
3
4
if ( f(x) > 0)
x2=x;
else
x1=x;
Добавлено через 39 секунд
вместо
C++
1
x2=x1;
должно быть
C++
1
x2=x;
Добавлено через 9 минут
Смысл в том что если значение функции в точке X меньше ноля, то корень уравнения лежит справа на оси абсцисс от текущего X. Если же значение функции в точке X больше ноля, то слева.
Соответственно при отрицательном значении функции мы передвигаем левый конец отрезка в точку X, при положительном значении функции правый конец. Таким образом постепенно смыкая концы отрезка вокруг корня уравнения, пока не достигнем максимального допустимого отклонения от значения корня. В данном случае максимальное допустимое отклонение 0.000001.
Андрей213
0 / 0 / 0
Регистрация: 21.04.2014
Сообщений: 13
23.04.2014, 23:59  [ТС]     Посчитать корни уравнения по методу дихотомии #3
Спасибо, очнь тупо ошибся.
А если два ответа искать, то цикл делать?
Меорн
74 / 59 / 29
Регистрация: 01.02.2014
Сообщений: 201
24.04.2014, 11:27     Посчитать корни уравнения по методу дихотомии #4
В предыдущем посте забыл написать что это только при возрастании функции. При убывании все делается наоборот.

Программно реализовать нахождение корней уравнения методом дихотомии
Можно найти точки экстремума функции. Сравнить знаки функции на концах отрезков образованных точками экстремума функции. Если функция меняет знак, значит на отрезке есть корень. Причем только один, так как функция будет только возрастать или только убывать на отрезках между точками экстремума. Искать корни методом дихотомии на всех отрезках где знак функции изменяется.
Андрей213
0 / 0 / 0
Регистрация: 21.04.2014
Сообщений: 13
24.04.2014, 11:42  [ТС]     Посчитать корни уравнения по методу дихотомии #5
Нужно решить не линейное уравнение методом дихотомии. Сам метод я описал, просто у квадратных уравнений же два решения, и если обо лежат на выбраном пользователем промежутке, как найти оба? Я сделал программу с нахождением одной. Помогите вывести все решения, ведь уравнение может быть и биквадратным, там будет 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
48
49
50
51
52
53
#include <iostream>
#include <stdio.h>
#include <conio.h>
#include <math.h>
using namespace std;
long float f(long float x)
    {
    
cout<< "a*pow(x,y)+ b*pow(x,z) + d*pow(x,e) + c*pow(x,q) + m:"<< endl;
         double y, z,  q,  c, b, d, a, m,e;
         cout<<"a=:";
         cin>>a;
         cout<<"y =:";
        cin>>y;
        cout<<"b=:";
         cin>>b; 
         cout<<"z=:";
        cin >> z;
         cout<<"d=:";
         cin>>d;
         cout<<"e=:";
         cin>>e;
        cout<<"c=:";
        cin>> c;
        cout<<"q=:";
        cin>> q;
        cout<<"m=:";
        cin>>m;
        cout <<"   X=:";
        cout<< a*pow(x,y)+ b*pow(x,z) + d*pow(x,e) + c*pow(x,q) + m<< endl;
    return a*pow(x,y)+ b*pow(x,z) + d*pow(x,e) + c*pow(x,q) + m;
}
  
long float n (long float x1, long float x2)
{
     float x= (x2 + x1)/2;
    while (abs (f(x)) > 0.000001)
    {
        if ( f(x) > 0)
                    x2=x;
                else
                    x1=x;
        x= (x1+x2)/2;
        
    }
    return x;
    
}
int main ()
{
    cout<<"x="<< n(-4, 4) << endl;
    system("pause");
}
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
24.04.2014, 11:50     Посчитать корни уравнения по методу дихотомии #6
Цитата Сообщение от Андрей213 Посмотреть сообщение
не линейных уравнений
нелинейных уравнений
Цитата Сообщение от Андрей213 Посмотреть сообщение
Сам метод я описал, просто у квадратных уравнений же два решения, и если обо лежат на выбраном пользователем промежутке
Если у любого уравнения, хоть какого, даже с одним корнем, значения функции на границах промежутка одного знака, метод дихотомии работать не будет.

А когда ты берёшь квадратное уравнение с обоими корнями в заданном промежутке, то граничные значения будут именно одного знака - представь параболу!
Андрей213
0 / 0 / 0
Регистрация: 21.04.2014
Сообщений: 13
24.04.2014, 12:06  [ТС]     Посчитать корни уравнения по методу дихотомии #7
Как тогда найти все корни?
Может тогда делать этот метод много раз?(в цикле)
исключая каждый раз найденный корень из общего промежутка?
zss
Модератор
Эксперт С++
 Аватар для zss
5943 / 5548 / 1783
Регистрация: 18.12.2011
Сообщений: 14,167
Завершенные тесты: 1
24.04.2014, 12:12     Посчитать корни уравнения по методу дихотомии #8
Цитата Сообщение от Андрей213 Посмотреть сообщение
long float
Я что-то не знаю такого типа.
Есть float,double и long double
Андрей213
0 / 0 / 0
Регистрация: 21.04.2014
Сообщений: 13
24.04.2014, 12:16  [ТС]     Посчитать корни уравнения по методу дихотомии #9
long float тоже есть
_Ellen_
15 / 15 / 5
Регистрация: 28.11.2013
Сообщений: 50
24.04.2014, 12:28     Посчитать корни уравнения по методу дихотомии #10
Long float нет, скорее всего, компилятор будет воспринимать переменную как double.
Андрей213
0 / 0 / 0
Регистрация: 21.04.2014
Сообщений: 13
24.04.2014, 12:34  [ТС]     Посчитать корни уравнения по методу дихотомии #11
http://cppstudio.com/post/271/ там типы данных
zss
Модератор
Эксперт С++
 Аватар для zss
5943 / 5548 / 1783
Регистрация: 18.12.2011
Сообщений: 14,167
Завершенные тесты: 1
24.04.2014, 12:45     Посчитать корни уравнения по методу дихотомии #12
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
double n_root (double x1, double x2)
{
        double x;
        if(x1>x2)
        {
            double t=x1;x1=x2;x2=t;
        }
         double y1=f(x1);
         double y2=f(x2);
         if(y1*y2>0)
                return 0;// корни найти невозможно
        do
        {
            x= (x2 + x1)/2;
            double y=f(x);
            if ( y1*y > 0){x1= x;y1=y;}
            else{ x2= x;y2=y;}
      }while (fabs (y) > eps && x2-x1>eps)
 
    return x;
    
}
_Ellen_
15 / 15 / 5
Регистрация: 28.11.2013
Сообщений: 50
24.04.2014, 12:47     Посчитать корни уравнения по методу дихотомии #13
Вы приставкой long диапазон принимаемых значений float'а увеличиваете до double
Андрей213
0 / 0 / 0
Регистрация: 21.04.2014
Сообщений: 13
24.04.2014, 17:06  [ТС]     Посчитать корни уравнения по методу дихотомии #14
zss, Я что то не понял, что такое eps, и что это за функция? Можно подробнее?
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
24.04.2014, 17:15     Посчитать корни уравнения по методу дихотомии #15
Цитата Сообщение от zss Посмотреть сообщение
C++
1
if(y1*y2>0) return 0;// корни найти невозможно
zss,ты написал то, о чём я предупреждал выше. Для квадратного уравнения с обоими корнями, попадающими в заданный промежуток, это условие будет всегда выполняться и поиск ДВУХ корней методом дихотомии бессмысленен! (см.рис. 1 http://claw.ru/a-mathem/29/2/2_7.jpg)
Читай комментарии! Автор спрашивает, как искать два корня. Ответ: именно изначальным методом дихотомии - никак.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.04.2014, 20:36     Посчитать корни уравнения по методу дихотомии
Еще ссылки по теме:

C++ Решение нелинейного уравнения в общем виде, ввод с клавиатуры, метод дихотомии
Корни методом дихотомии C++
Найти все корни функции f(x) на интервале [-1;1] методом дихотомии с погрешностью 0.02. f(x)= (e^x)-arccos(x) C++

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

Или воспользуйтесь поиском по форуму:
zss
Модератор
Эксперт С++
 Аватар для zss
5943 / 5548 / 1783
Регистрация: 18.12.2011
Сообщений: 14,167
Завершенные тесты: 1
24.04.2014, 20:36     Посчитать корни уравнения по методу дихотомии #16
Цитата Сообщение от Андрей213 Посмотреть сообщение
что такое eps, и что это за функция
Это Ваша функция n. Но n использовать для названия функции некошено.
Поэтому я переименовал ее в n_root.
А eps - это константа определяющая точность.
Добавьте что-нибудь типа const double eps=1e-10;
Yandex
Объявления
24.04.2014, 20:36     Посчитать корни уравнения по методу дихотомии
Ответ Создать тему
Опции темы

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