二分法計算函數(shù)f(x)=x*x*x*x+2*x*x*x-x-1;
成都創(chuàng)新互聯(lián)主營新林網站建設的網絡公司,主營網站建設方案,重慶APP開發(fā),新林h5重慶小程序開發(fā)搭建,新林網站營銷推廣歡迎新林等地區(qū)企業(yè)咨詢
本程序在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對應的函數(shù)值.*/
else
{if(f(a)*f(x)0)
b=x;
else a=x;
}
}
}
舉個例子:
//二分查找法//
# includestdio.h
void main()
{
int a[16],i,num,flag=0,top,bottom,mid;
//定義一個一維數(shù)組a[16]用來存放供查找用的數(shù)據(jù),但只用a[1]——a[15]//
//num用來放要查找的數(shù)據(jù),flag是表示是否找到的開關變量,top表示查找的起始位置,bottom表示查找的終止位置,mid表示top與bottom的中間位置//
char goon;
//變量goon為'y'或'Y'時表示繼續(xù)下一輪查找,否則終止程序//
printf("請輸入第1個數(shù)字:\n");
scanf(" %d",a[1]);
//依次輸入第二到第十五個數(shù),并要求輸入的數(shù)遞減//
for(i=2;i=15;i++)
{
printf("請輸入第%d個數(shù)字:\n",i);
scanf(" %d",a[i]);
if(a[i]=a[i-1])
{
printf("請再次輸入,它應該比上一個數(shù)小:\n");
scanf(" %d",a[i]);
}
}
//輸出剛才輸入的數(shù)//
printf("你剛才輸入的數(shù)是:\n");
for(i=1;i=15;i++)
printf(" %d",a[i]);
printf("\n");
//查找循環(huán)開始//
do
{
printf("現(xiàn)在請輸入你要查找的數(shù):\n");//輸入想要查找的數(shù)//
scanf(" %d",num);
top=15;
bottom=1;
mid=15/2+1;
if(numa[1] || numa[15])//如果要查找的數(shù)據(jù)不在規(guī)定范圍內,令flag=1,輸出超出范圍的信息//
{
flag=1;
printf("你所要查找的數(shù)字不在范圍內!\n");
}
while(flag==0 (top-bottom)0)//如果在規(guī)定的范圍內,開始二分法查找//
{
if(num==a[mid])//找到所需數(shù)據(jù),退出本層循環(huán)//
{
printf("你所要查找的數(shù)字是第%d個。\n",mid);
flag=1;
}
else if(numa[mid])//如果要查找的數(shù)據(jù)比a[mid]大,在前半數(shù)組查找//
{
top=mid+1;
mid=(top+bottom)/2;
}
else //如果要查找的數(shù)據(jù)比a[mid]小,在后半數(shù)組查找//
{
bottom=mid-1;
mid=(top+bottom)/2;
}
}
if(flag==0)//如果未找到數(shù)據(jù),輸出找不到的信息//
printf("無法找到你要找的數(shù)字!\n");
printf("是否繼續(xù)查找?(Y/N):\n");//詢問是否開始下一輪查找//
scanf(" %c",goon);
}while(goon=='y' || goon=='Y');
}
這段代碼是求解方程f(x)=0在區(qū)間[-10,10]上的根的數(shù)值解。
方法的思想就是:一直選取區(qū)間中間的數(shù)值,如果發(fā)現(xiàn)中間的函數(shù)值與一側函數(shù)值,異號,那么說明解在這個更小的區(qū)間中,采用eps=1e-5作為區(qū)間的極限大小,通過迭代的方法求解這個方程的數(shù)值解。
所以了解了上述思想,那么else if(f(a)*f(c)0) b=c; 說明的是 f(a)和f(c)異號,那么使用b=(a+b)/2縮小迭代區(qū)間,繼續(xù)迭代;同理else a=c;說明f(a)和f(c)同號,那么使用a(a+b)/2縮小迭代區(qū)間,繼續(xù)迭代!