试值法 一元非线性方程求根
实验代码
#include <iostream>
#include <cstdio>
#define Eps 1e-8
using namespace std;
double function1(double x) {
double y = x * x * x + 4 * x * x - 10;
return y;
}
double function2(double x1, double x2) {
double y1 = function1(x1);
double y2 = function1(x2);
double c = x2 - (x2 - x1) / (y2 - y1) * y2;
return c;
}
int sign1(double d) {
return d < -Eps ? -1 : 1;
}
char sign2(double d) {
return sign1(d) == 1 ? '+' : '-';
}
int main() {
double eps;
double a, b, c;
double ya, yb, yc;
int k = 0;
cout << "请输入精度要求:" << endl;
cin >> eps;
cout << "请输入区间[a, b]" << endl;
cin >> a >> b;
cout << endl;
cout << "k ak bk ck" << endl;
do {
ya = function1(a);
yb = function1(b);
c = function2(a, b);
yc = function1(c);
k++;
cout << k << " ";
printf("%lf(%c) ", a, sign2(ya));
printf("%lf(%c) ", b, sign2(yb));
printf("%lf(%c) \n", c, sign2(yc));
if (sign1(ya) == sign1(yc)){
a = c;
}
else {
b = c;
}
} while (abs(yc) > eps);
cout << "求解值为:x = " << c << ",共迭代:" << k << "次,f(x) = " << yc << endl;
cout << "注:括号内为f(x)的正负" << endl;
return 0;
}
实验结果
请输入精度要求:
0.0005
请输入区间[a, b]
1 1.5
k ak bk ck
1 1.000000(-) 1.500000(+) 1.338983(-)
2 1.338983(-) 1.500000(+) 1.363563(-)
3 1.363563(-) 1.500000(+) 1.365125(-)
4 1.365125(-) 1.500000(+) 1.365223(-)
求解值为:x = 1.36522,共迭代:4次,f(x) = -0.000109137
注:括号内为f(x)的正负