C++實(shí)現(xiàn)二分法求方程近似解
二分法是一種求解方程近似根的方法。對(duì)于一個(gè)函數(shù) f(x)f(x),使用二分法求 f(x)f(x) 近似解的時(shí)候,我們先設(shè)定一個(gè)迭代區(qū)間(在這個(gè)題目上,我們之后給出了的兩個(gè)初值決定的區(qū)間 [-20,20]),區(qū)間兩端自變量 x 的值對(duì)應(yīng)的 f(x) 值是異號(hào)的,之后我們會(huì)計(jì)算出兩端 x 的中點(diǎn)位置 x' 所對(duì)應(yīng)的 f(x') ,然后更新我們的迭代區(qū)間,確保對(duì)應(yīng)的迭代區(qū)間的兩端 x 的值對(duì)應(yīng)的 f(x) 值還會(huì)是異號(hào)的。
重復(fù)這個(gè)過程直到我們某一次中點(diǎn)值 x' 對(duì)應(yīng)的 f(x') < f(x′)<ϵ (題目中可以直接用EPSILON)就可以將這個(gè) x′ 作為近似解返回給 main 函數(shù)了。
例如:
上面所示的一個(gè)迭代過程的第一次的迭代區(qū)間是 [a1,b1],取中點(diǎn) b2,然后第二次的迭代區(qū)間是 [a1,b2],再取中點(diǎn) a2,然后第三次的迭代區(qū)間是 [a2,b2],然后取 a3,然后第四次的迭代區(qū)間是[a3,b2],再取紅色中點(diǎn) c,我們得到發(fā)現(xiàn) f(c) 的值已經(jīng)小于ϵ,輸出c 作為近似解。
在這里,我們將用它實(shí)現(xiàn)對(duì)形如 px+q=0 的一元一次方程的求解。
在這里,你完成的程序?qū)⒈惠斎雰蓚€(gè)正整數(shù) p 和 q(你可以認(rèn)為測(cè)評(píng)機(jī)給出的 0<∣p∣≤1000 且0<∣q∣≤1000),程序需要用二分法求出 px+q=0 的近似解。
輸入格式
測(cè)評(píng)機(jī)會(huì)反復(fù)運(yùn)行你的程序。每次程序運(yùn)行時(shí),輸入為一行,包括一組被空格分隔開的符合描述的正整數(shù) p 和 q。你可以認(rèn)為輸入數(shù)據(jù)構(gòu)成的方程 px+q=0 都是有解且解在[−20,20] 的區(qū)間內(nèi)。
輸出格式
輸出為一行,包括一個(gè)數(shù)字。為方程 px+q=0 的近似解。請(qǐng)使用四舍五入的方式保留小數(shù)點(diǎn)后 4 位小數(shù)。
樣例輸入1
55 9
樣例輸出1
-0.1636
樣例輸入2
-22 4
樣例輸出2
0.1818
代碼:
#include <cstdio> #include <cmath> #define EPSILON 1e-7 double bisection(int p, int q, double (*func)(int, int, double)); double f(int p, int q, double x); int main() { int p; int q; scanf("%d %d", &p, &q); printf("%.4lf\n", bisection(p, q, f)); return 0; } double bisection(int p, int q, double (*func)(int, int, double)) { double x1 = -20; double x2 = 20; double x = 0; while(fabs((*func)(p,q,x))>EPSILON) { x = (x1+x2)/2.0; double fx1 = (*func)(p,q,x1); double fx = (*func)(p,q,x); if(fx*fx1>0) {x1 = x;} else {x2 = x;} } return x; } double f(int p, int q, double x) { return p * x + q; }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
舉例解析設(shè)計(jì)模式中的工廠方法模式在C++編程中的運(yùn)用
這篇文章主要介紹了設(shè)計(jì)模式中的工廠方法模式在C++編程中的運(yùn)用,文中也對(duì)簡(jiǎn)單工廠模式和工廠方法模式進(jìn)行了簡(jiǎn)單的對(duì)比,需要的朋友可以參考下2016-03-03C/C++的堆棧內(nèi)存分配的實(shí)現(xiàn)
內(nèi)存管理是至關(guān)重要的一個(gè)方面,堆和棧是C語(yǔ)言中重要的內(nèi)存分配方式,本文主要介紹了C/C++的堆棧內(nèi)存分配的實(shí)現(xiàn),詳細(xì)的介紹了這兩者在管理方式、性能和使用場(chǎng)景,感興趣的可以了解一下2024-07-07C++實(shí)現(xiàn)單例模式的自動(dòng)釋放
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)單例模式的自動(dòng)釋放,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-06-06實(shí)例分享cmake編譯一個(gè)簡(jiǎn)單c++項(xiàng)目(demo)
下面通過一個(gè)小例子來(lái)說(shuō)明cmake編譯一個(gè)c++項(xiàng)目,生成可執(zhí)行文件,需要的朋友可以參考下2020-02-02C語(yǔ)言main函數(shù)的參數(shù)及其返回值詳細(xì)解析
main函數(shù)的返回值用于說(shuō)明程序的退出狀態(tài)。如果返回0,則代表程序正常退出;返回其它數(shù)字的含義則由系統(tǒng)決定。通常,返回非零代表程序異常退出2013-10-10QT+ffmpeg實(shí)現(xiàn)視頻解析的示例詳解
這篇文章主要為大家詳細(xì)介紹了如何利用QT+ffmpeg實(shí)現(xiàn)視頻解析功能,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Qt有一定幫助,需要的可以參考一下2022-09-09C/C++實(shí)現(xiàn)發(fā)送與接收HTTP/S請(qǐng)求的示例代碼
HTTP(Hypertext Transfer Protocol)是一種用于傳輸超文本的協(xié)議,它是一種無(wú)狀態(tài)的、應(yīng)用層的協(xié)議,用于在計(jì)算機(jī)之間傳輸超文本文檔,通常在 Web 瀏覽器和 Web 服務(wù)器之間進(jìn)行數(shù)據(jù)通信,本文給大家介紹了C/C++發(fā)送與接收HTTP/S請(qǐng)求,需要的朋友可以參考下2023-11-11