zoukankan      html  css  js  c++  java
  • 求解一元多次方程(迭代法) void

    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 }
  • 相关阅读:
    python字符串相关的函数
    令人惊奇的gdb和pstack
    map的正确删除方式
    论道
    自动锁
    delete数组引发的core分析
    linux_硬链接和软链接区别
    vmware的卸载
    vmware + opensuse windows如何远程登录到suse上
    [置顶]援引个人新浪博客
  • 原文地址:https://www.cnblogs.com/void/p/2018735.html
Copyright © 2011-2022 走看看