【基于C++的非线性方程的解法研究及实现】
【前言】
关于非线性方程f(x) = 0的根的解法目前分为三类,二分法,试值法和不动点迭代法
本文实例为寻找f(x) = x2 - 2x在区间[-1, 3]内精度在0.05以内的实根
代码中的set用于保存答案
【1.二分法】
二分法又称二分区间法,是求解非线性方程近似根的一种常用的简单方法。
算法:
【代码实现】
inline float f(float x) {
return x * x - 2 * x; }
inline float binary_search(float l, float r, float k) {
float left = l, right = r;
while (true) {
float x = (left + right) / 2;
float fa = f(left), fx = f(x);
if (fa * fx < 0) right = x;
else left = x;
if (abs(right - left) <= 2 * k) return x;
}
}
inline void solve_division(float l, float r, float k) {
set<float> ans;
for (float i = l; i < r; i += k) {
//将区间分为(r - l) / k个分别进行查找
float fa = f(i), fb = f(i + k);
if (fa == 0) ans.insert(i);
else if (fb == 0) ans.insert(i + k);
else if (fa * fb < 0) ans.insert(binary_search(i, i + k, k));
}
cout << "The root of the equation is(division):" << endl;
for (auto& it : ans) {
printf("%.2f\n", it);
}
}
【2.试值法】
该算法与二分法的不同点在于将二分法中x = (a + b) / 2换做如下操作
【代码实现】
inline float tryvalue_search(float l, float r, float k) {
float left = l, right = r;
while (true) {
float x = right - (right - left) * f(right) / (f(right) - f(left)); // 不同点