zoukankan      html  css  js  c++  java
  • c语言 牛顿迭代法求解高阶一元方程

    现在有一个任意的高阶一元方程,x的幂可以任意数,求解该方程的解

    例如,现在有x的三次方+2x+3,求解其根

    首先直接放解法代码

    #include<stdio.h>
    #include<stdlib.h>
    #include<math.h>
    
    double func(double x) //函数
    {
        return x*x*x+2*x+3.0;
    }
    double func1(double x) //导函数
    {
        return 3*x*x+2.0;
    }
    int newton(double *x,double precision,int maxcycle) //迭代次数
    {
        double x0;
        for(int i=0;i<maxcycle;i++)//迭代次数要低于规定次数
        {
            if(func1(*x)==0.0)//若通过初值,函数返回值为0
            {
                printf("迭代过程中导数为0,存在极值!
    ");
                return 0;
            }
            x0=*x-func(*x)/func1(*x);//进行牛顿迭代计算,这个是迭代公式
            if(fabs(x0-*x)<precision || fabs(func(x0))<precision) //达到结束条件
                return 1;
            else //未达到结束条件
                *x=x0; //准备下一次迭代
        }
        printf("次数超过预期!
    "); //迭代次数达到,仍没有达到精度
        return 0;
    }
    
    int main()
    {
        double x,precision;
        int maxcyc;//迭代次数
        printf("输入初始值x0:");
        scanf("%lf",&x);
        printf("输入最大迭代次数:");
        scanf("%d",&maxcyc);
        printf("精度:");
        scanf("%lf",&precision);
        if(newton(&x,precision,maxcyc)==1) //若函数返回值为1
            printf("该值附近的根为:%lf
    ",x);
        else //若函数返回值为0
            printf("error");
    }

    该方法采用牛顿迭代法求解,理论上可以求解任意幂次的方程,但是首先需要自行判断出一个初始点

    具体的解法可以参考b站的一个视频,视频中已经给出了思路,代码还需要自行思考

  • 相关阅读:
    Discuz! 的编码规范
    Golang 并发编程指南
    Hyrum's Law
    从数组中将变量导入到当前的符号表
    map[interface {}]interface {} yaml文件解码
    迪基福勒检验
    约定式路由
    use of internal package github.com/gokratos/kratos/v2/internal/httputil not allowed
    See https://v8.dev/blog/mathrandom for details.
    Cast a value as a certain type
  • 原文地址:https://www.cnblogs.com/oldfish123/p/14110820.html
Copyright © 2011-2022 走看看