C語(yǔ)言二分法求解方程根的兩種方法
本文實(shí)例為大家分享了C語(yǔ)言二分法求解方程根的具體代碼,供大家參考,具體內(nèi)容如下
對(duì)于二分法求根,其實(shí)和弦截法思想很像,甚至更簡(jiǎn)單。
原理:先看如下的圖
A,B兩個(gè)點(diǎn)為跟的一個(gè)邊界,通過(guò)一直縮小跟的邊界,從而獲取跟的值。
(1)知道函數(shù)(即方程的式子),這個(gè)好說(shuō),題上都有
(2)循環(huán)的輸入A,B的橫坐標(biāo)的值,即x1,x2的初值,直到f(x1)與f(x2)的乘積為負(fù)數(shù)才停止。(必須保證方程的跟在(x1,x2)區(qū)間)這樣的x1,x2的初值才有意義。
(3)令xx=(x1+x2)/2;(即中值),若f(xx)*f(x1)>0此刻證明了x1要被xx替代了,即區(qū)間變成了(xx,x2);。若f(xx)*f(x2)>0此刻證明了x2要被xx替代了,即區(qū)間變成了(x1,xx);大家可以用上面的圖試一下就知道了,很好理解的。
(4)那么什么時(shí)候結(jié)束呢,這就是一個(gè)精度的問(wèn)題了,看你把精度設(shè)成什么樣子,最精準(zhǔn)的方程跟的函數(shù)值是0,那么就用f(xx)與0比較,相差在自己設(shè)置的精度(一般是10的-6次方,C語(yǔ)言中寫作:1e-6)以內(nèi),則可以把xx近似當(dāng)做是方程的跟。
下面用代碼實(shí)現(xiàn):
第一種是直接的,第二種是可移植性的(即使方程改變需要修改的地方很少,而前者則需要修改很多),第二種用函數(shù)指針實(shí)現(xiàn)。
第一種:
#include <stdio.h> #include <iostream> #include <string.h> #include <math.h> using namespace std; double f(double x) { return (x*x*x-3*x*x+3*x-1); } int main() { double x1,x2,xx;//x1,x2代表區(qū)間左右邊界,xx代表方程跟的值 do { scanf("%lf%lf",&x1,&x2); } while(f(x1)*f(x2)>0);//保證f(x1)和f(x2)是異號(hào),這樣才可以進(jìn)行下一步的精準(zhǔn)區(qū)間,否則,重新輸入x1,x2的值 do { xx=(x1+x2)/2; if(f(xx)*f(x1)>0) x1=xx; else x2=xx; } while(fabs(f(xx))>=1e-7);//le-6代表1*10的-6次方,它的值將影響到跟的準(zhǔn)確度的問(wèn)題 printf("%.2lf\n",xx); return 0; }
第二種:
#include <stdio.h> #include <iostream> #include <string.h> #include <math.h> using namespace std; double f(double x) { return (x*x*x-3*x*x+3*x-1); } double erfen(double x1,double x2,double (*p)(double))//double (*p)(double)為形參,相當(dāng)于函數(shù)別名 { double xx; do { xx=(x1+x2)/2; if((*p)(xx)*(*p)(x1)>0) x1=xx; else x2=xx; }while(fabs((*p)(xx))>=1e-7);//le-7代表1*10的-6次方,它的值將影響到跟的準(zhǔn)確度的問(wèn)題 return xx; } int main() { double x1,x2; double f(double); double (*p)(double); p=f; do { scanf("%lf%lf",&x1,&x2); } while((*p)(x1)*(*p)(x2)>0);//保證f(x1)和f(x2)是異號(hào),這樣才可以進(jìn)行下一步的精準(zhǔn)區(qū)間,否則,重新輸入x1,x2的值 printf("%.2lf\n",erfen(x1,x2,f)); return 0; }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
約瑟夫環(huán)問(wèn)題(數(shù)組法)c語(yǔ)言實(shí)現(xiàn)
這篇文章主要介紹了約瑟夫環(huán)問(wèn)題(數(shù)組法)c語(yǔ)言實(shí)現(xiàn),有需要的朋友可以參考一下2013-12-12C++ 使用CRC32檢測(cè)內(nèi)存映像完整性的實(shí)現(xiàn)步驟
當(dāng)我們使用動(dòng)態(tài)補(bǔ)丁的時(shí)候,那么內(nèi)存中同樣不存在校驗(yàn)效果,也就無(wú)法抵御對(duì)方動(dòng)態(tài)修改機(jī)器碼了,為了防止解密者直接對(duì)內(nèi)存打補(bǔ)丁,我們需要在硬盤校驗(yàn)的基礎(chǔ)上,增加內(nèi)存校驗(yàn),防止動(dòng)態(tài)補(bǔ)丁的運(yùn)用。2021-06-06C++實(shí)現(xiàn)LeetCode(137.單獨(dú)的數(shù)字之二)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(137.單獨(dú)的數(shù)字之二),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07C++實(shí)現(xiàn)字符串類型相互轉(zhuǎn)換的代碼示例
在C/C++編程中,字符串是非?;A(chǔ)且常用的數(shù)據(jù)類型,但是由于不同的編程語(yǔ)言或標(biāo)準(zhǔn)庫(kù)可能采用不同的字符串類型,因此在不同的應(yīng)用場(chǎng)景下可能需要進(jìn)行字符串類型的相互轉(zhuǎn)換,本文將介紹如何在C/C++中將char*,std::string,QString,CString/MFC?String相互轉(zhuǎn)換2023-06-06C++使用map實(shí)現(xiàn)多進(jìn)程拷貝文件的程序思路
這篇文章主要介紹了C++使用mmap實(shí)現(xiàn)多進(jìn)程拷貝文件,通過(guò)本文給大家分享程序思路及完整代碼,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-12-12c語(yǔ)言實(shí)現(xiàn)輸入一組數(shù)自動(dòng)從大到小排列的實(shí)例代碼
下面小編就為大家?guī)?lái)一篇c語(yǔ)言實(shí)現(xiàn)輸入一組數(shù)自動(dòng)從大到小排列的實(shí)例代碼。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-09-09C語(yǔ)言實(shí)現(xiàn)飛機(jī)大戰(zhàn)小游戲
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)飛機(jī)大戰(zhàn)小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06