(C语言)牛顿迭代法求解对数方程

牛顿迭代法:

简单来说,是将函数f(x)逐步线性化,最终求出非线性方程f(x)=0的近似解。

这里需要知道f(x)的泰勒展开式,小编就不多说了,因为小编也不太了解 ,一般而言,只需要得知一次泰勒展开即可求解对数方程。


f ( x ) ≈ f ( x 0 ) + f ′ ( x 0 ) ( x − x 0 ) f(x)\approx f(x0)+f'(x0)(x-x0) f(x)f(x0)+f(x0)(xx0)
设 x ∗ 为 实 际 的 根 , 则 可 知 f ( x ∗ ) = 0 , 即 设 x* 为实际的根,则可知f(x*)=0,即 xf(x)=0
x ∗ = x 0 − f ( x 0 ) / f ′ ( x 0 ) x*=x0-f(x0)/f'(x0) x=x0f(x0)/f(x0)

接下来看一个实例:

图源自计蒜客
该题的变量有两个,x为所求量,a为键盘输入量。
根据牛顿迭代法的近似式子,我们可以定义f(x)和f’(x),手动求出一阶导函数。

亿些细节:
在这里插入图片描述

题目要求误差范围不超过 1 0 − 4 10^-4 104,这里我们可以借助一个函数 fabs() 来表示 x 与 x1 的差值。(具体用法请自行搜索相关知识)

fabs(x-x1)<=1e-4

于是乎,我们就可以使用一个循环语句,使x1不断逼近x,最终求出近似解。

话不多说,上代码!!!

代码如下:

#include<stdio.h>
#include<math.h>
int main()
{
    double a,x,x1,f,ff;
    //全部定义为双精度浮点数,ff为f的一阶导
    scanf("%lf",&a);
    //这里我们需要给x赋一个初值,避免增加不必要的循环次数
    //也可以不按照以下做法赋初值,但切记 x!=0
    if(a<0){
        x=0.2;
    }
    else if(a==0){
        x=0.3;
    }
    else{
        x=a;
    }
    do{
        x1=x;
        f=x1+log(x1)-a;//手动写出f(x)和f'(x)表达式
        ff=1+1.0/x1;
        x=x1-f/ff;
    }while(fabs(x-x1)>=1e-4);
    printf("%.6f",x);
    return 0;
}

以上代码是小编自己写的,如有雷同,还请见谅。
在这里插入图片描述

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值