用二分法求下面的一元三次方程
在区间[-10, 10]上误差不大于的根。
用二分法求方程的根的基本原理是:若函数有实根,则函数曲线应当在根x*这一点上与x轴有一个交点,并且由于函数是单调的,在根附近的左右区间内,函数值的符号应当相反。利用这一特点,可以通过不断将求根区间二分的方法,每次将求根区间缩小为原来的一半,在新的折半后的区间内继续搜索方程的根,对根所在区间继续二分,直到求出方程的根为止。
该方法的关键在于要解决如下两个问题:
1)如何对区间进行二分,并在二分后的左右两个区间中确定下一次求根搜索的区间?
假设区间端点为x1和x2,则通过计算区间的中点x0,即可将区间[x1, x2]二分为[x1, x0]和[x0, x2]。这时,为了确定下一次求根搜索的区间,必须判断方程的根在哪一个区间内,由上图可知方程的根所在区间的两个端点处的函数值的符号一定是相反的。也就是说,如果f(x0)与f(x1)是异号的,则根一定在左区间[x1, x0]内,否则根一定在右区间[x0, x2]内。
2)如何终止这个搜索过程?即如何确定找到了方程的根?
对根所在区间继续二分,直到,即|f(x0)|≈0时,则认为x0是逼近函数f(x)的根。
输入格式:
"%f,%f"
输出格式:
"x=%6.2f\n"
输入样例:
0,4
#include <stdio.h>
#include <math.h>
float Delta = 0.000001f;
float Function(float x)
{
float f = x*x*x - x - 1;
return f;
}
int main()
{
float x_Left, x_Right, f_Left, f_Right;
scanf_s("%f,%f", &x_Left, &x_Right);
f_Left = Function(x_Left);
f_Right = Function(x_Right);
if (fabs(f_Left) < Delta)
printf("x=%6.2f\n", x_Left);
if (fabs(f_Right) < Delta)
printf("x=%6.2f\n", x_Right);
if (fabs(f_Left)>Delta && fabs(f_Right)>Delta)
{
float x_New;
float f_New;
do
{
x_New = (x_Left + x_Right)*0.5f;
f_New = Function(x_New);
if (f_Left*f_New < 0)
x_Right = x_New;
if (f_Right*f_New < 0)
x_Left = x_New;
} while (fabs(f_New) >= Delta);
printf("x = %6.2f\n", x_New);
}
return 0;
}