7-18 二分法求多項(xiàng)式單根 (20 分)
1. 題目摘自
https://pintia.cn/problem-sets/14/problems/798
2. 題目?jī)?nèi)容
二分法求函數(shù)根的原理為:如果連續(xù)函數(shù)f(x)在區(qū)間[a,b]的兩個(gè)端點(diǎn)取值異號(hào)隧出,即f(a)f(b)<0儡毕,則它在這個(gè)區(qū)間內(nèi)至少存在1個(gè)根r薇宠,即f(r)=0。
二分法的步驟為:
檢查區(qū)間長(zhǎng)度争拐,如果小于給定閾值,則停止,輸出區(qū)間中點(diǎn)(a+b)/2仆抵;否則
如果f(a)f(b)<0,則計(jì)算中點(diǎn)的值f((a+b)/2)种冬;
如果f((a+b)/2)正好為0镣丑,則(a+b)/2就是要求的根;否則
如果f((a+b)/2)與f(a)同號(hào)娱两,則說明根在區(qū)間[(a+b)/2,b]莺匠,令a=(a+b)/2,重復(fù)循環(huán)十兢;
如果f((a+b)/2)與f(b)同號(hào)趣竣,則說明根在區(qū)間[a,(a+b)/2],令b=(a+b)/2纪挎,重復(fù)循環(huán)期贫。
本題目要求編寫程序,計(jì)算給定3階多項(xiàng)式3 3 + 2 2 + 1 + 0 在給定區(qū)間[a,b]內(nèi)的根异袄。
輸入格式:
輸入在第1行中順序給出多項(xiàng)式的4個(gè)系數(shù)3通砍、2、1烤蜕、0封孙,在第2行中順序給出區(qū)間端點(diǎn)a和b。題目保證多項(xiàng)式在給定區(qū)間內(nèi)存在唯一單根讽营。
輸出格式:
在一行中輸出該多項(xiàng)式在該區(qū)間內(nèi)的根虎忌,精確到小數(shù)點(diǎn)后2位。
輸入樣例:
3 -1 -3 1
-0.5 0.5
輸出樣例:
0.33
3. 源碼參考
#include <iostream>
#include <iomanip>
using namespace std;
float a3,a2,a1,a0;
float f(float x);
int main(void)
{
float a,b;
float l,r,m;
cin >> a3 >> a2 >> a1 >> a0 >> a >> b;
l = a;
r = b;
while((r - l > 0.001)&&(f(r) * f(l) <= 0))
{
cout << fixed << setprecision(2);
if(f(l) == 0)
{
cout << l << endl;
return 0;
}
if(f(r)==0)
{
cout << r << endl;
return 0;
}
m = (l + r) / 2;
if(f(m) * f(l) > 0)
{
l = m;
}
else
{
r = m;
}
}
cout << (l + r) / 2 << endl;
return 0;
}
float f(float x)
{
return a3 * x * x * x + a2 * x * x + a1 * x + a0;
}