1. 程式人生 > >C語言之基本演算法23—二分法求方程近似根

C語言之基本演算法23—二分法求方程近似根

//二分法!
/*
========================================================
題目:用二分法求解方程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);
}


/*
========================================================

評:思路是先找到兩個不點使得對應的函式值異號(在零點兩側),這可以

通過將兩點距離放大來實現,然後不斷更新區間,總使得兩點異號直到區間

足夠小,則可近似得到此問題的解。二分法最符合人的思維模式,邏輯簡單!

容易掌握!相比牛頓迭代法和窮舉法,寫程式略顯麻煩!

=========================================================
*/