牛顿迭代法在求解三次方程上的应用

来源:互联网 发布:java线程和进程的区别 编辑:程序博客网 时间:2024/05/16 19:53
牛顿迭代法是牛顿在17世纪提出的一种求解方程f(x)=0.多数方程不存在求根公式,从而求精确根非常困难,甚至不可能,从而寻找方程的近似根就显得特别重要。 
设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的近似值序列{Xn},其中Xn+1=Xn-f(Xn)/f'(Xn),称为r的n+1次近似值。上式称为牛顿迭代公式。 
/*
用牛顿迭代法求下面方程
x*x*x-5*x*x+16*x-80=0的实根的过程是
1.你想在谁附近求解,这个范围或者这个数值大多是题目已经给定了的(本例是根据输入的数值来计算的)
2.令f(x)=x*x*x-5*x*x+16*x-80
3.x1=X
4.求f(x1)
5.对f(x)求导,得到f1(x),求f1(x1)
6.调整x,使x=x1-f(x1)/f1(x1)  
7.符合条件x-x1>1e-5,转到第3步
8.不符合条件x-x1>1e-5,则x1就是我们要求的实根
*/
#include <stdio.h>
#include <math.h>
//y=((x-5)*x+16)*x-80
float f(float x)
{
 return (pow(x,3)-5*pow(x,2)+16*x-80);
}
float f1(float x)
{
 return (3*pow(x,2)-10*x+16);
}
void main()
{
 float x,x1,y1,y2;
 printf("请输入一个任意实数:X=");
 scanf("%f",&x);
 printf("我可以帮你找到这个方程的解/n");
 do
 {
  x1=x;
  y1=f(x);
  y2=f1(x1);
  x=x1-y1/y2;
 }
 while (fabs(x-x1)>=1e-5);
 printf("A root is %f/n",x1);
}
原创粉丝点击