Программа выдаёт не то значение, которое требуется
Дано задание написать программу для решения уравнения методом деления отрезка пополам. Код вроде как без ошибок, но вот беда в результате. он немного отличается от нужного. Может я где накосячил, кто может помочь?
#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 шт):
На отрезке [-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, что соответствует графику функции
А отсюда несколько моралей...
- Задавая вопрос, надо дать точное задание, а не свою вольную трактовку — словами ли, в коде ли.
- При решении задачи всегда проверяйте применимость метода. Вы проверили в самом начале, что
f(c)*f(d) < 0? нет. А были обязаны. Еще надо проверить, что функция непрерывна на данном отрезке. Потому что иначе сам метод неприменим!

