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