强力方程求解

时间:2014-11-15 17:21:39

标签: c++ brute-force

我正在编写一个使用强力解决方程的程序。不幸的是,我的代码似乎在某处出错,因为我的程序在search = 0.19999处停止。这是代码:

#include <iostream>
#include <cmath>
#include <vector>

#define min -4.0
#define max 6.5

using namespace std;

double fx (double x){
    long double result = cos(2*x)-0.4*x;
    double scale = 0.00001;
    double value = (int)(result / scale) * scale;
    return value;
}

int sign (double a){
    if(a<0) return -1;
    if(a==0) return 0;
    else return 1;
}

int main(){
vector <double> results;
double step, interval, start, end, search; 
interval=(fabs(min)+fabs(max))/50;
step=0.00001; 

start=min;
end=min+interval;
search=start;

while(end <= max){
    if(sign(start) != sign(end)){
        search=start;
        while(search < end){
            if(fx(search) == 0) results.push_back(search);
            search=search+step;
        }
    }
    start=end;
    end=start + interval;
}

for(int i=0; i<results.size(); i++){
    cout << results[i] << endl;
}
}

我已经看了很长时间了,我仍然无法在代码中找到错误。 程序应检查每个给定间隔中是否存在根,如果是,则检查该间隔中的每种可能性。如果找到根,则应将其推入结果向量。

2 个答案:

答案 0 :(得分:1)

我知道你已经找到了答案,但我在尝试查找错误时发现了一个问题。在第37行,您进行以下比较:

if(fx(search) == 0)

由于您的fx函数返回double。在处理双精度浮点数时,通常不建议使用等运算符进行测试。你的结果可能永远不会完全 0,那么这个测试将永远不会返回true。我认为您应该使用最大误差范围进行比较,如下所示:

double maximum_error = 0.005;
if(abs(fx(search)) < maximum_error)

我认为这样可以解决你的问题。您可以在this link

上找到更多信息

即使它现在正在工作,输入数字,CPU架构甚至编译器标志的微小变化都可能会破坏您的程序。比较C ++中的双打是非常危险的,尽管这样做是合法的。

答案 1 :(得分:0)

我刚刚再次运行代码并发现了错误。

if(sign(start) != sign(end)) 是罪魁祸首。如果startend的f(x)值具有不同的符号,则会有根。相反,我写道,如果startend的符号不同,则会有根。对不起,大惊小怪。