zoukankan      html  css  js  c++  java
  • 四阶龙格库塔法matlab解微分方程组

    这是我在学习飞行器制导与控制时的课程作业。用四阶龙格库塔法解微分方程组。我一开始的想法是分别利用龙格库塔法解每一个微分方程,但变量很多,算法会比较复杂。后来明白可以把多变量看作是一个变量,利用matlab的feval函数进行代入变量的函数运算。

    matlab中feval函数的作用:feval(f,x,y);将x,y代入函数f中。

    四阶龙格-库塔法:

    需要解的四个微分方程组为:

    算法代码:

    主函数main.m

    main.m
    clear all;
    clc;
    %% 定义初始参数
    M0=2;            %马赫数
    h0=5000;       %初始高度
    theta0=-30*pi/180;    %初始弹道倾角,注意度数的表示
    a=340;            %音速
    g0=9.81;
    %% 运算
    v0=M0*a;
    y0=[v0;theta0;0;h0];
    h=0.01;   %步长
    t0=0;
    t1=200;
    [finaltime,n,y,t] = RK4(@equations,y0,h,t0,t1);
    %% 显示结果
    title('弹道曲线');
    plot(y(3,1:n),y(4,1:n));
    xlabel('x/m');ylabel('h/m');
    figure;
    title('速度变化曲线');
    plot(t(1:n),y(1,1:n));
    xlabel('t/s');ylabel('v/(m/s)');
    figure;

    四阶龙格-库塔法RK4.m

    function [finaltime,n,y,t] = RK4(f,y0,h,t0,t1)
    %龙格库塔四阶
    %   f:微分方程组
    %   y0:[v;theta;x;h]初始值
    %   h:步长
    %   t0-t1:时间区间
    
    t=t0:h:t1;
    y=zeros(length(y0),length(t));
    y(:,1)=y0;
    flag=1;
    n=1;
    while(flag)           %判断导弹是否落地
        if (y(4,n)>0)
            k1=feval(f,t(n),y(:,n));
            k2=feval(f,t(n)+h/2,y(:,n)+h/2*k1);
            k3=feval(f,t(n)+h/2,y(:,n)+h/2*k2);
            k4=feval(f,t(n)+h,y(:,n)+h*k3);
            y(:,n+1)=y(:,n)+(h/6)*(k1+2*k2+2*k3+k4);
            n=n+1;
        else
            finaltime=t(n-1);
            flag=0;
         end
    end
    
    end

    导弹质点运动的动力学微分方程组equations.m

    function f= equations(t,y)
    % 四个微分方程组
    %   t为时间
    %   y=[v;theta;x;h]
    m=260;         %质量
    s=0.24;           %参考面积
    a=340;            %音速
    alpha=2;       %攻角
    g0=9.81;
    
    M=y(1)/a;
    G=m*g0;
    rho=1.225*exp(-0.00015*y(4));
    
    Cx=[M^2,M,1]*[0.0002, 0.0038, 0.1582;
                               -0.0022, -0.0132, -0.8520;
                               0.0115, -0.0044, 1.9712;]*[alpha^2,alpha,1]';
    X=Cx*1/2*rho*(y(1)^2)*s;
    Cy=[M^2,M,1]*[-0.026,0.0651,0.4913]'*alpha;
    Y=Cy*1/2*rho*(y(1)^2)*s;
    
    f(1)=-X/m-G*sin(y(2))/m;
    f(2)=Y/(m*y(1))-G*cos(y(2))/(m*y(1));
    f(3)=y(1)*cos(y(2));
    f(4)=y(1)*sin(y(2));
    f=f(:);
    end
  • 相关阅读:
    几种 JavaScript 动画库推荐
    微软工程师为你推荐了十本程序员必读书目
    前端新老手必备的34种JavaScript简写优化技术
    Airbnb 爱彼迎 visx 项目介绍
    开源中间件技术支持(5000+元/天)
    C# Byte数组与Int16数组之间的转换(转)
    【636】K.sum 与 np.sum 的区别
    【635】语义分割 label 通道与模型输出通道的
    【634】ndarray 提取行列进行任意变换 & 相关 ndarray 操作
    面试官:设计一个安全的登录都要考虑哪些?我一脸懵逼。。
  • 原文地址:https://www.cnblogs.com/huangliu1111/p/12916031.html
Copyright © 2011-2022 走看看