暴力方程求解
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))
是罪魁祸首。如果 start
和 end
的 f(x) 值具有不同的符号,则有一个根。相反,我写道,如果start
和end
的迹象不同,就会有一个根源。对不起,大惊小怪。
相关文章:
- If语句未被求值C++
- 求出有多少个数字是完美平方,而sqrt()是L,R范围内的素数
- 给定两个偶数,求出它们之间所有偶数的平方和
- gcc和clang在表达式是否为常量求值的问题上存在分歧
- 求最长递增子序列C++的长度
- 求最大元素位置的分治算法
- 正弦级数方程计算不正确
- 线性丢番图方程 - 求给定区间内的解数和解
- 将随机生成的数字添加到数组 + 对这些数组求平均值
- 特征稀疏向量:求最大系数
- 这个方程 x + y = x & y + x |y 成立(假设 x, y > 0)?
- 尝试创建包含简单方程的函数
- 求所有整数 1 到 N 的最大奇数除数之和
- 我正在尝试根据 4 个方程找出六个值
- 在 // C++注释中使用 \\ 是否合法?(C++评论中的LaTeX方程)
- 求最小素数 x 和最大 m = power_of(x) 的函数,使得 n % m = 0 和 n % x = 0?
- 我正在尝试在 C++ 中做一个方程,但它一直输出 1
- 如何使用 while 循环进行求幂
- 求所有等于一个方程的数对
- c++中如何让用户输入的方程被求值