Решение уравнения методом хорд и методом половинного деления отрезка(метод дихотомии)
Всем привет! Написал две функции для решения уравнения методом Хорд и методом Дихотомии, но проблема в том, что результаты не совпадают. Вот мои написанные функции:
double chord_method(double a, double b, double e) { // метод хорд
double next = 0;
double tmp;
do{
tmp = next;
next = b - F(b) * (a - b) / (F(a) - F(b));
a = b;
b = tmp;
}
while (abs(next - b) > e);
return next;
}
double dichotomy_method(double a, double b, double eps) { //метод дихотомии
double c;
while ((b - a) / 2 > eps) {
c = (a + b) / 2;
if ((F(a) * F(c)) > 0) {
a = c;
}
else {
b = c;
}
}
return c;
}
И дано, например, следующее уравнение:
double F(double x) {
return x * x * x + 4 * x - 3;
}
Отрезок, на котором надо вычислить: от a = 0 до b = 1, точность e = 0.001. Ответы при таких аргументах следующие: Методом Хорд получается: 0.6, Методом Дихотомии: 0.673828.
А вот с с таким уравнением, с той же точность, но на отрезке [2, 10]:
double F(double x) {
return x * x * x - 18 * x - 83;
}
Результаты следующие: Методом Хорд: 5.70511, Методом Дихотомии: 5.70508.
Вопрос такой: Что не так с этими функциями? Формулы, вроде, нашел подходящие, но результаты не совпадают точь в точь. Или же с точки зрения математики все нормально?
Ответы (1 шт):
Немного исправьте код, и все у вас получится. И лучше писать не глобальную функцию, а передавать ее в метод в качестве параметра. См. https://ideone.com/8H2Fqq
double chord(double a, double b, double e, double (*f)(double))
{ // метод хорд
double fa = f(a), fb = f(b);
if (fa*fb > 0) throw runtime_error("Wrong data");
for(;abs(b-a) > e;)
{
double x = a - (b-a)*fa/(fb-fa);
b = a;
fb = fa;
a = x;
fa = f(x);
}
return a;
}
double dichotomy(double a, double b, double e, double (*f)(double))
{ //метод дихотомии
double fa = f(a), fb = f(b);
if (fa*fb > 0) throw runtime_error("Wrong data");
for(;abs(b - a) > e;)
{
double x = (a + b)/2;
if (f(x)*fa > 0) a = x;
else b = x;
}
return (a+b)/2;
}