Неверный вывод при применении Divide & Conquer - PullRequest
0 голосов
/ 18 ноября 2018

Я должен решить однокорневое уравнение в интервале, используя Divide & Couquer. Вот мой код:

#include<bits/stdc++.h>

double coef[4];
int d=3;

double f(double x){
    int i;
    double res;
    for(i=0;i<=d;i++) res+=coef[i]*pow(x,i);
    return res;
}

double solve(double left,double right){
    double mid=(left+right)/2;

    if(abs(f(mid))<=1e-8) return mid;
    if(right-left<=1e-4) return mid;

    printf("%.4f %.4f %.4f\n",left,mid,right);

    if(f(mid)*f(left)>=0) return solve(mid,right); 
    if(f(mid)*f(right)>=0) return solve(left,mid);
}

int main(){

    coef[0]=-10;
    coef[1]=0;
    coef[2]=0;
    coef[3]=1.5;

    printf("%lf\n",solve(-10,10));
}

Затем я использую его для решения 1.5x^3-10=0 с двумя связанными -10 и 10, но мне кажется, что if(f(mid)*f(right)>=0) return solve(left,mid); вообще не работает.

-10.0000 0.0000 10.0000
0.0000 5.0000 10.0000
5.0000 7.5000 10.0000
7.5000 8.7500 10.0000
8.7500 9.3750 10.0000
9.3750 9.6875 10.0000
9.6875 9.8438 10.0000
9.8438 9.9219 10.0000
9.9219 9.9609 10.0000
9.9609 9.9805 10.0000
...

Я знаю, что корнем уравнения является 1.8821, поэтому вывод неправильный.

То же самое происходит с [-20, 20].

Если я тестирую с [-1.000.000, 1.000.000], вывод выдаст мне корень 500000.0000, что явно неверно.

Так что не так с моей функцией solve()?

Любая помощь будет высоко оценена!

Ответы [ 2 ]

0 голосов
/ 18 ноября 2018

res должно быть инициализировано в функции f (double x)
ииспользование пространства имен std;
должен использоваться, чтобы обеспечить область для ваших переменных

0 голосов
/ 18 ноября 2018

В вашем коде res не инициализируется в f, что может быть инициализировано как ноль.

Кроме того, abs следует заменить на std::fabs или std::abs, если вы не введете using namespace std;.

Исправив эти две точки, он будет работать нормально.

ДЕМО здесь.

...