C++中的二分法

Bisection method in C++

本文关键字:二分 C++      更新时间:2023-10-16

我正在尝试用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只输出输入值。(如果你想知道为什么我的最大值如此奇怪,是为了防止当最大值为+100,根值为0时,程序会崩溃…)

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

当然是错的。在线:

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

只有当functie返回的值为零时,才会执行循环。CCD_ 2和CCD_。

您已经这样声明functie

int functie(double a,double b,double c,double d,double x)

您正在从functie返回(并且应该返回)double值,但由于定义的原因,它被强制转换为int

对您的程序的几点评论:

您应该在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);
}

正如FlopCode所指出的,该检查不正确:

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){

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