我正在尝试用C ++创建一个程序,它将在三次函数上使用二分法来找到该三次函数的根。现在我有了这个:
#include <iostream>
#include <cmath>
using namespace std;
int functie(double a,double b,double c,double d,double x){
double y;
y = (a*x*x*x + b*x*x + c*x + d);
return y;
}
int main(){
int a,b,c,d;//no comment
cout << "enter of form: ax^3 + bx^2 + cx + d (integers)" << endl << "a: ";
cin >> a;
cout << endl << "b: ";
cin >> b;
cout << endl << "c: ";
cin >> c;
cout << endl << "d: ";
cin >> d;
double min, max, temp;
min = -100;
max = 108.54267542;
while(functie(a,b,c,d,max) == 0 ||functie(a,b,c,d,min) == 0 ){
temp = (max + min)/2;
if(functie(a,b,c,d,min) < 0 && functie(a,b,c,d,temp) < 0 || functie(a,b,c,d,min) > 0 && functie(a,b,c,d,temp) > 0){
min = temp;
} else {max = temp;}
}
cout << min << endl;
cout << max << endl;
cout << temp << endl;
system("pause");
return 0;
}
但它不起作用;程序结束时的cout只输出输入值。 (如果你想知道为什么我的最大值是如此奇怪,是为了防止当max为+100且root为0时,程序将崩溃...)
所以如果你有时间想要检查一下,谢谢你。
答案 0 :(得分:2)
当然是错的。在这一行:
while(functie(a,b,c,d,max) == 0 ||functie(a,b,c,d,min) == 0 )
仅当从functie
返回的值为零时,循环才会执行。 max
和min
的值永远不会改变。
你已经宣布functie
是这样的:
int functie(double a,double b,double c,double d,double x)
您正在返回(并且应该)来自double
的{{1}}值,但由于其定义,它会被转换为functie
。
答案 1 :(得分:1)
对您的计划有几点评论:
您应该在functie
函数中返回double:
double functie(double a,double b,double c,double d,double x){
return (a*x*x*x + b*x*x + c*x + d);
}
正如FlopCoder所说,这项检查不正确:
while(functie(a,b,c,d,max) == 0 ||functie(a,b,c,d,min) == 0 )
您需要检查它们是否处于根点,而不是两者中的任何一个都在。但是我会进一步修改它,因为在与双打比较时有一个小的特定。
double epsilon = 1e-10;
while(fabs(functie(a,b,c,d,max)) > epsilon
&& fabs(functie(a,b,c,d,min)) > epsilon){
请注意,我比较一个非常小的,仍然不是零常数。双打永远不会等于零(我得到绝对值,因为我们需要检查两边是否足够接近零。