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

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

Войти
Регистрация
Восстановить пароль
 
 
Андрей213
0 / 0 / 0
Регистрация: 21.04.2014
Сообщений: 13
#1

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

21.04.2014, 19:25. Просмотров 1476. Ответов 15
Метки нет (Все метки)

Помогите найти ошибку
Нужно посчитать корни по методу дихотомии.
Когда в функции 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");
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.04.2014, 19:25
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Посчитать корни уравнения по методу дихотомии (C++):

Отделить корни уравнения графически. Уточнить корни уравнения методом половинного деления - C++
Здравствуйте, господа программисты, помогите пожалуйста код написать, очень нужна ваша помощь) Вот задание: &quot; Отделить корни уравнения...

Корни методом дихотомии - C++
Необходимо найти корни методом дихотомии, F(x)=x^3-3*x^2+x-10, с точностью e=0.01. На бумаге вроде что то получилось найти через...

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

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

корни уравнения - C++
дана функция. ax^2+bx+с Преобразовать функцию таким образом,чтобы функция возвращала результат,который бы распечатывался после точки...

Найти корни уравнения - C++
найти корни уравнения f(x)=2x^3-3x^2-3x+2=0

15
Меорн
76 / 61 / 29
Регистрация: 01.02.2014
Сообщений: 208
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.
1
Андрей213
0 / 0 / 0
Регистрация: 21.04.2014
Сообщений: 13
23.04.2014, 23:59  [ТС] #3
Спасибо, очнь тупо ошибся.
А если два ответа искать, то цикл делать?
0
Меорн
76 / 61 / 29
Регистрация: 01.02.2014
Сообщений: 208
24.04.2014, 11:27 #4
В предыдущем посте забыл написать что это только при возрастании функции. При убывании все делается наоборот.

Программно реализовать нахождение корней уравнения методом дихотомии
Можно найти точки экстремума функции. Сравнить знаки функции на концах отрезков образованных точками экстремума функции. Если функция меняет знак, значит на отрезке есть корень. Причем только один, так как функция будет только возрастать или только убывать на отрезках между точками экстремума. Искать корни методом дихотомии на всех отрезках где знак функции изменяется.
1
Андрей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");
}
0
Kuzia domovenok
2128 / 1956 / 195
Регистрация: 25.03.2012
Сообщений: 6,808
Записей в блоге: 1
24.04.2014, 11:50 #6
Цитата Сообщение от Андрей213 Посмотреть сообщение
не линейных уравнений
нелинейных уравнений
Цитата Сообщение от Андрей213 Посмотреть сообщение
Сам метод я описал, просто у квадратных уравнений же два решения, и если обо лежат на выбраном пользователем промежутке
Если у любого уравнения, хоть какого, даже с одним корнем, значения функции на границах промежутка одного знака, метод дихотомии работать не будет.

А когда ты берёшь квадратное уравнение с обоими корнями в заданном промежутке, то граничные значения будут именно одного знака - представь параболу!
0
Андрей213
0 / 0 / 0
Регистрация: 21.04.2014
Сообщений: 13
24.04.2014, 12:06  [ТС] #7
Как тогда найти все корни?
Может тогда делать этот метод много раз?(в цикле)
исключая каждый раз найденный корень из общего промежутка?
0
zss
Модератор
Эксперт С++
6876 / 6438 / 2155
Регистрация: 18.12.2011
Сообщений: 16,924
Завершенные тесты: 1
24.04.2014, 12:12 #8
Цитата Сообщение от Андрей213 Посмотреть сообщение
long float
Я что-то не знаю такого типа.
Есть float,double и long double
0
Андрей213
0 / 0 / 0
Регистрация: 21.04.2014
Сообщений: 13
24.04.2014, 12:16  [ТС] #9
long float тоже есть
0
_Ellen_
15 / 15 / 5
Регистрация: 28.11.2013
Сообщений: 50
24.04.2014, 12:28 #10
Long float нет, скорее всего, компилятор будет воспринимать переменную как double.
0
Андрей213
0 / 0 / 0
Регистрация: 21.04.2014
Сообщений: 13
24.04.2014, 12:34  [ТС] #11
http://cppstudio.com/post/271/ там типы данных
0
zss
Модератор
Эксперт С++
6876 / 6438 / 2155
Регистрация: 18.12.2011
Сообщений: 16,924
Завершенные тесты: 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;
    
}
1
_Ellen_
15 / 15 / 5
Регистрация: 28.11.2013
Сообщений: 50
24.04.2014, 12:47 #13
Вы приставкой long диапазон принимаемых значений float'а увеличиваете до double
0
Андрей213
0 / 0 / 0
Регистрация: 21.04.2014
Сообщений: 13
24.04.2014, 17:06  [ТС] #14
zss, Я что то не понял, что такое eps, и что это за функция? Можно подробнее?
0
Kuzia domovenok
2128 / 1956 / 195
Регистрация: 25.03.2012
Сообщений: 6,808
Записей в блоге: 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)
Читай комментарии! Автор спрашивает, как искать два корня. Ответ: именно изначальным методом дихотомии - никак.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.04.2014, 17:15
Привет! Вот еще темы с ответами:

Найти корни уравнения - C++
f(x)=6x4+19x3-7x2-26x+12=0

Найти корни уравнения - C++
Написать программу, которая находит корни уравнения e^x=x+2 с погрешностью 10^-10. Заранее благодарен.

Найдите корни уравнения - C++
используя подпрограмму вычисления корней уравнения ctg(x)=a в интервале (0,2 pi), найдите корни уравнения ctg(bx-a)=c и ctg(b-y)=c^2....

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


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

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

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