Ⅰ 請幫我找一下求解一個用二分法求方程近似解的c語言代碼的問題,

二分法的基本思路是:任意兩個點x1和x2,判斷區間(x1,x2)內有無一個實根,如果f(x1)與f(x2)符號相反,則說明有一實根。接著取(x1,x2)的中點x,檢查f(x)和f(x2)是否同號,如果不同號,說明實根在(x,x2)之間,如果同號,在比較(x1,x),這樣就將范圍縮小一半,然後按上述方法不斷的遞歸調用,直到區間相當小(找出根為止)!
代碼如下(已調試):
#include
"math.h"
main()
{
float
x,x1,x2;
float
f(float
x,float
x1,float
x2);
printf("請輸入區間[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)-x1-1.0;
f2=pow(x2,3)-x2-1.0;
}while(f1*f2>0);
//確保輸入的x1,x2使得f1,f2符號相反
do
{
x=(x1+x2)/2;
//求x1,x2的中點
f=pow(x,3)-x-1.0;
if(f1*f>0)
//當f與f1符號相同時
{x1=x;f1=f;}
else
if(f2*f>0)
//當f與f2符號相同時
{x2=x;f2=f;}
}while(fabs(f)>1e-6);
//判斷條件fabs(f)>1e-6的意思是f的值非常0
return
x;
}
輸入:1
1.5
則輸出:x=1.324718

Ⅱ C語言 二分法求方程x^2-3x-5=0的近似解

#include <cmath> double func(double x){
return x * (x - 3.0) - 5.0;
}

double binary_search(double x1, double x2, double (*f)(double)){
static const double epsilon = 1.0e-14;

double y1 = f(x1); double y2 = f(x2);
bool b1 = (y1 < 0.0 && y2 > 0.0);
bool b2 = (y1 > 0.0 && y2 < 0.0);

while (b1 || b2)
{
double x = (x1 + x2) / 2;
double y = f(x);

if (fabs(y) <= epsilon) { return x;}
((b1 == y < 0.0) ? x1 : x2) = x;
}

return 0.0;
}

int main(int, char*[]){
double f = binary_search(1.5, 10, func);
return 0;
}

Ⅲ C語言二分法解方程,急!謝謝!

本題的一個完整的c程序如下,程序在win-tc下調試通過,結果正確。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <malloc.h>

int n;
double c[16];
double Func(double);
int BisectRoot(double,double,double,double,double *,int,int *);

int main()
{
int i,m;
double a,b,h,eps,*x;
printf("Please input integer k:\n");
scanf("%d",&n); /*方程根的個數的預估值*/
printf("Please input %d coefficients one by one:\n",n+1);
for(i=0;i<=n;i++)
scanf("%lf",&c[i]);
x = (double*)calloc(n,sizeof(double)); /*開辟內存空間*/
if(x == NULL)
{
printf("內存分配失敗\n");
exit(1);
}
a = -10; /*區間起始端點*/
b = 10; /*區間終止端點*/
h = 0.1; /*步長*/
eps = 1.e-5; /*要求達到的精度*/
BisectRoot(a,b,h,eps,x,n,&m); /*調用二分法函數*/
printf("The roots between %2.0f and %2.0f are: %d\n",a,b,m);
printf("They are:\n");
for(i = 0;i<m;i++)
printf("x[%d] = %f\n",i,x[i]);
free(x); /*釋放內存空間*/
system("pause");
return 0;
}

double Func(double x)
{ int i;
double s=0.0;
for(i=0;i<=n;i++)
s+=c[i]*pow(x,i);
return(s);
}

int BisectRoot(a,b,h,eps,x,n,m)
double a; /*實型變數,輸入參數,求根區間的起始端點*/
double b; /*實型變數,輸入參數,求根區間的終止端點*/
double h; /*利用逐步掃描法確定根位置時的步長*/
double eps; /*實型變數,輸入參數,控制精度的參數*/
double *x; /*實型一維數組,輸出參數,存放計算得到的數組*/
int n; /*輸入參數,區間內方程根的個數的預估值*/
int *m; /*輸出參數,實際求得的根的個數*/
{
double z,z0,z1,y,y0,y1;
*m = 0;
z = a;
y = Func(z);
while(1) /*無限循環,直到遇到return或者break語句*/
{/*如果逐步掃描到求根區間的右端點或者得到的根的個數達到預估根的個數*/
if((z>b+h/2)||(*m==n))
return(1);
if(fabs(y)<eps) /*如果當前根z對應的函數f(z)滿足精度要求*/
{
*m+=1;
x[*m-1] = z; /*將此時的z值賦值給x數組*/
z+=h/2;
y = Func(z);
continue; /*結束本次循環,即跳過循環體中下面尚未執行
的語句接著進行下一次是否執行循環的判定*/
}

z1 = z+h; /*逐步掃描中小區間的右端點*/
y1 = Func(z1); /*小區間右端點對應的函數值*/
if(fabs(y1)<eps) /*如果右端點恰好滿足根的精度要求*/
{
*m+=1;
x[*m-1] = z1;
z = z1+h/2;
y = Func(z);
continue;
}
if(y*y1>0) /*如果對應根乘積大於零,說明該區間內沒有根*/
{
y = y1;
z = z1;
continue;
}
while(1) /*如果本while循環執行,說明逐步掃描小區建z和z1間有根*/
{
if(fabs(z1-z)<eps) /*如果滿足精度要求*/
{
*m+=1;
x[*m-1]=(z1+z)/2;
z = z1+h/2;
y = Func(z);
break;
}
z0 = (z1+z)/2; /*二分法求根公式*/
y0 = Func(z0);
if(fabs(y0)<eps)
{
*m = *m+1;
x[*m-1] = z0;
z =z0+h/2;
y = Func(z);
break;
}
if(y*y0<0) /*如果乘積小於零,說明根在z和z0之間*/
{
z1 = z0;
y1 = y0;
}
else /*否則根在z0和z1之間*/
{
z = z0;
y = y0;
}
}
}
}

Ⅳ C語言 二分法求方程近似解 ,運行沒反應,不知哪裡有問題,求指教

只有一個錯誤。f2 = f3;這句話,你賦值的是一個值,而不是一個表達式。需要改成f2 = (2*m*(m-2)+3)*m-6; 同理f1=f3也不對。
而且,感覺你這演算法也不對。求不出來值,是不是2分法跨度太大查不到。可以用弦截法。
float f(float x)
{
float y;
y=(2*x*(x-2)+3)*x-6;
return y;
}
float xpoint(float x1,float x2)
{
float y;
y=(x1*f(x2)-x2*f(x1))/(f(x2)-f(x1));
return y;
} 增加這樣兩個函數
m=xpoint(a,b);替換 二分法m=(a+b)/2。 就有結果了
對了 還有問題。
do
{
m = xpoint(a,b);
f3 = (2*m*(m-2)+3)*m-6;
if (f1*f2 < 0)
{
a =m;
f1 = (2*m*(m-2)+3)*m-6;
// cout<<f1<<endl;
}
else
{
b =m;
f2 = (2*m*(m-2)+3)*m-6;
//cout<<f2<<endl;
}
} while (fabs(f3)>=1e-5);
底下的循環,也就是賦值縮小區間的過程,你寫反了。f1*f2 < 0,這時a=m。f1*f2 >0,這時b=m。

Ⅳ C語言中用遞歸演算法實現二分法求方程在(0,5)的近似解

重點改動:

scanf("%lf,%lf",&x1,&x2);

#include <stdio.h>

#include <math.h>

int main()

{ double calculate(double y1,double y2,double fy1,double fy2);

double x1,x2,fx1,fx2;

double a;

printf("enter x1 & x2:");

scanf("%lf,%lf",&x1,&x2);

fx1=(((x1+3)*x1-8)*x1+12)*x1-10;

fx2=(((x2+3)*x2-8)*x2+12)*x2-10;

printf("%f %f %f %f ",x1,x2,fx1,fx2);

a=calculate(x1,x2,fx1,fx2);

printf("x=%lf ",a);

return 0;

}

double calculate(double y1,double y2,double fy1,double fy2)

{ double fy0,y0;

double a;

y0=(y1+y2)/2;

fy0=(((y0+3)*y0-8)*y0+12)*y0-10;

printf("%f ",y0);

if(fabs(fy0)>=1e-10)

{ if ((fy0*fy1)<0)

{ y2=y0;

fy2=fy0;

}

else

{ y1=y0;

fy1=fy0;

}

a=calculate(y1,y2,fy1,fy2);

}

else

{ a=y0;

printf("%6.2f",a);

}

return(a);

}

Ⅵ 用二分法求方程x^3-x-1=0在區間[1,1.5]內的一個近似解 用C語言編程 跪求!!!各位大蝦

二分法的基本思路是:任意兩個點x1和x2,判斷區間(x1,x2)內有無一個實根,如果f(x1)與f(x2)符號相反,則說明有一實根。接著取(x1,x2)的中點x,檢查f(x)和f(x2)是否同號,如果不同號,說明實根在(x,x2)之間,如果同號,在比較(x1,x),這樣就將范圍縮小一半,然後按上述方法不斷的遞歸調用,直到區間相當小(找出根為止)!

代碼如下(已調試):

#include "math.h"
main()
{
float x,x1,x2;
float F(float x,float x1,float x2);
printf("請輸入區間[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)-x1-1.0;
f2=pow(x2,3)-x2-1.0;
}while(f1*f2>0); //確保輸入的x1,x2使得f1,f2符號相反
do
{
x=(x1+x2)/2; //求x1,x2的中點
f=pow(x,3)-x-1.0;
if(f1*f>0) //當f與f1符號相同時
{x1=x;f1=f;}
else if(f2*f>0) //當f與f2符號相同時
{x2=x;f2=f;}
}while(fabs(f)>1e-6); //判斷條件fabs(f)>1e-6的意思是f的值非常0
return x;
}

輸入:1 1.5
則輸出:x=1.324718

Ⅶ c語言編寫二分法求解近似根的問題【急】

#include<stdio.h>
#include<math.h>

doublepoint(doublex)
{
returnexp(-x)+10*x-2;
}

doublesolve(doublel,doubler)
{
doublet=point((l+r)/2.0);

while(fabs(t)>=5e-4)
{
l=t<0?(l+r)/2.0:l;

r=t>0?(l+r)/2.0:r;

t=point((l+r)/2.0);
}

return(l+r)/2.0;
}

intmain(intargc,char*argv[])
{
printf("%f ",solve(0,1));

printf("%f ",point(0.110474));

return0;
}

Ⅷ c語言二分法求方程的近似解

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
doublef(doublex)
{
returnx*x*x-3*x+1;
}

intmain()
{
doublei=1.0,j=2.0;
while(fabs(i-j)>=0.001)
{
if(f((i+j)/2.0)<0)
i=(i+j)/2.0;
else
j=(i+j)/2.0;
};
printf("%lf",i);
return0;
}