zoukankan      html  css  js  c++  java
  • 微分方程(1)---微分方程的数值解法

    常微分方程

    常微分方程是由函数在某点导数值和一个与x,y相关函数组成的方程

    y=f(x,y)

    式子 y=x2+y2 就是一种典型的常微分方程,并且这个方程很难用分离变量的方法解出。matlab程序表达为

    function f=f_xy(x,y)
    f=x^2-y^2;
    end

    1.欧拉法

    利用欧拉法解微分方程的思路是利用线性定理对下一步的函数值进行估计,欧拉给出的公式为

    y=f(x,y)
    yn+1=yn+hy
    xn+1=xn+h

    欧拉法的误差为一阶,故称为一阶方法
    其代码为

    x0=0;
    y0=1;
    x=[x0];
    y=[y0];
    a=.01;
    for h=0:a:1
        y0=y0+a*f_xy(x0,y0);
        x0=x0+a;
        x=[x x0];
        y=[y y0];
    end
    plot(x,y,'r+')

    由欧拉法所解得的图像为
    这里写图片描述

    二阶龙哥库塔法

    龙哥库塔法的出现时为了减小欧拉法带来的误差,其思想在于利用估计斜率的组合来获得真实斜率值得估计。

    Bn=(An+An)2
    An=f(xn+1,yˆn+1)
    yˆn+1=xn+yh
    An=y

    Bn 为对下一步斜率的最佳估计。即 yn+1=xn+Bnh

    x0=0;
    y0=1;
    x=[x0];
    y=[y0];
    a=.01;
    for h=0:a:1
        y1=y0;
        x1=x0+a;
        y1=y0+a*f_xy(x0,y0);
        Hypf_xy=f_xy(x1,y1);
        y0=y0+a*(f_xy(x0,y0)+Hypf_xy)/2;
        x0=x0+a;
        x=[x x0];
        y=[y y0];
    end
    plot(x,y,'g+')
    hold on

    结果如图
    这里写图片描述

    绿色的线是二阶龙哥库塔法的结果,显然要比红线更加贴近真实情况(对于凹曲线而言,微分方程数值解会小于真实值)

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    自定义异常
    java代码中正则表达式
    mybatis中代码如何实现批量添加
    List集合的三种遍历方式的效率问题
    4种方式配置不同作用域的jvm的堆栈内存!
    如何在Eclipse里修改端口
    如何用Eclipse打jar包
    用explain来解析sql语句,然后建立正确的索引
    quartz简单demo,教你最快使用quartz
    log4j.properties配置详解
  • 原文地址:https://www.cnblogs.com/ironstark/p/4892619.html
Copyright © 2011-2022 走看看