• Newton迭代法-C++


    牛顿迭代法:

      设定x*是方程f(x)=0的根,选取x0作为x*的近似值,过点(x0, f(x0))做曲线f(x)=0的切线L,L的方程y=f(x0)+f'(x0)(x-x0),求出L与x轴焦点的横坐标x1=x0-f(x0)/f'(x0),称x1为x*的一次近似值,然后设置x0=x1,重复上面的过程,反复迭代,就可以得到一个比较精确的近似值。

    代码实现:

    #include <iostream>
    #include <list>
    using namespace std;
    
    /*
        定义一个list列表存储方程的表达式    
    */
    typedef list<double> Expression; 
    
    /*
        方程系统的初始化:
            n为方程的最高项次数
            第一个输入的为常数项的系数
            第二个输入的为x项的系数
            第三个输入的位x平方的系数
            。。。。如此类推
    */
    void Init(Expression *expression) {
        double n;
        double temp;
        cin>>n;
        for(int i = 1; i <= n+1; i++) {
            cin>>temp;
            expression->push_back(temp);
        }
    }
    
    /*
        拿到x的number次方的值
    */
    double GetValue(int number, double x) {
        double sum = 1;
        for(int i = 1; i <= number; i++) {
            sum *= x;
        }
        return sum;
    }
    
    /*
        求导数的值:
            x为变量的值
            expression为表达式
    */
    double DerivativeValue(double x, Expression *expression) {
        double value = 0;
        int i = 0;
        if(!expression->empty()) {
            for(Expression::iterator it = expression->begin(); it != expression->end(); it++) {
                if(i != 0) {
                    value += (*it)*i*GetValue(i, x);    
                }
                i++;
            }
            return value;
        }
        return 0;
    }
    
    /*
        求函数的值
            x为变量的值
            expression为表达式
    */
    double GetFunctionValue(double x, Expression *expression) {
        double value = 0;
        int i = 0;
        if(!expression->empty()) {
            for(Expression::iterator it = expression->begin(); it != expression->end(); it++) {
                value += (*it)*GetValue(i, x);
                i++;
            }
            return value;
        }
        return 0;
    }
    
    /*
        牛顿迭代法:
            expression为表达式
            x0为初始值
            time为你迭代的次数
    */
    double NewtonIterator(Expression *expression, double x0, int time) {
        for(int i = 1; i <= time; i++) {
            x0 = x0 - GetFunctionValue(x0, expression)/DerivativeValue(x0, expression);
        }
        return x0;
    }
    
    int main() {
        Expression *expression = new Expression();
        Init(expression);
        cout<<NewtonIterator(expression, 1, 10)<<endl;
        return 0;
    }
  • 相关阅读:
    JS定时器做物体运动
    JS做动态表格
    JS如何做2048(详细)
    改变 C/C++ 控制台程序的输出颜色和样式
    The Game Of Life – 数据结构与算法的敲门砖
    适用于 macOS 下 2K 显示器开启 HiDPI 的简便解决方案
    「踩坑记」Android API 判断权限申请结果的闪退问题
    Hello World!
    js 放大镜效果
    js 随机验证码生成及校验
  • 原文地址:https://www.cnblogs.com/rayguo/p/3592412.html
Copyright © 2020-2023  润新知