zoukankan      html  css  js  c++  java
  • 【清橙A1094】【牛顿迭代法】牛顿迭代法求方程的根

    问题描述
      给定三次函数f(x)=ax3+bx2+cx+d的4个系数a,b,c,d,以及一个数z,请用牛顿迭代法求出函数f(x)=0在z附近的根,并给出迭代所需要次数。
      牛顿迭代法的原理如下(参考下图):
      设xk是方程f(x)=0的精确解x*附近的一个猜测解,过点Pk(xk,f(xk))作f(x)的切线。该切线与x轴的交点比xk更接近方程的精确解程x*。
      迭代公式为:xk+1= xk - f(xk)/f '(xk),当f(x)的绝对值足够小的时候即可结束迭代。
      注意:对于本题给定函数f(x),f '(x)=3ax2+2bx+c,且当|f(x)| ≤10-7时,即可认为x是f(x)=0的根。
    输入格式
      输入共2行。
      第一行为4个整数,每2个数之间用一个空格隔开,分别是a,b,c,d
      第二行为一个实数z。
    输出格式
      共一行。包含2个数,之间用一个空格隔开,第一个数是实数x,表示所求的根,精确到小数点后3位;第二个数是一个整数n,表示求得上述根需要的迭代次数。
    样例输入
    2 -9 5 3
    3
    样例输出
    3.719 7
    提示
      程序中需要使用浮点数时,请用double类型
    【分析】
    记录一下。
    /*
    宋代苏轼
    《临江仙·夜饮东坡醒复醉》
    夜饮东坡醒复醉,归来仿佛三更。家童鼻息已雷鸣。敲门都不应,倚杖听江声。
    长恨此身非我有,何时忘却营营。夜阑风静縠纹平。小舟从此逝,江海寄余生。  
    */
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <cmath>
    #include <queue>
    #include <vector>
    #include <iostream>
    #include <string>
    #include <ctime>
    #define LOCAL
    const double Pi = acos(-1.0);
    const int MAXN = 200000 + 10;
    const double eps =  1e-7;
    using namespace std;
    typedef long long ll;
    double f(int a, int b, int c, int d, double x){return a * x * x * x + b * x * x + c * x + d;}
    double fd(int a, int b, int c, double x){return 3 * a * x * x + 2 * b * x + c;}
    
    int main(){
       
        int a, b, c, d;
        double z;
        scanf("%d%d%d%d", &a, &b, &c, &d);
        scanf("%lf", &z);
        int cnt = 1;
        double x = z;
        while (f(a, b, c, d, x) > eps || f(a, b, c, d, x) < -eps){
              x = x - f(a, b, c, d, x) / fd(a, b, c, x);
              cnt++;
        }
        printf("%.3lf %d
    ", x, cnt);
        return 0;
    }
    View Code
  • 相关阅读:
    旅行计划
    两只塔姆沃斯牛
    迷宫
    异或序列
    异或之和
    素数个数
    SAC E#1
    [JSOI2010]Group 部落划分 Group
    [USACO12FEB]附近的牛Nearby Cows
    [HNOI2008]Cards
  • 原文地址:https://www.cnblogs.com/hoskey/p/4377077.html
Copyright © 2011-2022 走看看