void-man

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
1 --*
2 解一元多次方程 形如 x^5 + x^4 + x = 10
3
4 主要做法:
5  1.高次方程典型的解法就是迭代。给定初始值x0,
6 给定精度e,通过公式x[n]=x[n-1]+f(x[n-1])/f'(x[n-1])不停迭代,直到近似解符合精度要求,输出结果。
7
8 2.另外还有一种二分法,对这种方法不是太熟悉,就是首先给定一个区间[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
14 using namespace std;
15
16 const double e = 1e-6;
17 int n;
18 pair<double, int> p[12];//方程的系数, 方程次数
19
20 double f(double x)//方程
21 {
22 double sum = 0.0;
23
24 for (int i = 0; i < n; ++i){
25 if (p[i].second < 0)
26 continue;
27 sum += p[i].first * pow(x, p[i].second);
28 }
29
30 return sum - p[n].first;//减去值
31 }
32
33 double ff(double x)//导数
34 {
35 double sum = 0.0;
36
37 for (int i = 0; i < n; ++i){
38 if (p[i].second <= 0)
39 continue;
40 sum += p[i].first * p[i].second * pow(x, p[i].second-1);
41 }
42
43 return sum;
44 }
45
46 double solve()
47 {
48 double x0 = 1.0;
49 double xn = 1.0;
50
51 while (true){
52 xn = x0 - f(x0)/ff(x0);
53 if (xn-x0 < e && x0-xn < e)
54 return x0;
55 x0 = xn;
56 }
57 }
58
59 int main()
60 {
61 int num = 1;
62 bool flag = false;
63
64 while (cin >> n, n != -1){
65 int i;
66 for (i = 0; i < n; ++i){
67 cin >> p[i].second >> p[i].first;
68 }
69 cin >> p[n].second >> p[n].first;
70
71 for (i = 0; i < n; ++i){
72 p[i].second = p[n].second - p[i].second + 1;
73 }
74
75 if (flag){
76 cout << endl;
77 }else{
78 flag = true;
79 }
80
81 printf("Case %d: %.5lf\n", num++, solve()-1);
82 }
83 return 0;
84 }
85 #include <iostream>
86 #include <math.h>
87
88 using namespace std;
89
90 const double e = 1e-6;
91 int n;
92 pair<double, int> p[12];//方程的系数, 方程次数
93
94 double f(double x)//方程
95 {
96 double sum = 0.0;
97
98 for (int i = 0; i < n; ++i){
99 if (p[i].second < 0)
100 continue;
101 sum += p[i].first * pow(x, p[i].second);
102 }
103
104 return sum - p[n].first;//减去值
105 }
106
107 double ff(double x)//导数
108 {
109 double sum = 0.0;
110
111 for (int i = 0; i < n; ++i){
112 if (p[i].second <= 0)
113 continue;
114 sum += p[i].first * p[i].second * pow(x, p[i].second-1);
115 }
116
117 return sum;
118 }
119
120 double solve()
121 {
122 double x0 = 1.0;
123 double xn = 1.0;
124
125 while (true){
126 xn = x0 - f(x0)/ff(x0);
127 if (xn-x0 < e && x0-xn < e)
128 return x0;
129 x0 = xn;
130 }
131 }
132
133 int main()
134 {
135 int num = 1;
136 bool flag = false;
137
138 while (cin >> n, n != -1){
139 int i;
140 for (i = 0; i < n; ++i){
141 cin >> p[i].second >> p[i].first;
142 }
143 cin >> p[n].second >> p[n].first;
144
145 for (i = 0; i < n; ++i){
146 p[i].second = p[n].second - p[i].second + 1;
147 }
148
149 if (flag){
150 cout << endl;
151 }else{
152 flag = true;
153 }
154
155 printf("Case %d: %.5lf\n", num++, solve()-1);
156 }
157 return 0;
158 }
posted on 2011-04-17 10:56  void-man  阅读(12917)  评论(0编辑  收藏  举报