實驗四 常微分方程的數值解(android)
實驗一部落格地址:http://blog.csdn.net/double2hao/article/details/51152843
實驗二部落格地址:http://blog.csdn.net/double2hao/article/details/51217356
實驗三部落格地址:http://blog.csdn.net/double2hao/article/details/51344145
【實驗內容】
分別寫出改進尤拉法與四階龍格庫塔求解的演算法,編寫成熟上機除錯出結果,要求所程式設計序適用於任何一階常微分方程的數值解問題,即能解決這一類問題,而不是某一個問題。
試驗中以下列資料驗證程式的正確性。
求
y'=-xy^2
y(0)=2
(0<=x<=5) 步長h=0.25
效果:(原始碼在文章結尾)
主要工作:
1、新增了FourFragment的xml介面
2、掌握理解改進尤拉法與四階龍格庫塔法
主要邏輯程式碼
FourFragment:
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;
import java.text.DecimalFormat;
/**
* 專案名稱:NumericCalculationTest
* 建立人:Double2號
* 建立時間:2016/4/13 21:41
* 修改備註:
*/
public class FourFragment extends Fragment {
private View views;
private Spinner mSpinner;
private final String[] spinnerChose = {"改進尤拉法", "四階龍格庫塔法"};
private Button btnSure;
private TextView tvResult;
private String stringResult;
final double h=0.25;
private DecimalFormat mDecimalFormat = new DecimalFormat("0.00");//保留兩位小數
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
views = inflater.inflate(R.layout.fra_four, null);
initView();
return views;
}
private void initView() {
mSpinner = (Spinner) views.findViewById(R.id.sp_four_chose);
btnSure = (Button) views.findViewById(R.id.btn_four_sure);
tvResult = (TextView) views.findViewById(R.id.tv_four_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) {
EulerCaculation();
} else {
RungeKuttaCaculation();
}
}
private void EulerCaculation() {
double[] x=new double[21];
double[] y=new double[21];
double[] y_next=new double[21];
x[0]=0;
for(int i=1;i<21;i++) {
x[i]=x[i-1]+h;
}
y[0]=2;
stringResult="x= "+mDecimalFormat.format(x[0])+" y= "+y[0]+"\n";
for(int i=0;i<20;i++){
y_next[i]=y[i]+h*f(x[i],y[i]);
y[i+1]=y[i]+(f(x[i],y[i])+f(x[i+1],y_next[i]))*h/2;
stringResult+="x= "+mDecimalFormat.format(x[i+1])+" y= "+y[i+1]+"\n";
}
tvResult.setText(stringResult);
}
private void RungeKuttaCaculation() {
double[] x=new double[21];
double[] y=new double[21];
double[] k=new double[4];
x[0]=0;
for(int i=1;i<21;i++) {
x[i]=x[i-1]+h;
}
y[0]=2;
stringResult="x= "+mDecimalFormat.format(x[0])+" y= "+y[0]+"\n";
for(int i=0;i<20;i++){
k[0]=f(x[i],y[i]);
k[1]=f(x[i]+h/2,y[i]+k[0]*h/2);
k[2]=f(x[i]+h/2,y[i]+k[1]*h/2);
k[3]=f(x[i]+h,y[i]+h*k[2]);
y[i+1]=y[i]+(k[0]+2*k[1]+2*k[2]+k[3])*h/6;
stringResult+="x= "+mDecimalFormat.format(x[i+1])+" y= "+y[i+1]+"\n";
}
tvResult.setText(stringResult);
}
double f(double x,double y) {
return -(x*Math.pow(y,2));
}
}
相關文章
- 常微分方程選題
- 筆記 常微分方程筆記
- 實驗一 直接法解線性方程組(android)Android
- 實驗五 迭代法解線性方程組與非線性方程(android)Android
- 實驗三 數值積分(android)Android
- 【機器學習】數值分析02——任意方程求根機器學習
- 微分方程數值解法的matlab程式Matlab
- [常微分方程]Lecture 1: ODE的幾何解法:方向場、積分曲線
- 實驗二 插值方法(android)Android
- 兩個數換值四種方法實現
- 實驗四
- 實驗任務四:登入介面、實驗任務五:猜數字
- 利用字串實現高精度數值運算(四)字串
- 高等代數:3 線性方程組的解集的結構
- 數字影像處理實驗(四)影像銳化
- Python常用的四種數值交換方式!Python
- 實驗四 CTF實踐
- 變數的解構賦值變數賦值
- [048][組合語言]實驗10 3、數值顯示組合語言
- 實驗四————RIP協議的配置協議
- 數字訊號處理實驗(四):數字濾波器結構
- Oracle恢復實驗(四)Oracle
- mssql sqlserver 取消數值四捨五入的方法分享SQLServer
- 遞推方程的特徵方程解法特徵
- C的兩個數值交換(Android之JNI)Android
- 從零開始實現放置遊戲(四)後臺數值配置的增刪查改遊戲
- 網路滲透實驗四
- 在android的spinner中,實現取VALUE值和TEXT值。Android
- 【演算法詳解】求解數值的整數次方演算法
- 實驗四 棧和佇列的基本操作佇列
- 做數值就是做體驗! RPG遊戲關卡數值設計思路分析遊戲
- Android 四大元件的解讀Android元件
- 實驗 詳解Docker的各種操作小實驗Docker
- Golang Map實現(四) map 的賦值和擴容Golang賦值
- Stata實現結構方程模型模型
- C語言實驗——一元二次方程Ⅰ (sdut oj)C語言
- 可抹位迴文數方程式
- ES6:變數的解構賦值變數賦值