• 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闭包
    mysql 创建索引
    模拟title实现提示功能
    数组的深拷贝和浅拷贝
    JavaScript总结之DOM基本操作(三)
    JavaScript总结之数组操作(二)
    JavaScript总结之字符串操作(一)
    Visual Studio Code中JavaScript开发环境的配置
    PhpStorm+PhpStudy开发环境的配置
    如何在个人网站上添加logo图标
  • 原文地址:https://www.cnblogs.com/rayguo/p/3592412.html
Copyright © 2020-2023  润新知