二分法計算函數(shù)f(x)=x*x*x*x+2*x*x*x-x-1;
讓客戶滿意是我們工作的目標,不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價值的長期合作伙伴,公司提供的服務(wù)項目有:空間域名、網(wǎng)絡(luò)空間、營銷軟件、網(wǎng)站建設(shè)、漢源網(wǎng)站維護、網(wǎng)站推廣。
本程序在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對應(yīng)的函數(shù)值.*/
else
{if(f(a)*f(x)0)
b=x;
else a=x;
}
}
}
沒聽說過二分法能夠求根,二分法只是對于有序數(shù)組的查找方法,并不能去求解任意方程的根(只可以求解在某個區(qū)間單調(diào)遞增或遞減的函數(shù)曲線對應(yīng)方程的根),較為通用的方程求根方法是牛頓法。
這段代碼是求解方程f(x)=0在區(qū)間[-10,10]上的根的數(shù)值解。
方法的思想就是:一直選取區(qū)間中間的數(shù)值,如果發(fā)現(xiàn)中間的函數(shù)值與一側(cè)函數(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ù)迭代!
用二分法求方程在(-10,10)之間的根:2x^3-4x^2+3x-6=0.
解:x1=x0=(x1+x2)/2=x2
程序:
#includestdio.h
#includemath.h
int main()
{
float x0,x1,x2,fx0,fx1,fx2;
do
{
printf("輸入x1,x2的值:");
scanf("%f,%f", x1, x2);
fx1 = 2*x1*x1*x1 - 4 * x1*x1 + 3 * x1 - 6;
fx2 = 2 *x2*x2*x2 - 4 *x2*x2 + 3 * x2 - 6;
} while (fx1*fx20);
do
{
x0 = (x1 + x2)/2;
fx0 = 2 * x0*x0*x0 - 4 * x0*x0 + 3 * x0 - 6;
if (fx0*fx1 0)
{
x2 = x0;
fx2 = fx0;
}
else
{
x1 = x0;
fx1 = fx0;
}
} while (fabs(fx0)= 1e-5);
printf("x=%5.2f\n",x0);
return 0;
}