新聞中心
求助C語(yǔ)言二分法求函數(shù)零點(diǎn)
#include stdio.h
創(chuàng)新互聯(lián)建站是專業(yè)的呼蘭網(wǎng)站建設(shè)公司,呼蘭接單;提供網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì),網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行呼蘭網(wǎng)站開(kāi)發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛(ài)的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來(lái)合作!
#include math.h
double fun_math(double);
int main(void)
{
/*? 根據(jù)函數(shù)可知Y是關(guān)于x的一個(gè)遞增函數(shù) */
/*? 先判斷輸入Y時(shí),X在(0,1)時(shí)是否有解 */
double Y;
double X=0 ,big_x=1.0,small_x=0,tmp_X=1;
unsigned int tmp=0;
printf("Please enter Y:");
scanf("%lf",Y);
if(fun_math(1) = Y fun_math(0) = Y)
{
while(tmp_X != X)
{
X =(big_x + small_x)/2;
if(fun_math(X)==Y) break;
if(fun_math(X)Y) big_x = X;
else small_x = X;
tmp_X = X ;
X =(big_x + small_x)/2;
}
printf("X = %.6lf",X);
}
else printf("while Y=%lf, X(0,1) on results\n",Y);
return 0;
}
用二分法求函數(shù)零點(diǎn)的條件
一般地,對(duì)于函數(shù)f(x),如果存在實(shí)數(shù)c,當(dāng)x=c是f(c)=0,那么把x=c叫做函數(shù)f(x)的零點(diǎn)。
解方程即要求f(x)的所有零點(diǎn)。
先找到a、b,使f(a),f(b)異號(hào),說(shuō)明在區(qū)間(a,b)內(nèi)一定有零點(diǎn),然后求f【(a+b)/2】,
現(xiàn)在假設(shè)f(a)0,f(b)0,a
0,同上
通過(guò)每次把f(x)的零點(diǎn)所在小區(qū)間收縮一半的方法,使區(qū)間的兩個(gè)端點(diǎn)逐步迫近函數(shù)的零點(diǎn),以求得零點(diǎn)的近似值,這種方法叫做二分法。
由于計(jì)算過(guò)程的具體運(yùn)算復(fù)雜,但每一步的方式相同,所以可通過(guò)編寫程序來(lái)運(yùn)算。
例:(c語(yǔ)言)
方程式為:f(x)
=
0,示例中f(x)
=
1+x-x^3
(二分法)C語(yǔ)言程序
1、打開(kāi)Python開(kāi)發(fā)工具IDLE,新建‘search.py’。
2、F5運(yùn)行程序,list1被正確排序,寫這個(gè)的目的是說(shuō)明二分法查找必須前提是一個(gè)有序的列表,如果一開(kāi)始無(wú)序首先要排序,當(dāng)數(shù)據(jù)量大的時(shí)候,快速排序是一個(gè)很好的選擇,再進(jìn)行二分法查找。
3、用遞歸的思想,遞歸就一定有結(jié)束條件。
4、if len(li)==1: ? #li長(zhǎng)度等于1,只比較這個(gè)列表元素與要查找到值return li[0]==item。
5、if len(li)==0: #li長(zhǎng)度等于0,全部查找結(jié)束還是沒(méi)有這個(gè)值? return False。
6、為程序添加main方法。
7、F5運(yùn)行程序,正確打印出二分法查找結(jié)果,F(xiàn)alse True。
怎樣用二分法求解函數(shù)的零點(diǎn)
就是求2個(gè)點(diǎn)的中點(diǎn)的值
比如f(x)中f(a)0,f(b)0
那就求f((a+b)/2)的值
如果f((a+b)/2)0把f((a+b)/2)賦值給f(a),f(b)不變,繼續(xù)重復(fù)上面的過(guò)程。
如果f((a+b)/2)0把f((a+b)/2)賦值給f(b),f(a)不變,繼續(xù)重復(fù)上面的過(guò)程。
直到|f(a)-f(b)|小于你給定的一個(gè)很小的數(shù),就可以得到近似解了。
對(duì)于函數(shù)y=f(x)(x∈R),我們把方程f(x)=0的實(shí)數(shù)根x叫作函數(shù)y=f(x)(x∈R)的零點(diǎn)(the zero of the function)。即函數(shù)的零點(diǎn)就是使函數(shù)值為0的自變量的值。函數(shù)的零點(diǎn)不是一個(gè)點(diǎn),而是一個(gè)實(shí)數(shù)。
擴(kuò)展資料:
函數(shù)y=f(x)的零點(diǎn)就是方程f(x)=0的實(shí)數(shù)根,也就是函數(shù)y=f(x)的圖像與x軸(直線y=0)交點(diǎn)的橫坐標(biāo),所以方程f(x)=0有實(shí)數(shù)根,推出函數(shù)y=f(x)的圖像與x軸有交點(diǎn),推出函數(shù)y=f(x)有零點(diǎn)。
函數(shù)F(x)=f(x)-g(x)的零點(diǎn)就是方程f(x)=g(x)的實(shí)數(shù)根,也就是函數(shù)y=f(x)的圖像與函數(shù)y=g(x)的圖像交點(diǎn)的橫坐標(biāo),這個(gè)結(jié)論很有用。
若f(x1)=0,則x1就是函數(shù)的零點(diǎn);若f(a)f(x1)0,則令b=x1(此時(shí)零點(diǎn)x∈(a,x1));即圖象為(a,x1);若f(x1)f(b)0,則令a=x1。(此時(shí)零點(diǎn)x∈(x1,b)
參考資料來(lái)源:百度百科--二分法
參考資料來(lái)源:百度百科--函數(shù)零點(diǎn)
用C語(yǔ)言,運(yùn)用二分法,求函數(shù)零點(diǎn)。
#includestdio.h
#includemath.h
typedef double(*fun)(double xx);//函數(shù)指針
#define e 0.000001 //誤差
void eff(double a,double b,fun hs)//二分法
{int i=0;
while(fabs(hs(a)-hs(b))efabs(a-b)e){i++;
if(hs(a)*hs((b+a)/2)0){
a=(a+b)/2;
printf("迭代第%d次:\t%f\n",i,a);
}
else {
b=(a+b)/2;
printf("迭代第%d次:\t%f\n",i,b);
}
}
}
double hs1(double xx)//函數(shù)f(x)=x^3+x^2-3x-3
{return xx*xx*xx+xx*xx-3*xx-3;}
double hs2(double xx)//函數(shù)f(x)=lnx+x
{return log(xx)+xx;}
void main()
{
printf("用二分法求方程x^3+x^2-3x-3=0在1.5附近的根\n");
eff(1.0,2.0,hs1);
printf("用二分法求方程lnx+x在0.5附近的根\n");
eff(0.0,1.0,hs2);
}
C語(yǔ)言:二分法
這段代碼是求解方程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ù)迭代!
網(wǎng)站欄目:二分法函數(shù)的零點(diǎn)c語(yǔ)言,函數(shù)零點(diǎn)與二分法
當(dāng)前地址:http://www.dlmjj.cn/article/hoijoh.html