zoukankan      html  css  js  c++  java
  • Lorenz方程组的MATLAB实现

    首先,我们考虑Lorenz方程组

    dy1/dt=sigma*(y2-y1),

    dy2/dt=r*y1-y2-y1*y3,

    dy3/dt=y1*y2-b*y3,

    其中 sigma为普朗特数,r为瑞利数,b为非负常数,这是一个混沌系统。当我们取参数 sigma=10,r=28,sigma=8/3,初值为(0,1,0)时,采用四阶显式龙格库塔方法进行求解的MATLAB程序如下:

    主程序:

    clc,clear;
    close all;
    k = 0.01; % constant step size
    tf = 100; % final time
    % given initial conditions
    y0(1) = 0; y0(2) = 1; y0(3) = 0;
    y0 = shiftdim(y0);
    % integrate
    [tout,yout] = rk4(tf,k,y0);
    % plot solution in phase space
    figure (1)
    subplot(1,3,1)
    plot(yout(1,:),yout(2,:));
    xlabel('y_1');
    ylabel('y_2');
    subplot(1,3,2)
    plot(yout(1,:),yout(3,:));
    xlabel('y_1');
    ylabel('y_3');
    subplot(1,3,3)
    plot(yout(2,:),yout(3,:));
    xlabel('y_2');
    ylabel('y_3');
    figure (2)
    subplot(1,3,1)
    plot(tout,yout(1,:));
    xlabel('t');
    ylabel('y_1');
    subplot(1,3,2)
    plot(tout,yout(2,:));
    xlabel('t');
    ylabel('y_2');
    subplot(1,3,3)
    plot(tout,yout(3,:));
    xlabel('t');
    ylabel('y_3');
    

    子程序:显式龙格库塔法

    function [tout,yout] = rk4 (tf,k,y0)
    %
    % [tout,yout] = rk4 (tf,k,y0)
    % solves non-stiff IVODEs based on classical 4-stage Runge-Kutta
    %
    % y’ = ffun (t,y), y(0) = y0, 0 < t < tf
    % ffun returns a vector of m components for a given
    % t and y of m components.
    %
    % Input:
    % tf - final time
    % k - uniform step size
    % y0 - initial values y(0) (size (m,1))
    %
    % Output:
    % tout - times where solution is computed
    % yout - solution vector at times tout.
    % prepare
    N = tf / k;
    tout = [0];
    fo = ffun (tout(1),y0);
    yout(:,1) = y0;
    % loop in time
    for n=1:N
    t = tout(n);
    y = yout(:,n);
    Y1 = y;
    K1 = ffun(t,Y1);
    Y2 = y + k/2*K1;
    t = t + k/2;
    K2 = ffun(t,Y2);
    Y3 = y + k/2*K2;
    K3 = ffun(t,Y3);
    Y4 = y + k*K3;
    t = t + k/2;
    K4 = ffun(t,Y4);
    tout(n+1) = t;
    yout(:,n+1) = y + k/6*(K1+2*K2+2*K3+K4);
    end
    end
    

    子程序:求解函数

    function f = ffun(t,y)
    % function defining ODE
    sigma = 10; b = 8/3; r = 28;
    f = zeros(3,1);
    f(1) = sigma *(y(2)-y(1));
    f(2) = r * y(1) - y(2) - y(1)*y(3);
    f(3) = y(1)*y(2) - b*y(3);
    

    结果:

     

    参考文献:

    [1] Ascher, Uri M . Numerical Methods for Evolutionary Differential Equations, SIAM, 2008.

  • 相关阅读:
    实验四 决策树算法及应用
    实验三 朴素贝叶斯算法及应用
    实验二 k-近邻算法及应用
    实验一 感知器及其应用
    实验三 面向对象分析与设计
    实验二 结构化分析与设计
    实验一 软件开发文档与工具的安装与使用
    ATM管理系统
    流程图与活动图的区别与联系
    四则运算2
  • 原文地址:https://www.cnblogs.com/qfl21/p/15155771.html
Copyright © 2011-2022 走看看