二分法求根c語言
『壹』 c語言用二分法求根
while里的判斷不應該用!=0這種方式,因為精度的限制極有可能是一個很小的數但也不為0,應該用abs(……)<1e-5這種判斷方式
『貳』 C語言二分法求方程的根
沒聽說過二分法能夠求根,二分法只是對於有序數組的查找方法,並不能去求解任意方程的根(只可以求解在某個區間單調遞增或遞減的函數曲線對應方程的根),較為通用的方程求根方法是牛頓法。
『叄』 二分法求平方根 C語言
這應該是演算法的偽代碼,至少可以肯定,這不是C語言的代碼,C語言里就沒有<-這種語法。
二分法求解的方法,就是拿一個可能的結果,去試驗、比較,看結果大還是小了,二分結果的區間,重復,直到得到滿足精度要求的結果。
比如要求解2的平方根,x=2,給定區間[0,10],a=0,b=10。
第一次循環,c給定中點值5,5把區間[0,10]二分成兩部分。試算5的平方,結果非小於x,可知最終的結果在[0,5),不是在(5,10],求解區間變成[0,5]
第二次循環,c給定中值2.5,然後循環重復,直到done=1或者c==c_old,即找到一個c的平方正好完成等於x即找到一個正好結果,或者兩次計算結果完成一致的數,這個數的精度已經很高,劃分的區間足夠小,不能再分了,循環完成,得到結果c。
『肆』 C語言編程 二分法求方程的根
前面自定義函數funx(r)的返回值與funx(n)的返回值相乘如果小於零的話那麼m就等於r,不然的話n就等於r,
就是先把r當做實際參數傳入給funx進行計算,在funx函數內,x的值為r,再把n當做實際參數傳入給funx進行計算,在funx函數內,x的值為n,
總的運算:[2*((m+n)/2)*((m+n)/2)*((m+n)/2)-4*((m+n)/2)*((m+n)/2)+3*((m+n)/2)-6]*[2*n*n*n-4*n*n+3*n-6]<0的話,m=r,不然n=r.
不知道看明白了沒有......
『伍』 C語言:用二分法求方程的根,求具體可用程序;
樓主你好~
提供以下代碼。
Fedora10下gcc4.3.2編譯通過,手動測試通過。。
#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;
}
很簡單的遞歸。
不過對於樓主的這道題,還要說一點,提示中的二分法求根,只能適用於在給定函數在給定區間中呈單調連續情況下才行得通哦~我也是按照給定的提示來寫的上述代碼。
如果連續函數在給定區間不單調,很有可能中值*下界值和中值*上界值都大於0,那麼會跳出認為沒有根,而事實上很有可能這個中值點靠近函數極點。
而真正用二分法求給定區間的思路是:
首先為函數求導,算出導函數的零點,然後再判斷零點性質,最後將函數區間分為單調遞增和單調遞減間隔的形式,對每一段進行二分法求根。
請追問~
『陸』 C語言 二分法求三次方程根
二分法的基本思路是:任意兩個點x1和x2,判斷區間(x1,x2)內有無一個實根,如果f(x1)與f(x2)符號相反,則說明有一實根。接著取(x1,x2)的中點x,檢查f(x)和f(x2)是否同號,如果不同號,說明實根在(x,x2)之間,如果同號,在比較(x1,x),這樣就將范圍縮小一半,然後按上述方法不斷的遞歸調用,直到區間相當小(找出根為止)!
比如用二分法求f(x)=x^3-6x-1=0的實根。
代碼如下(已調試):
#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)-6*x1-1.0;
f2=pow(x2,3)-6*x2-1.0;
}while(f1*f2>0);
//確保輸入的x1,x2使得f1,f2符號相反
do
{
x=(x1+x2)/2;
//求x1,x2的中點
f=pow(x,3)-6*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
5
則輸出:x=2.528918
輸入:-10
10
則輸出:x=2.528918
『柒』 C語言中二分法求根
if(c*d<0)
{
a=m;
c=n;
}
else
{
b=m;
d=n;
}
改為
if(m*d<0)
{
a=m;
c=m;
}
else
{
b=m;
d=m;
}
『捌』 c語言二分法求根
二分法計算函數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); /*輸入含根區間a,b,循環次數n0 */
for(k=0;k<=n0;k++)
{ x=(a+b)/2;
h=(b-a)/2;
y=f(x);
if(h<10e-6||fabs(y)<10e-6)
{ printf("k=%d,x=%f,y=%f",k,x,y);
break; } /*輸出分半次數k,函數的根x,及x對應的函數值.*/
else
{if(f(a)*f(x)<0)
b=x;
else a=x;
}
}
}
『玖』 求用c語言編寫一個函數二分法求根的演算法
二分法計算函數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); /*輸入含根區間a,b,循環次數n0 */
for(k=0;k<=n0;k++)
{ x=(a+b)/2;
h=(b-a)/2;
y=f(x);
if(h<10e-6||fabs(y)<10e-6)
{ printf("k=%d,x=%f,y=%f",k,x,y);
break; } /*輸出分半次數k,函數的根x,及x對應的函數值.*/
else
{if(f(a)*f(x)<0)
b=x;
else a=x;
}
}
}