#include
#include
double root(double (*f)(double),double (*f1)(double), double x,double eps);
double fx(double x){
return 2*x*x*x-4*x*x+3*x-6;
}
double fp(double x){
return 6*x*x-8*x+3;
}
int main()
{
double x=1.5,y,eps=1e-08;
printf("input eps 1e-08n"); scanf("%lf",&eps);
y = root(fx,fp,x,eps);
printf("%lfn",y);
return 0;
}
double root(double (*f)(double x),double (*f1)(double x), double x,double eps){
double x0,x1;
x0=x;
while(1){
x1= x0 - (*f)(x0)/ (*f1)(x0);
if (fabs(x1-x0) x0=x1; }; return x1; } 运行与输出: input eps 1e-08 1e-08 2.000000 (n))^2-sinx(n)-1]/[18x(n)-cosx(n)]. 取x(0)=0.5, x(1)=0.405129911, x(2)=0.392101462, x(3)=0.391847004, x(4)=0.391846907, 3次迭代已经得到四位近似值x=0.3918. 二分法: f(x)=9x^2-sinx-1. f(0)=-1,f(1)=7.15853,f(0.5)=0.770577. f(0.25)=-0.68490, f[(0.25+0.5)/2]=f(0.375)=-0.10065, f[(0.375+0.5)/2]=f(0.4375)=0.29898, f[(0.375+0.4375)/2]=f(0.40625)=0.09018, ...... 要13次左右才能得到四位近似值. 牛顿迭代法是一种常用的计算方法,这个大学大三应该学过。 具体为:设r是f(x) = 0的根,选取x0作为r初始近似值,过点(x0,f(x0))做曲线y = f(x)的切线L,L的方程为y = f(x0)+f'(x0)(x-x0),出L与x轴交点的横坐标 x1 = x0-f(x0)/f'(x0),称x1为r的一次近似值。过点(x1,f(x1))做曲线y = f(x)的切线,并该切线与x轴交点的横坐标 x2 = x1-f(x1)/f'(x1),称x2为r的二次近似值。重复以上过程,得r的近似值序列,其中x(n+1)=x(n)-f(x(n))/f'(x(n)),称为r的n+1次近似值,上式称为牛顿迭代公式。 你把这段文字认真仔细慢慢读一遍,把给的方程式写出来,然后照这个在纸上画出图形,就会明白牛顿迭代法的概要了。 你讲的xopint?root?float?这些都是自己定义的函数。float是c语言中定义浮点型变量的写法。 #include #include void main() { float f(float); float xpoint(float,float); float root(float,float); float x,x1,x2,f1,f2; do { printf("输入x1,x2nn"); scanf("%f%f",&x1,&x2); f1=f(x1); f2=f(x2); }while(f1*f2>0); x=root(x1,x2); printf("方程在1.5附近的根为:%fnn",x); } float f(float x)//定义一个f函数,返回值y { float y; y=2*x*x*x-4*x*x+3*x-6; return(y); } float xpoint(float x1,float x2)//定义一个带返回值的函数即y,也就是y的函数,main()中调用 { float y; y=(x1*f(x2)-x2*f(x1))/(f(x2)-f(x1)); return(y); } float root(float x1,float x2)//这也是定义一个函数,是根的函数,利用了上面自己定义的函数 { float x,y,y1; y1=f(x1); do { x=xpoint(x1,x2); y=f(x); if(y*y1>0) { y1=y; x1=x; } else x2=x; }while(fabs(y)>1e-4); return(x); } 建议你看看c 语言教程,上面讲得很详细噢。C语言编程牛顿迭代法sinxx2在x pi附近的一个实根精度小于104
C语言编程中牛顿迭代法是什么