
#include<math.h>
double f(double x)
{
return (x*x*x-3*x-1)
}
double dfdx(double x)
{
return (3*x*x-3)
}
void main()
{
double x0=2,x1,y,err
int n=0
double tol=0.5*1.0e-3
printf("解议程x*x*x-3*x-1=0的初始值为x0=%f,误差限为%f\n",x0,tol)
do{
y=dfdx(x0)
if(fabs(y)<1.0e-5){
break
}else{
x1=x0-f(x0)/y
err=x0-x1
n++
printf("迭代%d次的解x%d=%f,error=%f,函数值f(x%d)=%f\n",n,n,x1,err,n,f(x1))
x0=x1
}
}while(fabs(err)>tol)
}
给你一点提示。牛顿迭代法要计算
(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.
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)