91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Apache Commons Math3之數值積分的示例分析

發布時間:2021-07-22 09:31:27 來源:億速云 閱讀:404 作者:小新 欄目:編程語言

這篇文章給大家分享的是有關Apache Commons Math3之數值積分的示例分析的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

Apache.Commons.Math4里面的數值積分支持類采用的是“逼近法”,即,先對大區間做一次積分,再對小區間做一次積分,若兩次積分結果的差值小于某一設定的誤差值,則認為積分完成。否則,將區間再次細分,對細分后的區間進行積分,與前一次積分相比較,如此反復迭代,直至最近的兩次積分差值足夠小。這樣的結果,有可能會導致無法收斂。

為了使用org.apache.commons.math4.analysis.integration包中的積分器類,需要先實現UnivariateFunction接口(本文以MyFunction為例),實現其value方法。然后創建指定的積分器對象,本文以SimpsonIntegrator為例,最后調用其integrate(...)方法即可算出MyFunction的積分。

調用integrate(...)方法時需要提供4個參數:

第1個是最大逼近次數,要適當大一些,否則可能會無法收斂;
第2個是MyFunction類的實例;
第3個是積分區間下限;
第4個是積分區間上限。

SimpsonIntegrator在第一次迭代時一定是分別以積分下限和積分上限作為x調用連詞MyFunction.value(...)方法,下一次則會將區間分成2份(除上下限x值之外,還有一個中間x值),再下一次則是分成4份……

以下是使用辛普森積分類的例子:

import java.util.ArrayList;
import java.util.List;
import org.apache.commons.math4.analysis.UnivariateFunction;
import org.apache.commons.math4.analysis.integration.SimpsonIntegrator;
import org.apache.commons.math4.analysis.integration.UnivariateIntegrator;
interface TestCase 
{
	public Object run(List<Object> params) throws Exception;
	public List<Object> getParams();
	public void printResult(Object result) throws Exception;
}
public class TimeCostCalculator 
{
	public TimeCostCalculator() 
	  {
	}
	/** 
  * 計算指定對象的運行時間開銷。 
  * 
  * @param testCase 指定被測對象。 
  * @return 返回sub.run的時間開銷,單位為s。 
  * @throws Exception 
  */
	private double calcTimeCost(TestCase testCase) throws Exception 
	  {
		List<Object> params = testCase.getParams();
		long startTime = System.nanoTime();
		Object result = testCase.run(params);
		long stopTime = System.nanoTime();
		testCase.printResult(result);
		double timeCost = (stopTime - startTime) * 1.0e-9;
		return timeCost;
	}
	public void runTest(TestCase testCase) throws Exception 
	  {
		double timeCost = calcTimeCost(testCase);
		System.out.println("時間開銷:: " + timeCost + "s");
		System.out.println("-------------------------------------------------------------------------------");
	}
	public static void main(String[] args) throws Exception 
	  {
		TimeCostCalculator tcc = new TimeCostCalculator();
		tcc.runTest(new CalcSimpsonIntegrator());
	}
}
/** 
 * 使用辛普森法求解數值積分。Apache.Common.Math4中所用的辛普森法是采用逼近法,即先對整個積分區間用矩形積分,然后將區間分解為4份,再次積分,比較兩次積分的差值,若想對誤差大于某個預訂數值, 
 * 則認為還需要繼續細分區間,因此會將區間以2倍再次細分后求積分,并將結果與前一次積分的結果比較,直至差值小于指定的誤差,就停止。 
 * @author kingfox 
 * 
 */
class CalcSimpsonIntegrator implements TestCase 
{
	public CalcSimpsonIntegrator() 
	  {
		System.out.print("本算例用于測試使用辛普森法計算積分。正在初始化計算數據 ... ...");
		inputData = new double[arrayLength];
		for (int index = 0; index < inputData.length; index++)  // 鏂滃潯鍑芥暟 
		{
			inputData[index] = Math.sin(2 * Math.PI * index * MyFunction.factor * 4);
		}
		func = new MyFunction();
		integrator = new SimpsonIntegrator();
		System.out.println("初始化完成!");
	}
	@Override 
	  public Object run(List<Object> params) throws Exception 
	  {
		double result = ((SimpsonIntegrator)(params.get(1))).integrate(steps, (UnivariateFunction)(params.get(0)), lower, upper);
		return result;
	}
	/** 
  * 獲取運行參數 
  * @return List對象,第一個元素是求積函數,第二個參數是積分器。 
  */
	@Override 
	  public List<Object> getParams() 
	  {
		List<Object> params = new ArrayList<Object>();
		params.add(func);
		params.add(integrator);
		return params;
	}
	@Override 
	  public void printResult(Object result) throws Exception 
	  {
		System.out.println(">>> integration value: " + result);
	}
	UnivariateFunction func = null;
	UnivariateIntegrator integrator = null;
	class MyFunction implements UnivariateFunction 
	  {
		@Override 
		   public double value(double x) 
		   {
			//     double y = x * factor;   // 1. 
			//     double y = 4.0 * x * x * x - 3.0 * x * x + 2.0 * x - 1.0;  // 2. 
			//     double y = -1.0 * Math.sin(x) + 2.0 * Math.cos(x) - 3.0;   // 3. 
			double y = inputData[(int)(x / factor)];
			// 4. 
			//     System.out.println(x + ", " + y); 
			return y;
		}
		private static final double factor = 0.0001;
	}
	private double[] inputData = null;
	private static final int arrayLength = 5000;
	private static final double lower = 0.0;
	//  private static final double upper = 2.0 * Math.PI;   // 3. 
	private static final double upper = (arrayLength - 1) * MyFunction.factor;
	// 1. 2. 4. 
	private static final int steps = 1000000;
}

上述代碼中,注釋為1. 2. 3.的可以正常計算出結果,但注釋為4.的就無法收斂。

基于org.apache.commons.math4.analysis.integration.UnivariateIntegrator的積分器的另一個局限性在于必須編寫一個繼承于UnivariateFunction的函數類,實現其value方法(根據輸入的x值計算出y值),這種做法有利于可用解析式表達的情況,不利于對存放于外存的大量數據做積分處理。

感謝各位的閱讀!關于“Apache Commons Math3之數值積分的示例分析”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

大渡口区| 桃园县| 贡觉县| 县级市| 南康市| 育儿| 金阳县| 余干县| 广灵县| 乡城县| 蒙山县| 抚松县| 澄迈县| 集安市| 贞丰县| 岳阳县| 观塘区| 运城市| 延川县| 陈巴尔虎旗| 眉山市| 梨树县| 嵊泗县| 同心县| 甘肃省| 区。| 平舆县| 江西省| 即墨市| 朝阳县| 平罗县| 龙口市| 遂昌县| 广河县| 金华市| 岚皋县| 郴州市| 高雄市| 嘉善县| 兴业县| 万宁市|