#include<math.h>
int main()
{
float x1,x,f1,f2static int count=0
x1=1.5//定义初始值
do
{
x=x1
f1=x*(2*x*x-4*x+3)-6
f2=6*x*x-8*x+3//对函数f1求导
x1=x-f1/f2 count++
}while(fabs(x1-x)<=1e-5)
printf("%8.7f\n",x1)printf("%d\n",count)
return 0
}
//2x3-4x2+3x-6//根据我改了初始值,查看结果,表明:改变初始值得到的结果并不一样,但是迭代的次数并没有改变!!
给你一点提示。牛顿迭代法要计算
(1)
y1=f(x)
在
x
的函数值
(2)
d1=f(x)
的一阶导数
在
x
的值
你可以写两个函数,分别计算y1,d1
如果一阶导数有解析解,则可用赋值语句,否则要写数值解子程序。
步骤:
设解的精度,例
float
eps=0.000001
设x初值,x1
算y1=f(x1)
迭代循环开始
算一阶导数
在
x1
的值
d1
用牛顿公式
算出
x2
[x2
=
x1
-
y1
/
d1]
如果
fabs(x2-x1)
>
eps
则从新迭代
--
用新的函数值和一阶导数值推下一个
新x.
#include <stdio.h>#include <math.h>
int main(void)
{
double x, x0, d
x0 = 0
do {
x = x0 - (x0 - exp(-x0)) / (1 + exp(-x0))
d = x - x0
x0 = x
} while (d >= 1e-10)
printf("%.10f", x)
return 0
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)