//二分法!
/*
========================================================
题目:用二分法求解方程3x^3-2x^2-16=0的近似解。
=========================================================
*/
#include <stdio.h>
#include <math.h>
double hs(double t)
{
return 3*t*t*t-2*t*t-16;//注意一定是单调函数,否则会得到局部解。考试时如果该函数是单调的,就可以用二分法快速求解!
}
void main()
{
double x0,x1,x2,f0,f1,f2;
printf("方程为:\n");
printf("3x^3-2x^2-16=0\n");
while ((f1*f2)>0)
{
printf("边界:\nx1=");
scanf("%lf",&x1);
printf("x2=");
scanf("%lf",&x2);
f1=hs(x1);
f2=hs(x2);
if((f1*f2)>0)
printf("\n请扩大区间!重新输入");
}
while(fabs(f0)>1e-9)
{
x0=(x1+x2)/2;
f0=hs(x0);
if ((f0*f1)>0)
{
x1=x0;
f1=f0;
}
else
{
x2=x0;
f2=f0;
}
}
printf("解得:\nx=%.4lf\n",x0);
}
/*
========================================================
评:思路是先找到两个不点使得对应的函数值异号(在零点两侧),这可以
通过将两点距离放大来实现,然后不断更新区间,总使得两点异号直到区间
足够小,则可近似得到此问题的解。二分法最符合人的思维模式,逻辑简单!
容易掌握!相比牛顿迭代法和穷举法,写程序略显麻烦!
=========================================================
*/
版权声明:本文为博主原创文章,未经博主允许不得转载。