С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.65/40: Рейтинг темы: голосов - 40, средняя оценка - 4.65
 Аватар для SomniPhobia
602 / 439 / 137
Регистрация: 22.11.2017
Сообщений: 1,408

C++ ЧМ Численное решение нелинейных уравнений

24.02.2019, 13:01. Показов 7708. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!
Задали численно решить нелинейное уравнение f(x) = cos(x) ^ 2 - 0.3 * cos(x) - 0.4 на интервале локализации корня от -3 до 3 включительно включительно. Точность 10e-5. Использовать методы бисекции, простой итерации, Ньютона и его модификаций.
Я всё это сделал. Прошу Вас проверить, верно ли выполнено задание.
Спасибо за ответы!

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

Бисекция
2,25000
2,12500
2,06250
2,09375
2,10938
2,10156
2,09766
2,09570
2,09473
2,09424
2,09448
2,09436
2,09442
2,09439
2,09441
2,09440
Метод Ньютона
2,07647
2,09452
2,09440
2,09440
Метод секущих
0,79495
1,21825
0,60362
0,64924
0,64345
0,64350
0,64350
Метод Стеффенсена
2,10581
2,09449
2,09440
2,09440
Метод Ложного положения
2,10416
2,09275
2,09466
2,09435
2,09440
2,09439
Метод Простой итерации
0,75602
0,86802
1,08993
1,49912
2,02362
2,12104
2,08288
2,09914
2,09240
2,09523
2,09405
2,09454
2,09433
2,09442
2,09438
2,09440
2,09439
2,09440
2,09439



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

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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
//Бисекция
tuple<double, size_t, vector<double>, double> bisection(const function<double(double)> &f, double a, double b, const double &e)
{
    double c = 0.;
    double e_fact;
    size_t count_iterations = 0u;
    vector<double> box;
    for (;; ++count_iterations)
    {
        //box.push_back(c);
        c = (a + b) / 2.;
        box.push_back(c);
 
        if (f(a) * f(c) < 0.)
        {
            b = c;
        }
        else
        {
            a = c;
        }
 
        //f(a) * f(c) < 0. ? a : b = c;
        e_fact = abs(f(a) - f(b));
        if (e_fact < e)
        {
            break;
        }
    }
    return { (a + b) / 2., ++count_iterations, box, e_fact };
}
 
//Получение q для метода простых итераций
double get_q(const function<double(double)> &f, const double &a, const double &b, const double &e)
{
    double left = a, right = b, step = e * 0.1;
    size_t count = (right - left) / step;
    double q = (numeric_limits<double>::min)();
    for (size_t u = 0u; u < count; ++u)
    {
        auto q_ = abs(get_derivative_in_point(f, left + u * step, e * 0.1));
        if (q_ > q)
        {
            q = q_;
        }
    }
    return q;
}
 
//Получение m для метода простых итераций
double get_m(const double &q)
{
    return 1. / q;
}
 
//Метод простой итерации
optional<tuple<double, size_t, vector<double>, double>> method_simple_iteration(const function<double(double)> &f, const double &x_start, const double &a, const double &b, const double &e)
{
    double x = x_start;
    double e_fact;
    auto q = get_q(f, a, b, e);
    auto m = get_m(q);
    if (!(0. <= q && q < 1.))
    {
        return {};
    }
    size_t count_iterations = 0u;
    vector<double> box;
    double x_old;
    for (;; ++count_iterations)
    {
        x -= m * f(x);
        box.push_back(x);
        if (count_iterations && abs(x - x_old) < e * (1. - q) / q)
        {
            e_fact = abs(x - x_old) / ((1. - q) / q);
            break;
        }
        x_old = x;
    }
    return tuple<double, size_t, vector<double>, double>{ x, ++count_iterations, box, e_fact };
}
 
//Метод Ньютона
tuple<double, size_t, vector<double>, double> newton_method(const function<double(double)> &f, const double &x_start, const double &e)
{
    double x = x_start, x_old;
    double e_fact;
    bool flag = false;
    size_t count_iterations = 0u;
    vector<double> box;
    for (;; ++count_iterations)
    {
        x -= f(x) / get_derivative_in_point(f, x, e * 0.1);
        box.push_back(x);
        if (flag)
        {
            e_fact = abs(x - x_old);
            wcout << L"e_fact = " << fixed << setprecision(10u) << e_fact << endl;
            if (e_fact < e)
            {
                break;
            }
        }
        /*if (flag && (e_fact = abs(x - x_old)) < e)
        {
            break;
        }*/
        flag = true;
        x_old = x;
    }
    return { x, ++count_iterations, box, e_fact };
}
 
//Метод секущих
tuple<double, size_t, vector<double>, double> secant_method(const function<double(double)> &f, const double &x_start1, const double &x_start2, const double &e)
{
    double x = 0., x_old2 = x_start1, x_old1 = x_start2;
    double e_fact;
    size_t count_iterations = 0u;
    vector<double> box;
    for (;; ++count_iterations)
    {
        //box.push_back(x);
        x -= f(x_old1) * (x_old2 - x_old1) / (f(x_old2) - f(x_old1));
        box.push_back(x);
        if (count_iterations >= 1. && (e_fact = abs(x - x_old1)) < e)
        {
            break;
        }
        x_old2 = x_old1;
        x_old1 = x;
    }
    return { x, ++count_iterations, box, e_fact };
}
 
//Метод Стеффенсена
tuple<double, size_t, vector<double>, double> stephensens_method(const function<double(double)> &f, const double &x_start, const double &e)
{
    double x = x_start, x_old;
    double e_fact;
    bool flag = false;
    size_t count_iterations = 0u;
    vector<double> box;
    for (;; ++count_iterations)
    {
        //box.push_back(x);
        x -= (f(x) * f(x)) / (f(x + f(x)) - f(x));
        box.push_back(x);
        if (flag && (e_fact = abs(x - x_old)) < e)
        {
            break;
        }
        flag = true;
        x_old = x;
    }
    return { x, ++count_iterations, box, e_fact };
}
 
//Метод ложного положения
tuple<double, size_t, vector<double>, double> false_position_method(const function<double(double)> &f, const double &x_start, const double &d, const double &e)
{
    double x = x_start, x_old;
    double e_fact;
    bool flag = false;
    size_t count_iterations = 0u;
    vector<double> box;
    for (;; ++count_iterations)
    {
        //box.push_back(x);
        x -= (f(x) * (d - x)) / (f(d) - f(x));
        box.push_back(x);
        if (flag && (e_fact = abs(x - x_old)) < e)
        {
            break;
        }
        flag = true;
        x_old = x;
    }
    return { x, ++count_iterations, box, e_fact };
}


Код вызова методов
Кликните здесь для просмотра всего текста

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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
//Задача функции
    f = [](double x)
    {
        double y = cos(x) * cos(x) - 0.3 * cos(x) - 0.4;
        return y;
    };
 
    //Подготовка графика к построению
    function_point_cloud(f, Data_, -5., 5., 5000);
    funcs.push_back(make_tuple(Data_, "line", Color(0u, 255u, 0u), 3u));
 
    //Отделение корней
    touch_points = axis_touch_points(Data_, e);
    funcs.push_back(make_tuple(touch_points, "points", Color(255u, 0u, 0u), 8u));
    Data_.clear();
 
 
    //Бисекция
    wcout << endl;
    method_name = L" Бисекция ";
    extension = (console_size_x - 1 - method_name.length()) / 2.;
    wcout << setw(extension) << L"" << method_name << setw(extension) << L"" << endl;
    wfout << setw(extension) << L"" << method_name << setw(extension) << L"" << endl;
 
    start = clock_type::now();
    auto[x1, count_iterations1, points_iteration1, e_fact1] = bisection(f, 2., 2.5, e);
    finish = clock_type::now();
    for (const auto &x_now : points_iteration1)
    {
        wcout << fixed << setprecision(precision_after_point) << x_now << endl;
        wfout << fixed << setprecision(precision_after_point) << x_now << endl;
    }
    wcout << L"Найден корень " << fixed << setprecision(precision_after_point) << x1
        << L" за " << count_iterations1 << L" итераций" << endl;
    duration = (milliseconds0(finish - start)).count();
    wcout << L"Погрешность по факту " << fixed << setprecision(precision_after_point_e) << e_fact1 << endl;
    wcout << L"Затрачено " << fixed << setprecision(3u) << duration << L" милисекунд" << endl;
 
    //Метод Ньютона
    wcout << endl;
    method_name = L" Метод Ньютона ";
    extension = (console_size_x - 1 - method_name.length()) / 2.;
    wcout << setw(extension) << L"" << method_name << setw(extension) << L"" << endl;
    wfout << setw(extension) << L"" << method_name << setw(extension) << L"" << endl;
 
    start = clock_type::now();
    auto[x2, count_iterations2, points_iteration2, e_fact2] = newton_method(f, 2.5, e);
    finish = clock_type::now();
    for (const auto &x_now : points_iteration2)
    {
        wcout << fixed << setprecision(precision_after_point) << x_now << endl;
        wfout << fixed << setprecision(precision_after_point) << x_now << endl;
    }
    wcout << L"Найден корень " << fixed << setprecision(precision_after_point) << x2
        << L" за " << count_iterations2 << L" итераций" << endl;
    duration = (milliseconds0(finish - start)).count();
    wcout << L"Погрешность по факту " << fixed << setprecision(precision_after_point_e) << e_fact2 << endl;
    wcout << L"Затрачено " << fixed << setprecision(3u) << duration << L" милисекунд" << endl;
 
    //Метод секущих
    wcout << endl;
    method_name = L" Метод секущих ";
    extension = (console_size_x - 1 - method_name.length()) / 2.;
    wcout << setw(extension) << L"" << method_name << setw(extension) << L"" << endl;
    wfout << setw(extension) << L"" << method_name << setw(extension) << L"" << endl;
 
    start = clock_type::now();
    auto[x3, count_iterations3, points_iteration3, e_fact3] = secant_method(f, 3.5, 3.6, e); //3.5, 3.6
    finish = clock_type::now();
    for (const auto &x_now : points_iteration3)
    {
        wcout << fixed << setprecision(precision_after_point) << x_now << endl;
        wfout << fixed << setprecision(precision_after_point) << x_now << endl;
    }
    wcout << L"Найден корень " << fixed << setprecision(precision_after_point) << x3
        << L" за " << count_iterations3 << L" итераций" << endl;
    duration = (milliseconds0(finish - start)).count();
    wcout << L"Погрешность по факту " << fixed << setprecision(precision_after_point_e) << e_fact3 << endl;
    wcout << L"Затрачено " << fixed << setprecision(3u) << duration << L" милисекунд" << endl;
 
    //Метод Стеффенсена
    wcout << endl;
    method_name = L" Метод Стеффенсена ";
    extension = (console_size_x - 1 - method_name.length()) / 2.;
    wcout << setw(extension) << L"" << method_name << setw(extension) << L"" << endl;
    wfout << setw(extension) << L"" << method_name << setw(extension) << L"" << endl;
 
    start = clock_type::now();
    auto[x4, count_iterations4, points_iteration4, e_fact4] = stephensens_method(f, 2., e);
    finish = clock_type::now();
    for (const auto &x_now : points_iteration4)
    {
        wcout << fixed << setprecision(precision_after_point) << x_now << endl;
        wfout << fixed << setprecision(precision_after_point) << x_now << endl;
    }
    wcout << L"Найден корень " << fixed << setprecision(precision_after_point) << x4
        << L" за " << count_iterations4 << L" итераций" << endl;
    duration = (milliseconds0(finish - start)).count();
    wcout << L"Погрешность по факту " << fixed << setprecision(precision_after_point_e) << e_fact4 << endl;
    wcout << L"Затрачено " << fixed << setprecision(3u) << duration << L" милисекунд" << endl;
 
    //Метод ложного положения
    wcout << endl;
    method_name = L" Метод Ложного положения ";
    extension = (console_size_x - 1 - method_name.length()) / 2.;
    wcout << setw(extension) << L"" << method_name << setw(extension) << L"" << endl;
    wfout << setw(extension) << L"" << method_name << setw(extension) << L"" << endl;
 
    start = clock_type::now();
    auto[x5, count_iterations5, points_iteration5, e_fact5] = false_position_method(f, 2., 3., e);
    finish = clock_type::now();
    for (const auto &x_now : points_iteration5)
    {
        wcout << fixed << setprecision(precision_after_point) << x_now << endl;
        wfout << fixed << setprecision(precision_after_point) << x_now << endl;
    }
    wcout << L"Найден корень " << fixed << setprecision(precision_after_point) << x5
        << L" за " << count_iterations5 << L" итераций" << endl;
    duration = (milliseconds0(finish - start)).count();
    wcout << L"Погрешность по факту " << fixed << setprecision(precision_after_point_e) << e_fact5 << endl;
    wcout << L"Затрачено " << fixed << setprecision(3u) << duration << L" милисекунд" << endl;
 
 
    //Метод простой итерации
    wcout << endl;
    method_name = L" Метод Простой итерации ";
    extension = (console_size_x - 1 - method_name.length()) / 2.;
    wcout << setw(extension) << L"" << method_name << setw(extension) << L"" << endl;
    wfout << setw(extension) << L"" << method_name << setw(extension) << L"" << endl;
 
    start = clock_type::now();
    auto res = method_simple_iteration(f, 0.7, 0.5, 0.8, e);
    finish = clock_type::now();
    if (!res.has_value())
    {
        wcout << L"Не сходится" << endl;
        system("pause");
        return 0;
    }
    auto[x6, count_iterations6, points_iteration6, e_fact6] = res.value();
    for (const auto &x_now : points_iteration6)
    {
        wcout << fixed << setprecision(precision_after_point) << x_now << endl;
        wfout << fixed << setprecision(precision_after_point) << x_now << endl;
    }
    wcout << L"Найден корень " << fixed << setprecision(precision_after_point) << x6
        << L" за " << count_iterations6 << L" итераций" << endl;
    duration = (milliseconds0(finish - start)).count();
    wcout << L"Погрешность по факту " << fixed << setprecision(precision_after_point_e) << e_fact6 << endl;
    wcout << L"Затрачено " << fixed << setprecision(3u) << duration << L" милисекунд" << endl;
 
    wfout.close();


Скрины
Миниатюры
C++ ЧМ Численное решение нелинейных уравнений   C++ ЧМ Численное решение нелинейных уравнений   C++ ЧМ Численное решение нелинейных уравнений  

0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.02.2019, 13:01
Ответы с готовыми решениями:

Численное решение системы линейных уравнений
Решить систему линейных уравнений: -сформировать матрицу А коэффициентов и матрицу В правых частей (матрицы должны быть размещены в...

Решение нелинейных уравнений
Нужно две программы по блок схемам на картинках , которые решают данное уравнение x^3+3x^2+6x-1=0 двумя способами: 1.Методом хорд ...

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

11
1104 / 480 / 33
Регистрация: 05.07.2018
Сообщений: 1,870
Записей в блоге: 7
24.02.2019, 17:15
Уважаемый SomniPhobia,
ваше уравнение имеет 4 корня. Два положительных и два отрицательных.
Расположены корни симметрично относительно начала координат, но вот
в вашем решении не видно их вывода. Такое решение не может быть признано
полным, а значит и правильным.
1
 Аватар для SomniPhobia
602 / 439 / 137
Регистрация: 22.11.2017
Сообщений: 1,408
24.02.2019, 17:39  [ТС]
Уважаемый нтч, спасибо за замечание.
Мне каждым из методов искать по 4 корня?
Ход решения верен (работа методов)?
0
1104 / 480 / 33
Регистрация: 05.07.2018
Сообщений: 1,870
Записей в блоге: 7
24.02.2019, 18:19
SomniPhobia,
фактически вам надо найти 2 положительных корня x = x1 и x = x2.
остальные 2 корня будут иметь вид x = -x1 и x = -x2
Поэтому необходимо разделение положительных корней и их вычисление
по отдельности. А вывести все четыре. Ведь задача "решить уравнение"
означает найти все четыре корня и вывести их на экран.
Ход решения?
Следует проконтролировать сходимость методов к нужному корню. Иначе
говоря, если итерации расходятся (значения выходят из интервала, в котором
лежит корень), то должен быть предусмотрен поиск нового начального значения
...
примечание
в основном сбои могут быть у метода Последовательных приближений. Метод
Ньютона тоже может доставить хлопот.

Добавлено через 5 минут
SomniPhobia,
вы можете сильно упростить свою задачу, если сделаете подстановку
cos(x) = z, то получите квадратное уравнение https://www.cyberforum.ru/cgi-bin/latex.cgi?z^2-0,3z-0,4=0
Решив это уравнение (любым методом) найдете и x = arccos(z).
1
 Аватар для SomniPhobia
602 / 439 / 137
Регистрация: 22.11.2017
Сообщений: 1,408
24.02.2019, 18:39  [ТС]
нтч, спасибо!
Подумаю над Вашими словами.
В методе Простой итерации не могу подобрать параметры так, чтобы отловить все 4 корня. Однако посредством этого найдены корни 2,09439 и -0,64350, Вы говорите их можно отзеркалить и будет набор из всех 4 - ёх корней.
В остальных методах удалось найти все 4 корня каждым методом.
Как я могу сравнивать методы по количеству итераций, если методы разнородные и я к каждому искал свой подход - свои начальные значения, которые сказываются на количестве итераций?

Добавлено через 2 минуты
После выполнения программы в файл data_x.txt было записано
Кликните здесь для просмотра всего текста

Бисекция
2,25000
2,12500
2,06250
2,09375
2,10938
2,10156
2,09766
2,09570
2,09473
2,09424
2,09448
2,09436
2,09442
2,09439
2,09441
2,09440
0,65000
0,57500
0,61250
0,63125
0,64063
0,64531
0,64297
0,64414
0,64355
0,64326
0,64341
0,64348
0,64352
0,64350
0,64351
-0,65000
-0,57500
-0,61250
-0,63125
-0,64063
-0,64531
-0,64297
-0,64414
-0,64355
-0,64326
-0,64341
-0,64348
-0,64352
-0,64350
-0,64351
-2,25000
-2,12500
-2,06250
-2,09375
-2,10938
-2,10156
-2,09766
-2,09570
-2,09473
-2,09424
-2,09448
-2,09436
-2,09442
-2,09439
-2,09441
-2,09440
Метод Ньютона
2,07647
2,09452
2,09440
2,09440
0,64241
0,64350
0,64350
-0,65320
-0,64352
-0,64350
-0,64350
-2,09905
-2,09440
-2,09440
Метод секущих
0,79495
1,21825
0,60362
0,64924
0,64345
0,64350
0,64350
-0,54904
-0,25478
-0,67008
-0,63767
-0,64347
-0,64350
-0,64350
-0,00584
2,14535
2,66522
2,09459
2,09440
2,09440
0,00584
-2,14535
-2,66522
-2,09459
-2,09440
-2,09440
Метод Стеффенсена
2,10581
2,09449
2,09440
2,09440
0,64541
0,64350
0,64350
-0,66492
-0,64363
-0,64350
-0,64350
-2,09408
-2,09440
-2,09440
Метод Ложного положения
2,10416
2,09275
2,09466
2,09435
2,09440
2,09439
0,63911
0,64344
0,64350
0,64350
-0,63911
-0,64371
-0,64349
-0,64350
-0,64350
-2,10416
-2,09399
-2,09441
-2,09439
-2,09440
Метод Простой итерации
0,75602
0,86802
1,08993
1,49912
2,02362
2,12104
2,08288
2,09914
2,09240
2,09523
2,09405
2,09454
2,09433
2,09442
2,09438
2,09440
2,09439
2,09440
2,09439
-0,63038
-0,64419
-0,64346
-0,64350
-0,64350


Добавлено через 3 минуты
Ничего что значения из некоторых методов получается 2,09439, из других 2,09440 при требуемой точности 10e-5?
0
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
24.02.2019, 22:09
Цитата Сообщение от SomniPhobia Посмотреть сообщение
и я к каждому искал свой подход - свои начальные значения
Неправильно. Первый этап желательно исследование функции, ее визуализация чтобы примерно прикинуть не бред ли ответы, это ваш график.

Второй этап это локализация корня. Рубите на 100 интервалов внутри границ -3 3.
Находите все интервалы где разные знаки f(x).
Решаете каждым методом нужные интервалы.

Цитата Сообщение от SomniPhobia Посмотреть сообщение
Ничего что значения из некоторых методов получается 2,09439, из других 2,09440 при требуемой точности 10e-5?
Проверка: подставляете в уравнение корень, если f(x) меньше
Цитата Сообщение от SomniPhobia Посмотреть сообщение
10e-5.
то правильно.
Цитата Сообщение от SomniPhobia Посмотреть сообщение
Вы говорите их можно отзеркалить и будет набор из всех 4 - ёх корней.
Отзеркалить можно т.к. это видно по графику функции. Это не должно быть принято за ответ. Даже больше, ваш метод должен рубить любую функцию и находить все корни функции одной переменной. Можно для контроля придумать другие функции из пары комбинаций sin cos. Или погуглить простые функции с известными корнями.
Цитата Сообщение от нтч Посмотреть сообщение
вы можете сильно упростить свою задачу, если сделаете подстановку
Неправильно. Сила численных методов в том что они рубят любую функцию без всяких левых расчетов и подстановок.
1
1104 / 480 / 33
Регистрация: 05.07.2018
Сообщений: 1,870
Записей в блоге: 7
25.02.2019, 08:21
Уважаемый SomniPhobia,
применение численных методов решения уравнения, не отменяет и применение аналитических методов к этому уравнению. Например в методе Ньютона приходится использовать производную. Если можно, то ее находят аналитически. А нет, то - численно. В вашем случае есть симметричные корни - используйте это свойство. Мало того, если можно решение свести к известным аналитическим методам, то почему бы ими не воспользоваться.
...
примечание
Универсальных вычислительных методов нет. Тот же метод Ньютона не сработает там, где уравнение имеет корень четной кратности. То есть график функции только касается оси икс, не пересекая ее. Или к примеру график может своей частью совпасть с осью икс. Или производная в точке корня может не существовать (кривая ломанная). Или корня может и не быть - А график покажет, что корень есть! И такое бывает.
Вы умный человек, вам могут надавать кучу разных советов. Разберитесь сами в том что вам нужно, а что - нет. Со временем будет и опыт в решении уравнений.
1
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
25.02.2019, 10:00
Цитата Сообщение от нтч Посмотреть сообщение
не отменяет и применение аналитических методов к этому уравнению.
Глупости.
Цитата Сообщение от нтч Посмотреть сообщение
если можно решение свести к известным аналитическим методам, то почему бы ими не воспользоваться.
Глупости. Так не делают.
Цитата Сообщение от нтч Посмотреть сообщение
Универсальных вычислительных методов нет.
Глупости. Брутофорс, дихотомия.

Если вы не в курсе вопроса тогда зачем советуете глупости?
0
 Аватар для SomniPhobia
602 / 439 / 137
Регистрация: 22.11.2017
Сообщений: 1,408
25.02.2019, 11:14  [ТС]
Цитата Сообщение от Excalibur921 Посмотреть сообщение
Первый этап желательно исследование функции, ее визуализация чтобы примерно прикинуть не бред ли ответы, это ваш график.
Я так и делаю.
Я имею ввиду, что интервал локализации корня 2.09439 один человек может задать как от 2. до 2.5, другой от 1.5 до 2.25. И как его задашь, итераций будет разное количество, а по заданию ещё нужно вывод сделать, какой из методов за меньше проходов вычисляет корни. Я не могу все методы поставить в одни и те же условия, чтобы выдать требуемое заключение.
Цитата Сообщение от Excalibur921 Посмотреть сообщение
Второй этап это локализация корня. Рубите на 100 интервалов внутри границ -3 3.
Находите все интервалы где разные знаки f(x).
Решаете каждым методом нужные интервалы.
Интересное предложение. Почему именно на 100 фрагментов?
Цитата Сообщение от Excalibur921 Посмотреть сообщение
Проверка: подставляете в уравнение корень, если f(x) меньше
Сообщение от SomniPhobia
10e-5.
то правильно.
Взгляните на прикреплённый скрин - во всех случаях значения функции меньше погрешности.
Цитата Сообщение от Excalibur921 Посмотреть сообщение
аже больше, ваш метод должен рубить любую функцию и находить все корни функции одной переменной.
Хорошая идея, но нам говорили по графику глазами интервал локализации находить и указывать его программе. А так, разрубить функцию на n частей - мощно.
А как быть с методом ложного положения, там вообще точка левая берётся, там закономерность есть, как её брать чтобы найти все корни на том или ином интервале?
Цитата Сообщение от нтч Посмотреть сообщение
Если можно, то ее находят аналитически. А нет, то - численно.
Я численно ищу
C++
1
2
3
4
5
//Взятие производной в точке
double get_derivative_in_point(const function<double(double)> &f, const double &x, const double &h)
{
    return (f(x + h) - f(x - h)) / (2. * h);
}
В качестве h задаю значение e * 0.1, где e - требуемая точность 0.00001
Миниатюры
C++ ЧМ Численное решение нелинейных уравнений  
0
 Аватар для SomniPhobia
602 / 439 / 137
Регистрация: 22.11.2017
Сообщений: 1,408
25.02.2019, 11:22  [ТС]
Цитата Сообщение от нтч Посмотреть сообщение
Или к примеру график может своей частью совпасть с осью икс.
Я такого не встречал. В таком случае будет бесконечно много корней?
0
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
25.02.2019, 12:09
Лучший ответ Сообщение было отмечено SomniPhobia как решение

Решение

Цитата Сообщение от SomniPhobia Посмотреть сообщение
а по заданию ещё нужно вывод сделать, какой из методов за меньше проходов вычисляет корни.
Локализация корня не относиться к методам уточнения корня.
Нужно запускать время расчета когда все участки где есть решения локализованы в массив. Так честно.

Цитата Сообщение от SomniPhobia Посмотреть сообщение
Почему именно на 100 фрагментов?
Отбалды. Хотите 1000. Локализация корня быстрей всех других решений. Чем меньше интервал тем быстрей уточнение корня.
Цитата Сообщение от SomniPhobia Посмотреть сообщение
во всех случаях значения функции меньше погрешности.
Может наглядней показывать разность между точностью и f(x) и ждать знака плюс или ноль.

Цитата Сообщение от SomniPhobia Посмотреть сообщение
А как быть с методом ложного положения,
Не знаю такого.
Цитата Сообщение от SomniPhobia Посмотреть сообщение
как её брать чтобы найти все корни на том или ином интервале?
Все эти методы это локализация корня. Они уходят в случайный корень и медленные. Они не ищут все корни. Поэтому сначала локализуют корень отставляя мелкий интервал где искать а там уже уточняют.

Цитата Сообщение от SomniPhobia Посмотреть сообщение
Я такого не встречал.
У вас учебная задача, не стоит нырять в тему по которой N книг по 600 страниц каждая.
Любой решатель можно сломать при желании.
0
1104 / 480 / 33
Регистрация: 05.07.2018
Сообщений: 1,870
Записей в блоге: 7
25.02.2019, 12:58
Цитата Сообщение от SomniPhobia Посмотреть сообщение
Я такого не встречал. В таком случае будет бесконечно много корней?
Уважаемый SomniPhobia,
Вот пример уравнения, в котором весь интервал (-1; 1) является решением
|x -1| + |x + 1| = 2. Да, корней бесчисленное множество. И как тут поможет к
примеру метод дихотомии?

А вот другой пример sin(x) + 1 = 0
Функция слева никогда не будет отрицательной - Метод дихотомии не работает.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.02.2019, 12:58
Помогаю со студенческими работами здесь

Решение нелинейных уравнений
Реализуйте алгоритмы методов нахождения корней нелинейного уравнения заданного согласно варианту и вычислите все его корни в заданном...

Решение системы нелинейных уравнений
Никак не могу разобраться с написанием программы на с++, которая бы решала систему нелинейных уравнений...

Решение нелинейных уравнений и систем
Написать программу решения нелинейного уравнения методом деления отрезка пополам по формуле:{2}^{x}+{x}^{2}-3=0. Здрасвуйте сделайте...

Решение системы нелинейных уравнений
найти решения уравнения графическим методом и методом поиска решений {cos(y+0,5)+x=0,8; { sinx-2y=1,6. P.S. только там скобка...

Решение систем нелинейных уравнений
Решение систем не линейных уравнений с использованием различных численных методов


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru