實驗三 數值積分(android)
實驗二部落格地址:http://blog.csdn.net/double2hao/article/details/51217356
實驗一部落格地址:http://blog.csdn.net/double2hao/article/details/51152843
一、實驗內容
分別寫出變步長梯形法和romberge法計算定積分的演算法,編寫程式上機除錯出結果,要求所程式設計序適用於任何型別的定積分,即能解決這一類問題,而不是某一個問題。
試驗中以下列資料驗證程式的正確性。
求 (sinx)/x的積分,積分割槽間為[0,1]
效果:(原始碼在文章底部)
主要工作:
1、新增了ThreeFragment的xml介面
2、掌握理解變步長梯形法和龍貝格法
主要邏輯程式碼:
ThreeFragment:
package com.example.double2.numericcalculationtest;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.Spinner;
import android.widget.TextView;
/**
* 專案名稱:NumericCalculationTest
* 建立人:Double2號
* 建立時間:2016/4/13 21:41
* 修改備註:
*/
public class ThreeFragment extends Fragment {
private View views;
private Spinner mSpinner;
private final String[] spinnerChose = {"變步長梯形法", "龍貝格法"};
private Button btnSure;
private TextView tvResult;
private String stringResult;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
views = inflater.inflate(R.layout.fra_three, null);
initView();
return views;
}
private void initView() {
mSpinner = (Spinner) views.findViewById(R.id.sp_three_chose);
btnSure = (Button) views.findViewById(R.id.btn_three_sure);
tvResult = (TextView) views.findViewById(R.id.tv_three_result);
mSpinner.setAdapter(new ArrayAdapter<String>(getActivity(),
android.R.layout.simple_list_item_1, spinnerChose));
btnSure.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
caculating();
}
});
}
private void caculating() {
if (mSpinner.getSelectedItemPosition() == 0) {
TrapezoidCaculation();
} else {
RombergCaculation();
}
}
//變步長梯形法求值
private void TrapezoidCaculation() {
Double a = 0.0, b = 1.0, h;
int m = 1, n = 0;
Double[] T = new Double[100];//固定只能計算100次
T[n] = (b - a) * (f(a) + f(b)) / 2;
do {
h = (b - a) / m;
double s = 0.0;
for (int k = 0; k < m; k++) {
s += f(a + (k + 0.5) * h);
}
T[n + 1] = T[n] / 2 + h / 2 * s;
m = 2 * m;
n++;
} while (Math.abs(T[n] - T[n - 1]) >= 0.0000001);
stringResult = "n= " + n +
"\nS= " + T[n]
+ "\n誤差為 " + Math.abs(T[n] - T[n - 1]);
tvResult.setText(stringResult);
}
//龍貝格法求值
private void RombergCaculation() {
Double a = 0.0, b = 1.0, h;
Double[][] T = new Double[100][100];//固定只能計算100次
int i = 0;
T[i][i] = (b - a) * (f(a) + f(b)) / 2;
do {
i++;
double s = 0;
for (int j = 0; j <= Math.pow(2, i - 1) - 1; j++) {
s += f(a + (2 * j + 1) * (b - a) / Math.pow(2, i));
}
s = s * (b - a) / Math.pow(2, i);
s += T[i - 1][0] / 2;
T[i][0] = s;
for (int m = 1; m <= i; m++) {
T[i][m] = (Math.pow(4, m) * T[i][m - 1] - T[i - 1][m - 1]) / (Math.pow(4, m) - 1);
}
} while (Math.abs(T[i][i] - T[i - 1][i - 1]) >= 0.0000001);
stringResult = "n= " + i +
"\nS= " + T[i][i]
+ "\n誤差為 " + Math.abs(T[i][i] - T[i - 1][i - 1]);
tvResult.setText(stringResult);
}
double f(double x) {
double y;
//如果x等於0,就直接返回1
if (x == 0)
y = 1;
else y = Math.sin(x) / x;
return (y);
}
}
原始碼地址:http://download.csdn.net/detail/double2hao/9513415
相關文章
- 【數值計算方法】數值積分&微分
- # 數值計算:三角形積分
- MATLAB學習筆記:數值積分Matlab筆記
- 數值計算:高斯-勒朗德積分公式公式
- 實驗四 常微分方程的數值解(android)Android
- 數值積分公式及龍貝格(Romberg)演算法實現matlab公式演算法Matlab
- 【數值計算方法】常微分方程數值解-數值實驗
- 實驗二 插值方法(android)Android
- 【數值計算方法】非線性方程求根-數值實驗
- 物理引擎脈絡梳理(數值積分、碰撞檢測、約束解決)
- 【數值計算方法】線性方程組的迭代解法-數值實驗
- 6.15 工程數學實驗三
- 玩轉matlab之一維 gauss 數值積分公式及matlab原始碼Matlab公式原始碼
- 湖南大學人工智慧實驗三:分類演算法實驗人工智慧演算法
- 數學——變上限積分的應用
- 積分
- 積分商城_積分系統_積分業務邏輯與管理_OctShop
- 【原創】開源Math.NET基礎數學類庫使用(08)C#進行數值積分C#
- 圖卷積實戰——文字分類卷積文字分類
- 【影像縮放】雙立方(三次)卷積插值卷積
- 二維或三維的分佈積分方法(格林公式)7公式
- 利用字串實現高精度數值運算(三)字串
- [048][組合語言]實驗10 3、數值顯示組合語言
- 實驗三驗收3
- 實驗7.Vlan劃分實驗
- 不定積分
- 半球積分
- OPP實驗三
- OOP實驗三OOP
- Android開發自定義控制元件實現一個足球積分榜RankBarAndroid控制元件
- 級數和的估計---積分的應用
- 二值影象分析:案例實戰(文字分離+硬幣計數)
- 基本積分表
- 【微積分】不定積分
- 實驗三--測試
- 玩轉 matlab 之二維 gauss 數值積分公式使用及 matlab 原始碼(1)-常量區間Matlab公式原始碼
- 不用第三個變數,交換變數的值變數
- matlab對不定積分和定積分的計算Matlab