求解一元多次方程(迭代法)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

求解⼀元多次⽅程(迭代法)
1 --*
2解⼀元多次⽅程形如 x^5 + x^4 + x = 10
3
4主要做法:
51.⾼次⽅程典型的解法就是迭代。

给定初始值x0,
6给定精度e,通过公式x[n]=x[n-1]+f(x[n-1])/f'(x[n-1])不停迭代,直到近似解符合精度要求,输出结果。

7
82.另外还有⼀种⼆分法,对这种⽅法不是太熟悉,就是⾸先给定⼀个区间[a,b],在区间上如果有极值,则有解,把这个区间⼀分为2, [a,c]、[c,b],如果f(a)和f(c)艺号,则解在[a,c]区间,反之在[c,b]区间。

在把[a,c]⼀分为2,这样⼀直分下去,直到 9
10 */
11 #include <iostream>
12 #include <math.h>
13
14using namespace std;
15
16const double e = 1e-6;
17int n;
18 pair<double, int> p[12];//⽅程的系数, ⽅程次数
19
20double f(double x)//⽅程
21 {
22double sum = 0.0;
23
24for (int i = 0; i < n; ++i){
25if (p[i].second < 0)
26continue;
27 sum += p[i].first * pow(x, p[i].second);
28 }
29
30return sum - p[n].first;//减去值
31 }
32
33double ff(double x)//导数
34 {
35double sum = 0.0;
36
37for (int i = 0; i < n; ++i){
38if (p[i].second <= 0)
39continue;
40 sum += p[i].first * p[i].second * pow(x, p[i].second-1);
41 }
42
43return sum;
44 }
45
46double solve()
47 {
48double x0 = 1.0;
49double xn = 1.0;
50
51while (true){
52 xn = x0 - f(x0)/ff(x0);
53if (xn-x0 < e && x0-xn < e)
54return x0;
55 x0 = xn;
56 }
57 }
58
59int main()
60 {
61int num = 1;
62bool flag = false;
63
64while (cin >> n, n != -1){
65int i;
66for (i = 0; i < n; ++i){
67 cin >> p[i].second >> p[i].first;
68 }
69 cin >> p[n].second >> p[n].first;
70
71for (i = 0; i < n; ++i){
72 p[i].second = p[n].second - p[i].second + 1;
73 }
74
75if (flag){
76 cout << endl;
77 }else{
78 flag = true;
79 }
80
81 printf("Case %d: %.5lf\n", num++, solve()-1);
82 }
83return0;
84 }
85 #include <iostream>
86 #include <math.h>
87
88using namespace std;
89
90const double e = 1e-6;
91int n;
92 pair<double, int> p[12];//⽅程的系数, ⽅程次数
93
94double f(double x)//⽅程
95 {
96double sum = 0.0;
97
98for (int i = 0; i < n; ++i){
99if (p[i].second < 0)
100continue;
101 sum += p[i].first * pow(x, p[i].second);
102 }
103
104return sum - p[n].first;//减去值
105 }
106
107double ff(double x)//导数
108 {
109double sum = 0.0;
110
111for (int i = 0; i < n; ++i){
112if (p[i].second <= 0)
113continue;
114 sum += p[i].first * p[i].second * pow(x, p[i].second-1);
115 }
116
117return sum;
118 }
119
120double solve()
121 {
122double x0 = 1.0;
123double xn = 1.0;
124
125while (true){
126 xn = x0 - f(x0)/ff(x0);
127if (xn-x0 < e && x0-xn < e)
128return x0;
129 x0 = xn;
130 }
131 }
132
133int main()
134 {
135int num = 1;
136bool flag = false;
137
138while (cin >> n, n != -1){
139int i;
140for (i = 0; i < n; ++i){
141 cin >> p[i].second >> p[i].first;
142 }
143 cin >> p[n].second >> p[n].first;
144
145for (i = 0; i < n; ++i){
146 p[i].second = p[n].second - p[i].second + 1; 147 }
148
149if (flag){
150 cout << endl;
151 }else{
152 flag = true;
153 }
154
155 printf("Case %d: %.5lf\n", num++, solve()-1); 156 }
157return0;
158 }。

相关文档
最新文档