牛顿迭代法:
简单来说,是将函数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)(x−x0)
设
x
∗
为
实
际
的
根
,
则
可
知
f
(
x
∗
)
=
0
,
即
设 x* 为实际的根,则可知f(x*)=0,即
设x∗为实际的根,则可知f(x∗)=0,即
x
∗
=
x
0
−
f
(
x
0
)
/
f
′
(
x
0
)
x*=x0-f(x0)/f'(x0)
x∗=x0−f(x0)/f′(x0)
接下来看一个实例:
该题的变量有两个,x为所求量,a为键盘输入量。
根据牛顿迭代法的近似式子,我们可以定义f(x)和f’(x),手动求出一阶导函数。
亿些细节:
题目要求误差范围不超过 1 0 − 4 10^-4 10−4,这里我们可以借助一个函数 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;
}
以上代码是小编自己写的,如有雷同,还请见谅。