0 / 0 / 0
Регистрация: 06.11.2018
Сообщений: 43
1

Функция нахождения корня полинома

24.02.2020, 16:26. Показов 5225. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
На входе функции find, должен быть массив коэффициентов при степенях x, функции f. (коэффициенты (d,s,j)) Сами коэффициенты должны вводиться с клавиатуры.
Проблема в том, что даже если корень попадает в интервал. Выдает, что интервал некорректный.
И вообще, можно это как-нибудь по-другому реализовать?
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
double f(double x)
{
    return  d*pow(x, 3) + s*pow(x, 2) - j*x;
}
double find(double mas[],double a, double b, double e)
{
    mas[1] = d;
    mas[2] = s;
    mas[3] = j;
   int iter = 0;
    double c = 0;
    if (f(a) * f(b) < 0) {
        do {
            c = (a + b) / 2;
            if (f(a) * f(c) < 0)
                b = c;
            else a = c;
            iter++;
        } while ((b - a) >= e);
        cout << " количество итераций:" << iter << endl;
        cout << "первый корень:" << c << endl;
    }
    else
        cout << "некорректный интервал" << endl;
    return c;
}
 
int main()
{
    setlocale(LC_ALL, "RU");
    double * mas = new double[3];
    cout << "введите коэффициенты при степенях х"<<endl;
    for (int i = 0; i < 3; i++)
    {
        cin>>mas[i];
    } 
    cout << "введите интервал" << endl;
    cin >> a >> b;
    find(mas, a, b, e);
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.02.2020, 16:26
Ответы с готовыми решениями:

Рекурсивный метод нахождения корня
Здравствуйте. В университете дали задание: &quot;Вычислить значение Х = корень из а используя формулу...

Комбинированный метод нахождения корня уравнения
Всем здравствуйте, у меня такая проблема: при выводе результата на экран, в зависимости от вводимых...

Нахождения корня р степени из а используя реккурентное выражение
Здравствуйте. На лабораторной попался такой вариант: http://savepic.su/1642399m.png Вот...

Алгоритм нахождения цифрового корня натурального числа
хочу сделать проверку числа что бы выводилось сообщение при большем числе не получается :( void...

5
337 / 237 / 103
Регистрация: 26.03.2019
Сообщений: 407
24.02.2020, 16:37 2
Цитата Сообщение от DariaDasha7 Посмотреть сообщение
mas[1] = d;
    mas[2] = s;
    mas[3] = j;
Индексы массива начинаются с нуля

Цитата Сообщение от DariaDasha7 Посмотреть сообщение
return  d*pow(x, 3) + s*pow(x, 2) - j*x;
d,s,j должны передаваться в эту функцию(а иначе вообще непонятно, как оно компилируется)

Цитата Сообщение от DariaDasha7 Посмотреть сообщение
Проблема в том, что даже если корень попадает в интервал. Выдает, что интервал некорректный.
Если на интервале больше одного корня, он тоже будет некорректным. Корректный интервал в смысле метода дихотомии - тот, на котором корень один(и следовательно, знаки на концах различны). Дальше все зависит от вашего задания.
0
0 / 0 / 0
Регистрация: 06.11.2018
Сообщений: 43
24.02.2020, 17:24  [ТС] 3
elenayagubova, Если на интервале больше одного корня, он просто выдавал один, самый первый. Грубо говоря, корни -3 и 3 на интервале [-10 10] выдавал просто -3
Исправила, все-равно тоже самое, даже если один корень и условия выполняются
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
double f(double x,double d,double s,double j)
{
    return  d*pow(x, 3) + s*pow(x, 2) - j*x-1;
}
double find(double mas[],double a, double b, double e)
{
    mas[0] = d;
    mas[1] = s;
    mas[2] = j;
   int iter = 0;
    double c = 0;
    if (f(a,mas[0],mas[1],mas[2]) * f(b,mas[0],mas[1],mas[2]) < 0) {
        do {
            c = (a + b) / 2;
            if (f(a,mas[0],mas[1],mas[2]) * f(c,mas[0],mas[1],mas[2]) < 0)
                b = c;
            else a = c;
            iter++;
        } while ((b - a) >= e);
        cout << " количество итераций:" << iter << endl;
        cout << "первый корень:" << c << endl;
    }
    else
        cout << "некорректный интервал" << endl;
    return c;
}
Думаю, может в main что-то не то
0
337 / 237 / 103
Регистрация: 26.03.2019
Сообщений: 407
24.02.2020, 18:09 4
Что-то все равно непонятно, откуда вы берете d,s,j и что с ними делаете. Можете весь код привести?
Цитата Сообщение от DariaDasha7 Посмотреть сообщение
Если на интервале больше одного корня, он просто выдавал один, самый первый.
Это нормально, но не нужно на это рассчитывать. Смысл в том, что метод дихотомии рассчитан на промежуток, на котором точно есть ровно один корень. Любая другая ситуация неоднозначна. Можно, конечно, на большом промежутке программно отделить меньшие, на которых содержится по одному корню, поэтому я и уточняю, какая перед вами изначально стоит задача - чаще всего в учебных задачах промежутки определяются аналитически, а программа используется только для уточнения корней.
0
0 / 0 / 0
Регистрация: 06.11.2018
Сообщений: 43
24.02.2020, 18:27  [ТС] 5
elenayagubova, вообще в идеале найти все корни, принадлежащие промежутку, включая комплексные, но до этого пока далеко) . Промежуток и коэффициенты полинома должны произвольно задаваться пользователем.
d, s j я взяла в качества коэффициентов полинома.
в формулировке задания звучало что на входе функции дихотомии должен быть массив коэффициентов.
Собственно, в main создается массив. А в функции дихотомии коэффициенты полинома по идеи должны принимать значения элементов массива
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
using namespace std;
double a, b,e=0.001;
double s, d, j;
double f(double x,double d,double s,double j)
{
    return  d*pow(x, 3) + s*pow(x, 2) - j*x-1;
}
double find(double mas[],double a, double b, double e)
{
    mas[0] =d;
    mas[1] = s;
    mas[2] = j;
   int iter = 0;
    double c = 0;
    if (f(a,mas[0],mas[1],mas[2]) * f(b,mas[0],mas[1],mas[2]) < 0) {
        do {
            c = (a + b) / 2;
            if (f(a,mas[0],mas[1],mas[2]) * f(c,mas[0],mas[1],mas[2]) < 0)
                b = c;
            else a = c;
            iter++;
        } while ((b - a) >= e);
        cout << " количество итераций:" << iter << endl;
        cout << "первый корень:" << c << endl;
    }
    else
        cout << "некорректный интервал" << endl;
    return c;
}
 
int main()
{
    setlocale(LC_ALL, "RU");
    double mas [3];
    cout << "введите коэффициенты при степенях х"<<endl;
    for (int i = 0; i < 3; i++)
    {
        cin>>mas[i];
    } 
    cout << "введите интервал" << endl;
    cin >> a >> b;
    find(mas, a, b, e);
}
0
337 / 237 / 103
Регистрация: 26.03.2019
Сообщений: 407
24.02.2020, 19:19 6
Лучший ответ Сообщение было отмечено DariaDasha7 как решение

Решение

По d,s,j:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//double a, b,e=0.001; //убираем
//double s, d, j; //убираем
const double e = 0.001; //e можно оставить глобальной константой
double f(double x,double d,double s,double j)
{
    return  d*pow(x, 3) + s*pow(x, 2) - j*x-1;
}
double find(double mas[],double a, double b, double e)
{
    //mas[0] =d; //убираем
    //mas[1] = s; //убираем
    //mas[2] = j; //убираем
   ...
}
 
int main()
{
    setlocale(LC_ALL, "RU");
    double a, b; //a и b объявляем здесь
    ...
}
Цитата Сообщение от DariaDasha7 Посмотреть сообщение
в идеале найти все корни, принадлежащие промежутку
Тогда нужно отдельно написать функцию, которая будет определять промежутки, на которых по одному корню. Вот вы получили промежуток, дальше вам нужно пройти по нему с некоторым шагом, чтобы определить промежутки, на которых есть корень. Уже для этих промежутков затем будете применять метод дихотомии, чтобы уточнить корень. Допустим, f(a) > 0. С некоторым шагом увеличиваем a, пока не дойдем до f(a+h1) < 0 - значит корень есть на промежутке от a до a+h1. Идем дальше, f(a+h1) < 0, ищем, где функция больше 0, находим f(a+h2) > 0 - значит есть корень от a+h до a+h2. И так далее. Метод дихотомии же получает уже такие хорошие промежутки и просто уточняет значение корня с заданной точностью.
0
24.02.2020, 19:19
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.02.2020, 19:19
Помогаю со студенческими работами здесь

Функция вычисляющая значение полинома Чебышева
10.Создайте функцию, которая для заданных x и n вычисляет значение Tn полинома Чебышева 1-го рода,...

Проверить условия совпадения и записать расчетные формулы для нахождения корня уравнения с заданной точностью
1) Проверить условия совпадения и записать расчетные формулы для нахождения корня уравнения с...

Задана функция x^3 (частный случай кубического полинома). Найти корни.
Задана функуия x^3 (частный случай кубического полинома). Найти корни. При условии: 1)...

Функция корня степени
Написать и протестировать функцию, которая по натуральному k и вещественным x &gt; 0, 0 &lt; ε...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru