Я должен решить однокорневое уравнение в интервале, используя 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()
?
Любая помощь будет высоко оценена!