Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
2 / 2 / 0
Регистрация: 22.11.2018
Сообщений: 30
1

Вычисление корней уравнений

23.11.2018, 11:30. Показов 454. Ответов 0

Author24 — интернет-сервис помощи студентам
Доброго времени суток!
Помогите разобраться с задачей и дать вектор куда копать.

Суть: найти корни уравнения двумя способами:
1. Методом касательных
2. Методом дихотомии

Условие: функциями пользоваться нельзя (т.к. пока мы их типо не знаем =) ), поэтому все производные записаны в виде присваивания переменной.

Проблема: оба решения выдают разный результат при одинаковых значениях отрезка (что вот очень прям смущает).

Функция: sin(x) + x3

Код:

Метод касательных:

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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include "pch.h"
#include <iostream>
#include <iomanip>
#include <math.h>
#include <conio.h>
using namespace std;
 
int main()
{
    setlocale(0, "");
 
    double a, b, x = 0, x1, e = 0.0001;
    double fa, f1a, f2a, fb, f1b, f2b;
target1:
    cout << "\nВведите координаты начала отрезка на оси OX. a = "; cin >> a;
    cout << "Введите координаты конца отрезка на оси OX. b = "; cin >> b;
    cout << "Точность вычислений е = " << e;
 
    if (a > b)
    {
        cout << "\nНеверно указан интервал поиска" << endl;
        goto target1;
    }
 
                
    
    fb = sin(b) + pow(b, 3);                //исходник
    f1b = 3 * pow(b, 2) + cos(b);       //первая производная
    f2b = (6 * b) - sin(b);             //вторая производная
 
    fa = sin(a) + pow(a, 3);
    f2a = (6 * a) - sin(a);
 
 
    if (fa * fb > 0) // Если на краях отрезка знаки ф-ции одинаковы, то здесь нет корня
    {
        cout << "\nОшибка! Нет корней на интервале [" << a << ";" << b << "]" << endl;
        goto target1;
    }
    else
    {
        if (fa * f2a > 0)
        {
            cout << "\nУсловие сходимости выполнено для x=a=" << a << endl;
            x1 = a;
        }
        else
        {
            cout << "\nУсловие сходимости выполнено для x=b" << b << endl;
            x1 = b;
        }
 
        fb = sin(x1) + pow(x1, 3);          
        f1b = 3 * pow(x1, 2) + cos(x1);
        f2b = (6 * x1) - sin(x1);
        x = x1 - fb / f1b;
        
        while (fabs(x1 - x) > e)
        {
            x1 = x;
            fb = sin(x1) + pow(x1, 3);
            f1b = (3 * pow(x1, 2)) + cos(x1);
            x = x1 - (fb / f1b);
        }
    }
    cout << "\nКорень x=" << x << endl;
    _getch();
    return 0;
}
Метод дихотомии:
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
54
55
#include "pch.h"
#include <iostream>
#include <math.h>
#include <conio.h>
using namespace std;
 
int main()
{
    setlocale(0, "");
 
    double a, b, x, e = 0.0001;
    double fx, fa;
 
target1:
    cout << "\nВведите координаты начала отрезка на оси OX. a = "; cin >> a;
    cout << "Введите координаты конца отрезка на оси OX. b = "; cin >> b;
    cout << "Точность вычислений е = " << e;
 
    if (a > b)
    {
        cout << "\nНеверно указан интервал поиска" << endl;
        goto target1;
    }
 
    fx = sin(b) + pow(b, 3);
    fa = sin(a) + pow(a, 3);
 
    if (fa * fx > 0) // Если на краях отрезка знаки ф-ции одинаковы, то здесь нет корня
    {
        cout << "\nОшибка! Нет корней на интервале [" << a << ";" << b << "]" << endl;
        goto target1;
    }
 
    while (fabs(a - b) > 2 * e)
    {
        x = (a + b) / 2;
 
        fx = sin(x) + pow(x, 3);
        fa = sin(a) + pow(a, 3);
 
        if (fx*fa <= 0)
        {
            b = x;
        }
        else
        {
            a = x;
        }
    }
 
    cout << "\nКорень x=" << x << endl;
 
    _getch();
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.11.2018, 11:30
Ответы с готовыми решениями:

Вычисление корней квадратных уравнений
Здравствуйте! Решил попрактиковаться в с++ и написать некое подобие калькулятора, сделал меню...

Вычисление корней системы уравнений методом Крамера
Составить программу вычисления корней системы уравнений с двумя неизвестными методом Крамера. ...

Нахождение корней квадратного и линейного уравнений
Написать перегруженные шаблоны функций для нахождения корней линейного (а*х + b =0) и квадратного...

При наличие корней в системе уравнений выдает ошибку
После выполнения программы (она решает систему линейных уравнений) для случая наличия корней...

0
23.11.2018, 11:30
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.11.2018, 11:30
Помогаю со студенческими работами здесь

Вычисление корней многочлена
нужно написать программу которая вычисляет корни многочлена. Степень многочлена мы задаём.

Найти среднее арифметическое действительных корней трех квадратных уравнений
помогите пожалуйста решить задачу))) тема : Использование функций для решения прикладных задач....

Нахождение корней системы нелинейных уравнений методом Ньютона (касательных)
Добрый вечер, помогите с работой. Написать программу нахождения корней системы нелинейных...

Абстрактные классы и вычисление корней
Это общее условие для задания: В следующих заданиях требуется реализовать абстрактный базовый...


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

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