?? bowroot.c
字號:
#include <stdio.h>
#include <math.h>
#include <malloc.h>
#include <stdlib.h>
double Func(double);
int BowRoot(double,double,double,double,double *,int,int *);
void main()
{
int i,n,m;
double a,b,h,eps,*x;
n = 3; /*方程根的個數(shù)的預(yù)估值*/
x = (double*)calloc(n,sizeof(double)); /*開辟內(nèi)存空間*/
if(x == NULL)
{
printf("內(nèi)存分配失敗\n");
exit(1);
}
a = -3; /*區(qū)間起始端點*/
b = 5; /*區(qū)間終止端點*/
h = 1; /*步長*/
eps = 1.e-8; /*要求達(dá)到的精度*/
BowRoot(a,b,h,eps,x,n,&m); /*調(diào)用二分法函數(shù)*/
printf("函數(shù)f(x)在范圍%2.0f和%2.0f之間的根有%d個根\n",a,b,m);
printf("它們分別是:\n");
for(i = 0;i<n;i++)
printf("x[%d] = %e\n",i,x[i]);
free(x); /*釋放內(nèi)存空間*/
}
double Func(double x)
{
return (x*x*x-3*x*x-6*x+8);
}
int BowRoot(a,b,h,eps,x,n,m)
double a; /*實型變量,輸入?yún)?shù),求根區(qū)間的起始端點*/
double b; /*實型變量,輸入?yún)?shù),求根區(qū)間的終止端點*/
double h; /*利用逐步掃描法確定根位置時的步長*/
double eps; /*實型變量,輸入?yún)?shù),控制精度的參數(shù)*/
double *x; /*實型一維數(shù)組,輸出參數(shù),存放計算得到的數(shù)組*/
int n; /*輸入?yún)?shù),區(qū)間內(nèi)方程根的個數(shù)的預(yù)估值*/
int *m; /*輸出參數(shù),實際求得的根的個數(shù)*/
{
double z,z1,z2,y,y1,y2;
*m = 0;
z = a;
y = Func(z);
while(1) /*無限循環(huán),直到遇到return或者break語句*/
{/*如果逐步掃描到求根區(qū)間的右端點或者得到的根的個數(shù)達(dá)到預(yù)估根的個數(shù)*/
if((z>b+h/2)||(*m==n))
return(1);
if(fabs(y)<eps) /*如果當(dāng)前根z對應(yīng)的函數(shù)f(z)滿足精度要求*/
{
*m+=1;
x[*m-1] = z; /*將此時的z值賦值給x數(shù)組*/
z+=h/2;
y = Func(z);
continue; /*結(jié)束本次循環(huán),即跳過循環(huán)體中下面尚未執(zhí)行
的語句接著進(jìn)行下一次是否執(zhí)行循環(huán)的判定*/
}
z1 = z+h; /*逐步掃描中小區(qū)間的右端點*/
y1 = Func(z1); /*小區(qū)間右端點對應(yīng)的函數(shù)值*/
if(fabs(y1)<eps) /*如果右端點恰好滿足根的精度要求*/
{
*m+=1;
x[*m-1] = z1;
z = z1+h/2;
y = Func(z);
continue;
}
if(y*y1>0) /*如果對應(yīng)根乘積大于零,說明該區(qū)間內(nèi)沒有根*/
{
y = y1;
z = z1;
continue;
}
while(1) /*如果本while循環(huán)執(zhí)行,說明逐步掃描小區(qū)建z和z1間有根*/
{
if(fabs(z1-z)<eps) /*如果滿足精度要求*/
{
*m+=1;
x[*m-1]=(z1+z)/2;
z = z1+h/2;
y = Func(z);
break;
}
y1 = Func(z1); /*弦截法公式*/
y = Func(z);
z2=z1-(y1/(y1-y))*(z1-z);
y2 = Func(z2);
if(fabs(y2)<eps)
{
*m = *m+1;
x[*m-1] = z2;
z =z2+h/2;
y = Func(z);
break;
}
if(y*y2<0) /*如果乘積小于零,說明根在z和z0之間*/
{
z1 = z2;
y1 = y2;
}
else /*否則根在z0和z1之間*/
{
z = z2;
y = y2;
}
}
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -