Программа выдаёт не то значение, которое требуется

Дано задание написать программу для решения уравнения методом деления отрезка пополам. Код вроде как без ошибок, но вот беда в результате. он немного отличается от нужного. Может я где накосячил, кто может помочь?

#include <iostream>
#include <math.h>

using namespace std;

double fun(double x) {
    double f;
    f = tan(x) - pow(tan(x),3) * x + 1 / 3 + 0.2 * pow(tan(x),5) * x;
    return f;
}
int main(){
    double x, d, c, eps;
    eps = 0.00000001;
    c = 0;
    d = 0.8;
    while (d - c > eps) {
        x = (c + d) / 2;
        if (fun(c)*fun(x) < 0){
            d = x;
        }
        else {
            c = x;
        }
    }
    cout << "c = " << c << " " << "f(c) = " << fun(c) << endl;
    cout << "d = " << d << " " << "f(d) = " << fun(d) << endl;
    return 0;
}

Промежуток, которое имеет корень уравнения : [0;0.8] а приближенное значение уравнения : 0.3333

Но я получаю только 0.341536

Это можно считать за верное решение задачи, либо нет?


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

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

На отрезке [-1,1] ваша функция имеет вид (конечно, если исправить ошибку целочисленного деления):

введите сюда описание изображения

Ваша программа с c = -1, d = 1 дает верное решение -0.312442.

Update после выяснения того, какое же уравнение надо решать на самом деле...

Если записать вашу функцию правильно, как

double fun(double x) {
    double f = tan(x);
    return -1./3 + f*(1 - f*f*(1./3-f*f/5));
}

то ваша программа даст верный ответ 0.333255, что соответствует графику функции

введите сюда описание изображения

А отсюда несколько моралей...

  1. Задавая вопрос, надо дать точное задание, а не свою вольную трактовку — словами ли, в коде ли.
  2. При решении задачи всегда проверяйте применимость метода. Вы проверили в самом начале, что f(c)*f(d) < 0? нет. А были обязаны. Еще надо проверить, что функция непрерывна на данном отрезке. Потому что иначе сам метод неприменим!
→ Ссылка