题目:用二分法求f(x)=x^3+x^2-3*x-3=0的正根(精度要求精确到1E-3)。
(1)分析结果的正确性。
(2)进一步考虑如何求出所有根。
算法分析:
(1)分析题目要求,由于方程是一元三次方程。所以方程应该存在三个根,由于题目要求只求正根,所以下面在用二分法之前应先给定一个正区间。
(2)令f=x^3+x^2-3*x-3,并给定:区间[a,b],其中a>=0,且要保证f(a)*f(b)<0.
(3)这里首先令x1=a,x2=b,先给x一个初值为((x1+x2)/2),判断f((x1+x2)/2)即f(x)的正、负。
若为负数即f(x)<0,则把((x1+x2)/2)赋给x1(或x2),即新区间的左(或右)端点;
若为正数即f(x)>0,则把((x1+x2)/2)赋给x2(或x1),即新区间的右(或左)端点;
若为零即f(x)==0,则找到方程的根。
此步骤的原则是使新区间始终保证f(x1)*f(x2)<0。
在此题中由于经过判断知:f=x^3+x^2-3*x-3的一阶导在[1.0,2.0]上大于0,即f=x^3+x^2-3*x-3在[1.0,2.0]上单调增加。又因为此题中f(1)<0,f(2)>0,所以在没找到零点之前,这里的判断条件可以简化为判断区间中左、右端点的正负。与f(a)*f(b)<0的作用相同。
(4)重复步骤(3),直到找到方程的根,或者达到给定精度!则循环停止,这时的x值即为方程的近似值。
C语言实现代码如下:
#include<stdio.h>
#include<math.h>
#define f(x) (x*x*x+x*x-3*x-3)
main()
{
float x,x1,x2;
int t;
t=0;
x=0.0;
x1=0.0;
x2=