Newton法结合二分法 一元非线性方程求根
实验代码
#include <iostream>
#include <cstdio>
#include <cmath>
#define Maxrept 1000
#define Eps 1e-8
using namespace std;
double function1(double x) {
double y = exp(x) - 3 * x * x;
return y;
}
double function2(double x) {
double y = exp(x) - 6 * x;
return y;
}
double function3(double b) {
double x = b - function1(b) / function2(b);
return x;
}
int sign1(double d) {
return d < -Eps ? -1 : 1;
}
char sign2(double d) {
return sign1(d) == 1 ? '+' : '-';
}
int main() {
double a, b, c;
double ya, yb, yc;
double eps = 1e-5;
int k = 0;
cout << "供参考实数根:x1 = -0.458962 x2 = 0.910008 x3 = 3.73308" << endl;
do {
cout << "请输入搜索区间[a, b]: " << endl;
cin >> a >> b;
ya = function1(a);
yb = function1(b);
if (sign1(ya) == sign1(yb)) {
cout << "区间输入不合理,f(a)*f(b) > 0";
}
else {
break;
}
} while (true);
cout << "k ak bk ck" << endl;
do {
c = function3(b);
if (c <= a || c >= b) {
c = a - (a - b) / 2.0;
}
ya = function1(a);
yb = function1(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(b - a) > eps && k < Maxrept);
cout << "求解值为:x = " << c << ",共迭代:" << k << "次,f(x) = " << yc << endl;
cout << "注:括号内为f(x)的正负" << endl;
return 0;
}
实验结果
供参考实数根:x1 = -0.458962 x2 = 0.910008 x3 = 3.73308
请输入搜索区间[a, b]:
-2 0.5
k ak bk ck
1 -2.000000(-) 0.500000(+) -0.750000(-)
2 -0.750000(-) 0.500000(+) -0.125000(+)
3 -0.750000(-) -0.125000(+) -0.636867(-)
4 -0.636867(-) -0.125000(+) -0.380934(+)
5 -0.636867(-) -0.380934(+) -0.464432(-)
6 -0.464432(-) -0.380934(+) -0.422683(+)
7 -0.464432(-) -0.422683(+) -0.460066(-)
8 -0.460066(-) -0.422683(+) -0.441374(+)
9 -0.460066(-) -0.441374(+) -0.459214(-)
10 -0.459214(-) -0.441374(+) -0.450294(+)
11 -0.459214(-) -0.450294(+) -0.459023(-)
12 -0.459023(-) -0.450294(+) -0.454658(+)
13 -0.459023(-) -0.454658(+) -0.458977(-)
14 -0.458977(-) -0.454658(+) -0.456818(+)
15 -0.458977(-) -0.456818(+) -0.458966(-)
16 -0.458966(-) -0.456818(+) -0.457892(+)
17 -0.458966(-) -0.457892(+) -0.458963(-)
18 -0.458963(-) -0.457892(+) -0.458428(+)
19 -0.458963(-) -0.458428(+) -0.458962(-)
20 -0.458962(-) -0.458428(+) -0.458695(+)
21 -0.458962(-) -0.458695(+) -0.458962(-)
22 -0.458962(-) -0.458695(+) -0.458829(+)
23 -0.458962(-) -0.458829(+) -0.458962(-)
24 -0.458962(-) -0.458829(+) -0.458895(+)
25 -0.458962(-) -0.458895(+) -0.458962(-)
26 -0.458962(-) -0.458895(+) -0.458929(+)
27 -0.458962(-) -0.458929(+) -0.458962(+)
求解值为:x = -0.458962,共迭代:27次,f(x) = -2.99361e-09
注:括号内为f(x)的正负