java函数求方程,Commons Math学习笔记——函数方程求解
看其他篇章到目錄選擇。
函數(shù)方程求解,其實(shí)是函數(shù)的零點(diǎn)問題,也就是說函數(shù)的曲線與X軸的交點(diǎn)。對(duì)于線性方程,我們可以輕易的求解,對(duì)于線性方程組,利用前面講過的的矩陣分解方法也可以求解。那么對(duì)于函數(shù)表達(dá)的很多非線性方程的求解。我們要依賴數(shù)值算法。Commons Math包中專門有一個(gè)analysis.solver包來解決這個(gè)問題。
Analysis.solver包中有一個(gè)基本接口類——UnivariateRealSolver,其中定義了一系列接口方法,最重要的方法就是double solve(UnivariateRealFunction f, double min, double max)了。很明顯,這個(gè)方法的參數(shù)是函數(shù)的表達(dá)式以及求解的區(qū)間范圍,返回值是函數(shù)在區(qū)間內(nèi)的一個(gè)零值點(diǎn)。
Solver包中的這些類的組織結(jié)構(gòu)形式與積分中的類似,結(jié)構(gòu)類圖如下:
具體的求解算法有很多,solver包中也實(shí)現(xiàn)了很多算法,包括對(duì)分法、牛頓法等。我們這里以這兩個(gè)算法的實(shí)現(xiàn)為例,看看該如何使用這個(gè)包中的接口方法。待求解的函數(shù)仍以正弦函數(shù)為例。
1
/**?*//**2?*3*/4packagealgorithm.math;56importorg.apache.commons.math.ConvergenceException;7importorg.apache.commons.math.FunctionEvaluationException;8importorg.apache.commons.math.analysis.UnivariateRealFunction;9importorg.apache.commons.math.analysis.solvers.BisectionSolver;10importorg.apache.commons.math.analysis.solvers.UnivariateRealSolver;11importorg.apache.commons.math.analysis.solvers.UnivariateRealSolverFactory;12importorg.apache.commons.math.analysis.solvers.UnivariateRealSolverFactoryImpl;1314
/**?*//**15?*@authorJia?Yu16?*?@date???2010-11-2417*/18
publicclassSolverTest{1920
/**?*//**21?????*@paramargs22*/23
publicstaticvoidmain(String[]?args){24//TODO?Auto-generated?method?stub25solver();26????????factorySolver();27????}2829
privatestaticvoidfactorySolver(){30//TODO?Auto-generated?method?stub31UnivariateRealFunction?f=newSinFunction();32????????UnivariateRealSolverFactory?factory=newUnivariateRealSolverFactoryImpl();33????????UnivariateRealSolver?solver=factory.newNewtonSolver();34
try{35????????????System.out.println("NewtonSolver?:?sin(x)=0?when?x?from?-1?to?1,?x?="+solver.solve(f,-1,1));36
????????}catch(ConvergenceException?e){37//TODO?Auto-generated?catch?block38e.printStackTrace();39
????????}catch(FunctionEvaluationException?e){40//TODO?Auto-generated?catch?block41e.printStackTrace();42????????}43????}4445
privatestaticvoidsolver(){46//TODO?Auto-generated?method?stub47UnivariateRealFunction?f=newSinFunction();48????????UnivariateRealSolver?solver=newBisectionSolver();49
try{50????????????System.out.println("BisectionSolver?:?sin(x)=0?when?x?from?3?to?4,?x?="+solver.solve(f,3,4));51
????????}catch(ConvergenceException?e){52//TODO?Auto-generated?catch?block53e.printStackTrace();54
????????}catch(FunctionEvaluationException?e){55//TODO?Auto-generated?catch?block56e.printStackTrace();57????????}58????}5960}61
輸出結(jié)果:
BisectionSolver : sin(x)=0 when x from 3 to 4, x = 3.141592502593994
NewtonSolver : sin(x)=0 when x from -1 to 1, x = 0.0
可以看到,程序都輸出了正確的結(jié)果。但是,其實(shí)還是可以嘗試一些復(fù)雜的參數(shù)來測試算法的,這里就不再多說,不妨看看牛頓法在(-1,4)區(qū)間的效果。
不管是哪種方法,其實(shí)都是要設(shè)定誤差限的,默認(rèn)的是10E-6。
一個(gè)小的建議是使用工廠模式的構(gòu)建方法,因?yàn)楫吘惯@個(gè)包內(nèi)提供了工廠的實(shí)現(xiàn),那為什么不用這種更靈活的方式呢?
寫了方程求解的例子,就不要再問什么求平方根的牛頓法或者立方根什么的問題了,不就是x^n-R=0的方程嘛,設(shè)定區(qū)間[0,+∞]就可以了。原理明白,其他的問題都很好解決,不是嗎?
相關(guān)資料:
posted on 2010-12-21 17:18 changedi 閱讀(2791) 評(píng)論(0) ?編輯 ?收藏 所屬分類: 數(shù)學(xué)
總結(jié)
以上是生活随笔為你收集整理的java函数求方程,Commons Math学习笔记——函数方程求解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php里怎么添加计时器,如何使用php显
- 下一篇: mongodb3.2 java,Mong