日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java函数求方程,Commons Math学习笔记——函数方程求解

發布時間:2025/3/20 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java函数求方程,Commons Math学习笔记——函数方程求解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

看其他篇章到目錄選擇。

函數方程求解,其實是函數的零點問題,也就是說函數的曲線與X軸的交點。對于線性方程,我們可以輕易的求解,對于線性方程組,利用前面講過的的矩陣分解方法也可以求解。那么對于函數表達的很多非線性方程的求解。我們要依賴數值算法。Commons Math包中專門有一個analysis.solver包來解決這個問題。

Analysis.solver包中有一個基本接口類——UnivariateRealSolver,其中定義了一系列接口方法,最重要的方法就是double solve(UnivariateRealFunction f, double min, double max)了。很明顯,這個方法的參數是函數的表達式以及求解的區間范圍,返回值是函數在區間內的一個零值點。

Solver包中的這些類的組織結構形式與積分中的類似,結構類圖如下:

具體的求解算法有很多,solver包中也實現了很多算法,包括對分法、牛頓法等。我們這里以這兩個算法的實現為例,看看該如何使用這個包中的接口方法。待求解的函數仍以正弦函數為例。

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

輸出結果:

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

可以看到,程序都輸出了正確的結果。但是,其實還是可以嘗試一些復雜的參數來測試算法的,這里就不再多說,不妨看看牛頓法在(-1,4)區間的效果。

不管是哪種方法,其實都是要設定誤差限的,默認的是10E-6。

一個小的建議是使用工廠模式的構建方法,因為畢竟這個包內提供了工廠的實現,那為什么不用這種更靈活的方式呢?

寫了方程求解的例子,就不要再問什么求平方根的牛頓法或者立方根什么的問題了,不就是x^n-R=0的方程嘛,設定區間[0,+∞]就可以了。原理明白,其他的問題都很好解決,不是嗎?

相關資料:

posted on 2010-12-21 17:18 changedi 閱讀(2791) 評論(0) ?編輯 ?收藏 所屬分類: 數學

總結

以上是生活随笔為你收集整理的java函数求方程,Commons Math学习笔记——函数方程求解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。