实验四 常微分方程的数值解(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));
    }
}


源码地址:http://download.csdn.net/detail/double2hao/9516426

本资源涵盖多元方程组、非线性方程和常微分方程的软件组合,介绍如下: 线性方程组的数值法: 线性方程组亦即多元一次方程组。在自然科学与工程技术中,很多问题的决常常归结为线性方程组,如电学中的网络问题,船体数学放样中的建立三次样条函数问题,机械和建筑结构的设计和计算等等。因此,如何利用电子计算机这一强有力的计算工具去求解线性方程组,是一个非常重要的问题。线性方程组的法分直接()法{是指在没有舍入误差的假设下,经过有限步运算即可求得方程组的精确的方法。}和迭代()法{是用某种极限过程去逐步逼近线性方程组精确的方法,即是从一个初始向量x0发,按照一定的迭代格式产生一个向量序列xk,使其收敛到方程组A*x=b的}。该部分就是针对线性方程组求解而设计的,内容包括:线性方程组的直接法:Gauss消去法、Gauss列主元消去法、Gauss全主元消去法、列主元消去法应用『列主元求逆矩阵、列主元求行列式、矩阵的三角分』、LU分法、平方根法、改进的平方根法、追赶法(三对角)、列主元三角分法;线性方程组的迭代法:雅可比迭代法、高斯-塞德尔迭代法、逐次超松驰迭代法;迭代法的收敛性『正定矩阵判断、向量范数、矩阵范数、严格对角站优矩阵判断』。 非线性方程的数值法: 在科学研究与工程技术中常会遇到求解非线性方程f(x)=0的问题。而方程f(x)是多项式或超越函数又分为代数方程或超越方程。对于不高于次的代数方程已有求根公式,而高于次的代数方程则无精确的求根公式,至于超越方程就更无法求其精确了。因此,如何求得满足一定精度要求的方程的近似根也就成为了广大科技工作者迫切需要决的问题。该部分就是针对这一问题而设计的,内容包括:二分法、迭代法、迭代加速法、埃特金加速法、牛顿切线法、弦截法。 常微分方程数值法: 常微分方程求解问题在实践中经常遇到,但我们只知道一些特殊类型的常微分方程。在科学和工程问题中遇到的常微分方程的往往很复杂,在许多问题中,并不需要方程的表达式,而仅仅需要获得在若干点的就算即可。因此,研究常微分方程的的数值就很有必要。该部分就是针对这些而设计的,内容包括:欧拉(Euler)方法、龙格库塔(Runge-Kutta)方法、线性多步方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值