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

Комбинированный метод хорд и касательных

25.10.2017, 21:51. Показов 16497. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Друзья, добрый вечер, не могли бы Вы помочь?
Есть этот код, с помощью него нужно чтобы при заданном интервале выдавало ответ. Мой интервал [-5.2;-2.66] и [1.33;4.2], когда ввожу эти интервалы, пишет нет корней, не могли бы помочь решить данную проблему?

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
#include <iostream>
#include <cmath>
#include<iomanip>
#include<conio.h>
using namespace std;
int k = 0;
 
float f(float x) //функция по которой вычисляем  нужные нам корни 
{
    float y;
    y = pow(x, 3) - 2 * pow(x, 2) - 19 * x - 20;
    return y;
}
 
float f1(float x) { //первая производная
    float z;
    z = 3 * pow(x, 2) - 4 * x - 19;
    return z;
}
 
float f2(float x) { //вторая производная
    float u;
    u = 6 * x - 4;
    return u;
}
 
float function(float a, float b, float e) {// функция вычисляет по методу хорд и касательных 
    float c;
    do {
        if (f(a) * f2(a) < 0) {//Условие начальной точки для метода хорд
            a = a + (b - a) / (f(a) - f(b))*f(a); //формулы расчета по методу хорд
            b = b - f(b) / f1(b);
        }
        else if (f(a) * f2(a) > 0) {//Условие начальной точки для метода касательных
            a = a - f(a) / f1(a); //формулы расчета по методу касательных
            b = b + (b - a) / (f(b) - f(a))*f(b);
        }
        else
        {
            cout << "can't solve\n";
            break;
        }
        k++;
    } while (fabs(b - a) > e);//Построение хорд и касательных продолжается до достижения необходимой точности решения е
    return (a + b) / 2.0;
}
 
int main()
{
    setlocale(LC_ALL, "rus");
    double a, b, e = 0.00001, F, pr = 1;
    cout << "................................................................................";
    cout << ".                                                                              .";
    cout << "." << setw(55) << "МЕТОД №4. КОМБИНИРОВАННЫЙ МЕТОД." << "                       .";
    cout << ".                                                                              .";
    cout << "................................................................................";
    cout << endl;
    while (pr != 0) {
        cout << "--------------------------------------------------------------------------------";
        cout << "|" << setw(53) << "Введите начало отрезка a" << "                         |";
        cout << "--------------------------------------------------------------------------------" << endl;
        cin >> a;
        cout << endl;
        cout << "--------------------------------------------------------------------------------";
        cout << "|" << setw(53) << "Введите конец отрезка b" << "                         |";
        cout << "--------------------------------------------------------------------------------" << endl;
        cin >> b;
        cout << endl;
 
        cout << "________________________________________________________________________________" << endl;
        if (f(a)*f(b) < 0)//отрезок на концах которых функция имеет разный знак
        {
            pr = 0;//находим значение функции от а и b
            cout << setw(40) << "f(a) = " << "f(" << a << ") = " << f(a) << endl;
            cout << setw(40) << "f(b) = " << "f(" << b << ") = " << f(b) << endl;
            cout << endl;
        }
        else cout << setw(75) << "КОРНЕЙ НЕТ! ПОПЫТАЙТЕСЬ ВВЕСТИ ДРУГИЕ ЗНАЧЕНИЯ НАЧАЛА И КОНЦА ОТРЕЗКА!" << endl;
        cout << "________________________________________________________________________________";
        cout << endl;
    }
    cout << "РЕЗУЛЬТАТ" << endl;//выводим результат на экран 
    cout << function(a, b, e) << endl;
    cout << "Количество итераций: " << k << endl;
    cout << "Проверка" << endl;
    F = function(a, b, e);
    cout << setprecision(10) << f(F);
    cout << endl;
    _getch();
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.10.2017, 21:51
Ответы с готовыми решениями:

Комбинированный метод хорд и касательных
Сдравствуйте господа программисты. Помогите решить задачу. Нужно написать программу на Си, которая...

Комбинированный метод хорд и касательных.
Помогите найти ошибку!!! Считает только 1 раз, не могу понять почему условие не срабатывает ...

Комбинированный метод хорд и касательных
Добрый вечер! Знаю, что эта задачка уже, наверное, надоела, но все же может кто поможет!! Нужно...

Метод хорд и касательных
Господа программисты, очень нужна ваша помощь. Нужно написать программу на C++, в ней решить любое...

3
1498 / 1213 / 821
Регистрация: 29.02.2016
Сообщений: 3,628
26.10.2017, 11:01 2
вы наверное функцию записали не верно, ваша ф-я имеет один корень на отрезке -5,-2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
float function(float a, float b, float e) {// функция вычисляет по методу хорд и касательных 
    do {
        if (f(a) * f2(a) < 0) 
            a += (b - a) / (f(a) - f(b))*f(a); 
        else 
            a -= f(a) / f1(a);
        if (f(b) * f2(b) < 0)
            b += (a - b) / (f(b) - f(a))*f(b);
        else
            b -= f(b) / f1(b);
 
        k++;
    } while (fabs(a - b) > 2*e);//Построение хорд и касательных продолжается до достижения необходимой точности решения е
    return (a + b) / 2.0;
}
1
0 / 0 / 0
Регистрация: 29.10.2016
Сообщений: 11
26.10.2017, 13:31  [ТС] 3
спасибо большое, но не могу понять почему не получается вывести то что мне надо.


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
float function(float a, float b, float e) {// функция вычисляет по методу хорд и касательных 
    float res;
    do {
        if (f(a) * f2(a) < 0) {
            a += a - (f(a) / (f(b) - f(a))*(b - a)); //формулы расчета по методу хорд
            b = b - f(b) / f1(b);
        }
        else
            a -= f(a) / f1(a);
 
        if (f(b) * f2(b) < 0) {
            a = a - f(a) / f1(a); //формулы расчета по методу касательных
            b = b - (f(b) / (f(a) - f(b))*(a - b));
        }
        else
            b -= f(b) / f1(b);
        res = (a + b) / 2;
        k++;
    } while ((a - b) > 2 * e);//Построение хорд и касательных продолжается до достижения необходимой точности решения е
    return res;
}
в этом кусочке оно считает и в итоге должно вывести Е по формуле (a + b) / 2 , но оно выводит совсем не тот результат
Миниатюры
Комбинированный метод хорд и касательных  
0
1498 / 1213 / 821
Регистрация: 29.02.2016
Сообщений: 3,628
26.10.2017, 14:34 4
Skiper1, у вас у заданной функции нет нулей на интервале [-5.2;-2.66], его нужно продлить до -2, корень равен -2.43134, может поэтому
Миниатюры
Комбинированный метод хорд и касательных   Комбинированный метод хорд и касательных  
1
26.10.2017, 14:34
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.10.2017, 14:34
Помогаю со студенческими работами здесь

Не работает метод хорд и касательных
Должно бить в районе 2,5-2,6 #include &lt;iostream.h&gt; #include &lt;math.h&gt; double f(double x) ;...

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

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

Решение уравнения методом хорд и касательных
Комбінований метод хорд та дотичних x належить Перевожу. Решение уравнения комбинированным...


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

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