用牛顿迭代法求方程的根——C语言实现

原理

参考链接牛顿法——知乎。比如说我想求一个函数 f ( x ) = 0 f(x)=0 f(x)=0的解,利用牛顿迭代法的话可以如下构造:
x n + 1 = x n − f ( x n ) f ′ ( x n ) x_{n+1}=x_n-\frac{f(x_n)}{f'(x_n)} xn+1=xnf(xn)f(xn)

代码

下面时C语言实现代码

#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#define N 200                                                               //最大迭代次数
#define EPS 0.000001                                                        //收敛误差
double newton(double (*fun)(double), double (*partialfun)(double), double); //牛顿迭代法,包括两个函数指针
double fun(double x);                                                       //原函数
double partialfun(double x);                                                //导函数
int main(int argc, char* argv[])
{
    double x0, root;
    x0   = 1;
    root = newton(fun, partialfun, x0);
    printf("迭代初值:%lf\n根:%lf\n", x0, root);
    return 0;
}
double fun(double x) //原函数
{
    return cos(x) - x * x * x;
}
double partialfun(double x) //原函数的导数
{
    return -sin(x) - 3 * x * x;
}
double newton(double (*fun)(double), double (*partialfun)(double), double xn)
{
    double xn1;
    for (int i = 0; i < N; i++) {
        xn1 = -(*fun)(xn) / (*partialfun)(xn) + xn;
        if (fabs(xn1 - xn) < EPS) {
            printf("迭代次数:%d\n", i+1);
            return xn1;
        }
        xn = xn1;
    }
    printf("迭代发散!");
    exit(0);
}

运行结果

方程cos(x)-x^3=0的解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值