暴力方程求解

Brute-force equation solving

本文关键字:方程求      更新时间:2023-10-16

我正在编写一个使用蛮力来解决方程的程序。不幸的是,我的代码似乎在某处有错误,因为我的程序在 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;
}
}

我已经看了一段时间了,但我仍然找不到代码中的错误。程序应检查每个给定间隔中是否有根,如果是,则检查该间隔中的每个可能性。如果它找到一个根,它应该将其推送到结果向量中。

我知道

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

if(fx(search) == 0)

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

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

我认为这对你来说就可以了。您可以在此链接上找到更多信息

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

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

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