Решение нелинейного уравнения методом половинного деления

Ответ должен быть 0,1140. А мне выводит -5

`

#include <iostream>

using namespace std;

float f(int x) {
    return 7 * x + 5 ^ x - 2;
}

float Halfy(float a, float b, float e) {
    while (b - a > 2 * e) {
        float c = (a + b) / 2;
        if (f(a) * f(c) < 0) {
            b = c;
        }
        else {
            return (a + b) / 2;
        }
    }
    return (a + b) / 2;
}

int main()
{
    cout << Halfy(-10, 10, 0.0001);
}

`


Ответы (1 шт):

Автор решения: Harry

Есть подозрение, что под 5^x вы имеете в виду 5 в степени x, но компилятор-то считает это побитовым XOR!

Вобщем, после исправления всех ошибок получается вот такое:

#include <iostream>
using namespace std;
double f(double x)
{
    return 7 * x + pow(5,x) - 2;
}

double Halfy(double a, double b, double e)
{
    while (b - a > 2 * e)
    {
        double c = (a + b) / 2;
        if (f(a) * f(c) < 0)
        {
            b = c;
        }
        else
        {
            a = c;
        }
    }
    return (a + b) / 2;
}

int main()
{
    cout << Halfy(-10, 10, 0.0001) << endl;
}

Но при этом хорошо бы еще вначале проверять, что для исходных точек получаются значения разного знака, да и каждый раз вычислять лишнее значение функции тоже не обязательно. Да и саму функцию лучше передавать как параметр — тогда код можно использовать для разных функций:

double Halfy(double a, double b, double e, double (*f)(double))
{
    double fa;
    if (a > b) swap(a,b);
    if ((fa = f(a)) * f(b) > 0) throw runtime_error("Wrong data");
    
    while (b - a > 2 * e)
    {
        double c = (a + b) / 2;
        if (fa * f(c) < 0)
        {
            b = c;
        }
        else
        {
            a = c;
        }
    }
    return (a + b) / 2;
}

double f(double x)
{
    return 7 * x + pow(5,x) - 2;
}

int main()
{
    cout << Halfy(-10, 10, 0.0001, f) << endl;
}
→ Ссылка