版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yyzsir/article/details/78712887
使用牛顿迭代法(在1.5附近)和二分法(在(-10,10)区间内)求2*x*x*x-4*x*x+3*x-6=0的根
牛顿迭代法:
算法分析:假设方程f(x)=0,在x0附近有一个根,那么用xn+1=xn-f(xn)/f’(xn)。依次计算x1,x2,x3,…………,那么这个序列无限逼近方程的根。原理是根据f(x)在x0附近的值和斜率,估计f(x)和x轴的交点。
#include<stdio.h>
int main()
{
double x=1.5;
double fx,f1x,eps=0.00001;
do
{
fx=2*x*x*x-4*x*x+3*x-6;
f1x=6*x*x-8*x+3;
x=x-fx/f1x;
if(fx<0)fx=-fx;
if(fx<eps)break;
}while(1>0);
printf("%lf",x);
return 0;
}
二分法:
算法分析:对于区间[a,b]上连续不断且f(a)·f(b)<0的函数y=f(x),通过不断地把函数f(x)的零点所在的区间一分为二,使区间的两个端点逐步逼近零点,进而得到零点近似值的方法。
#include<stdio.h>
int main()
{
double l=-10.0,h=10.0; //划定区间,默认函数在-10出取负值,在10处取正值
double m,fm,eps=0.000001; //规定逼近值eps
do
{
m=(l+h)/2; //找到区间中点
fm=2*m*m*m-4*m*m+3*m-6; //计算区间中点函数值
if(fm<0)l=m; //如果区间中点函数值为负值,将区间最小端点赋为区间中点
else h=m; //如果区间中点函数值为正值,将区间最大端点赋为区间中点
if(fm<0)fm=-fm; //如果函数值为负值化为正值便于和eps比较,此处和上述任何一个步骤无关
if(fm<eps)break; //如果函数值趋近与eps,即得到根m
}while(1);
printf("%lf",m)
return 0;
}