我必须使用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()
怎么了?
任何帮助将不胜感激!
答案 0 :(得分:1)
在您的代码中,res
未在f
中初始化,而std::fabs
初始化为零。
此外,如果您没有键入std::abs
,则abs
应该替换为using namespace std;
或{{1}}。
修复这两点,就可以了。
答案 1 :(得分:1)
res应该在函数f(double x)中初始化
和
使用命名空间std;
应用于为变量提供作用域