如果連續(xù)函數(shù)在給定區(qū)間不單調(diào),很有可能中值*下界值和中值*上界值都大于0,那么會(huì)跳出認(rèn)為沒(méi)有根,而事實(shí)上很有可能這個(gè)中值點(diǎn)靠近函數(shù)極點(diǎn)。
創(chuàng)新互聯(lián)堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:網(wǎng)站設(shè)計(jì)、網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿(mǎn)足客戶(hù)于互聯(lián)網(wǎng)時(shí)代的雙牌網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
而真正用二分法求給定區(qū)間的思路是:
首先為函數(shù)求導(dǎo),算出導(dǎo)函數(shù)的零點(diǎn),然后再判斷零點(diǎn)性質(zhì),最后將函數(shù)區(qū)間分為單調(diào)遞增和單調(diào)遞減間隔的形式,對(duì)每一段進(jìn)行二分法求根。
#include?stdio.h
#include?math.h
#define?DEFAULT_UPPER????(10)
#define?DEFAULT_LOWER????(-10)
#define?DEFAULT_E????(0.00000001)
#define?_MID(x,y)????((x+y)/2)
#define?_VALUE(x)????(2*x*x*x-4*x*x+3*x-6)????
double?_e;
int?getRoot(double?lower,?double?upper,?double?*result);
main()
{
double?root;
printf("Enter?a?deviation:");
scanf("%lf",?_e);
if(_e?==?0.0)
_e?=?DEFAULT_E;
if(getRoot(DEFAULT_LOWER,?DEFAULT_UPPER,?root))
printf("Root:%2.8lf\n",?root);
else
printf("Root:No?Solution.\n");
}
int?getRoot(double?lower,?double?upper,?double?*result)
{
*result?=?_MID(lower,upper);
if(upper?-?lower?=?_e)
return?1;
if(_VALUE(lower)*_VALUE(*result)?=?0)
return?getRoot(lower,?*result,?result);
else?if(_VALUE(*result)*_VALUE(upper)?=?0)
return?getRoot(*result,?upper,?result);
else?
return?0;
}
二分法計(jì)算函數(shù)f(x)=x*x*x*x+2*x*x*x-x-1;
本程序在turbo c或c++下編譯
#include "stdio.h"
#include math.h
float f(float x)
{float y;
y=x*x*x*x+2*x*x*x-x-1;
return y;
}
void main()
{float a=0,b=0,h,y,x;
int k,n0;
printf("please input qujian a and b");
scanf("%f%f%d",a,b,n0); /*輸入含根區(qū)間a,b,循環(huán)次數(shù)n0 */
for(k=0;k=n0;k++)
{ x=(a+b)/2;
h=(b-a)/2;
y=f(x);
if(h10e-6||fabs(y)10e-6)
{ printf("k=%d,x=%f,y=%f",k,x,y);
break; } /*輸出分半次數(shù)k,函數(shù)的根x,及x對(duì)應(yīng)的函數(shù)值.*/
else
{if(f(a)*f(x)0)
b=x;
else a=x;
}
}
}
這段代碼是求解方程f(x)=0在區(qū)間[-10,10]上的根的數(shù)值解。
方法的思想就是:一直選取區(qū)間中間的數(shù)值,如果發(fā)現(xiàn)中間的函數(shù)值與一側(cè)函數(shù)值,異號(hào),那么說(shuō)明解在這個(gè)更小的區(qū)間中,采用eps=1e-5作為區(qū)間的極限大小,通過(guò)迭代的方法求解這個(gè)方程的數(shù)值解。
所以了解了上述思想,那么else
if(f(a)*f(c)0)
b=c;
說(shuō)明的是
f(a)和f(c)異號(hào),那么使用b=(a+b)/2縮小迭代區(qū)間,繼續(xù)迭代;同理else
a=c;說(shuō)明f(a)和f(c)同號(hào),那么使用a(a+b)/2縮小迭代區(qū)間,繼續(xù)迭代!
if(c*d0)
{
a=m;
c=n;
}
else
{
b=m;
d=n;
}
改為
if(m*d0)
{
a=m;
c=m;
}
else
{
b=m;
d=m;
}
二分法的基本思路是:任意兩個(gè)點(diǎn)x1和x2,判斷區(qū)間(x1,x2)內(nèi)有無(wú)一個(gè)實(shí)根,如果f(x1)與f(x2)符號(hào)相反,則說(shuō)明有一實(shí)根。接著?。▁1,x2)的中點(diǎn)x,檢查f(x)和f(x2)是否同號(hào),如果不同號(hào),說(shuō)明實(shí)根在(x,x2)之間,如果同號(hào),在比較(x1,x),這樣就將范圍縮小一半,然后按上述方法不斷的遞歸調(diào)用,直到區(qū)間相當(dāng)小(找出根為止)!
比如用二分法求f(x)=x^3-6x-1=0的實(shí)根。
代碼如下(已調(diào)試):
#include
"math.h"
main()
{
float
x,x1,x2;
float
F(float
x,float
x1,float
x2);
printf("請(qǐng)輸入?yún)^(qū)間[x1,x2]\n");
scanf("%f%f",x1,x2);
printf("x=%f\n",F(x,x1,x2));
}
float
F(float
x,float
x1,float
x2)
{
float
f,f1,f2;
do
{
f1=pow(x1,3)-6*x1-1.0;
f2=pow(x2,3)-6*x2-1.0;
}while(f1*f20);
//確保輸入的x1,x2使得f1,f2符號(hào)相反
do
{
x=(x1+x2)/2;
//求x1,x2的中點(diǎn)
f=pow(x,3)-6*x-1.0;
if(f1*f0)
//當(dāng)f與f1符號(hào)相同時(shí)
{x1=x;f1=f;}
else
if(f2*f0)
//當(dāng)f與f2符號(hào)相同時(shí)
{x2=x;f2=f;}
}while(fabs(f)1e-6);
//判斷條件fabs(f)1e-6的意思是f的值非常0
return
x;
}
輸入:1
5
則輸出:x=2.528918
輸入:-10
10
則輸出:x=2.528918