C ++中的二分法

时间:2012-03-04 12:28:08

标签: c++ math

我正在尝试用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时,程序将崩溃...)

所以如果你有时间想要检查一下,谢谢你。

2 个答案:

答案 0 :(得分:2)

当然是错的。在这一行:

while(functie(a,b,c,d,max) == 0 ||functie(a,b,c,d,min) == 0 )

仅当从functie返回的值为零时,循环才会执行。 maxmin的值永远不会改变。

你已经宣布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){

请注意,我比较一个非常小的,仍然不是零常数。双打永远不会等于零(我得到绝对值,因为我们需要检查两边是否足够接近零。