拉道radau伪谱算法

1613 篇文章 1648 订阅

出处-类目-编号

1.问题描述:

 

由于radau离散化之后的非线性方程组非常复杂,直接使用MATLAB自带的fmincon函数,无法计算出最后的结果。我们根据fmincon的原理以及方程组的特点,自己编写了优化算法。具体你可以看我们的代码,其基本原理也是基于搜索过程的。

2.部分程序:

 

clc;
clear;
close all;
warning off;
RandStream.setDefaultStream(RandStream('mt19937ar','seed',sum(1)));
%% 参数的定义
%各个参数的初始化
r0     =  6498;%飞行器的地心距
Theta0 =  0;%经度
Fai0   =  0;%纬度
V0     =  7.315;%飞行器的速度 
Gamma0 = -1.5*pi/180;%飞行路径角 
Si0    =  45*pi/180;%航向角 
%如下的为两个控制变量
delta0 =  90*pi/180;%倾斜角 
alpha0 =  20*pi/180;%攻角
%变量
g0     =  9.81;%重力加速度
%常数
P      =  1.225;        %海平面大气密度
Rs     =  6376;         %地球半径
Sref   =  49.24;       %气动参考面积
m      =  1000;         %质量 
u      =  9.81*Rs*Rs;    %地球的引力常数为9.81*地球的半径的平方
%常系数
aa0    = -0.02963;
aa1    =  0.03077;
aa2    =  8.5e-5;
bb0    =  0.01565;
bb1    =  0.005185;
bb2    =  0.000562;
%目标函数的参数值
C      = 30.5;
R      = 0.15;
qmax   = 150;
nmax   = 20;
Qmax   = 1600;


%% RPM操作
%RPM的基本思路就是将状态变量(本课题是6个状态变量)和控制变量(本课题是两个控制变量)在一系列的LGR点上离散化
%定义积分时间
t0    = 0;
tf    = 10;
%分段为K个网络
K     = 90;
%对每个网络段中进行插值的点数
Ns    = 10;%插值点个数
for k = 1:90
    ts(k) = t0 +  k*(tf - t0)/90;
end

for k = 2:90
    %做映射
    syms t;
    Tao(k) = ( 2*t - ( ts(k)+ts(k-1) ) )/( ts(k)-ts(k-1) );
end
 
%将原公式转换为RPM离散方程式
Dkl = zeros(90,Ns);
%离散状态变量定义为ak
a1  = zeros(90,1);
a2  = zeros(90,1);
a3  = zeros(90,1);
a4  = zeros(90,1);
a5  = zeros(90,1);
a6  = zeros(90,1);
%离散控制变量定义为bk
b1  = zeros(90,1);
b2  = zeros(90,1);

for k = 1:90%分成K段网络
    g = u/a1(k)^2;
    p = P*exp(-0.00015*(a1(k)-Rs));
    %部分由状态变量决定的参数
    D = 0.5*p*a4(k)^2*Sref*(bb0 + bb1*b1(k) + bb2*b1(k)^2);
    L = 0.5*p*a4(k)^2*Sref*(aa0 + aa1*b1(k) + aa2*b1(k)^2);
    G = m;
    %状态方程(6个)
    %公式1
    for i = 1:Ns
        Tmp1(i) = Dkl(k,i)*a1(k);
    end
    SS1(k) = sum(Tmp1) - (tf-t0)/2 * a4(k)*sin(a5(k));
    %公式2
    for i = 1:Ns
        Tmp2(i) = Dkl(k,i)*a2(k);
    end
    SS2(k) = sum(Tmp2) - (tf-t0)/2 * a4(k)*cos(a5(k))*cos(a6(k)) / (a1(k)*cos(a3(k)));
    %公式3
    for i = 1:Ns
        Tmp3(i) = Dkl(k,i)*a3(k);
    end
    SS3(k) = sum(Tmp3) - (tf-t0)/2 * a4(k)*cos(a5(k))*sin(a6(k)) / (a1(k));
    %公式4
    for i = 1:Ns
        Tmp4(i) = Dkl(k,i)*a4(k);
    end
    SS4(k) = sum(Tmp4) + (tf-t0)/2 * (D/m + g*sin(a5(k)));
    %公式5
    for i = 1:Ns
        Tmp5(i) = Dkl(k,i)*a5(k);
    end
    SS5(k) = a4(k)*(sum(Tmp5) - (tf-t0)/2 * (L/m * cos(b2(k)) -g*cos(a5(k)) + a4(k)^2/a1(k)*cos(a5(k))));
    %公式6
    for i = 1:Ns
        Tmp6(i) = Dkl(k,i)*a6(k);
    end
    SS6(k) = a4(k)*(sum(Tmp6) - (tf-t0)/2 * (L/m * sin(b2(k))/cos(a5(k)) - a4(k)^2/a1(k)*cos(a5(k))*cos(a6(k))*tan(a3(k))));

    %约束(3个)
    YY1(k) = 0.5*p*a4(k)^2 - qmax;%动压
    YY2(k) = sqrt(L^2 + D^2)/G - nmax;%过载
    YY3(k) = 3.0078*sqrt(p)*a4(k)^3.08 - Qmax;%驻点热流
end

%根据映射结果计算L值
for i = 1:90
   for kk=1:Ns
       if kk~=i
          LL(i)=(t-Tao(kk))/(Tao(i)-Tao(kk));
       end
   end
end
for i = 1:90
    Ls(i)=int(LL(i),t,-1,1);
end
Ls = double(Ls);


%目标方程(1个)
for i = 1:90
    Tmp7(i) = C/sqrt(R)*p^0.5*a4(k)^3.08/(Ls(i)^2);
end    
J = -(tf-t0)/(90*(90+1))*sum(Tmp7);


%%
%六状态
r_line     = zeros(1,90);
Theta_line = zeros(1,90);
Fai_line   = zeros(1,90);
V_line     = zeros(1,90);
Gamma_line = zeros(1,90);
Si_line    = zeros(1,90); 
%两个控制变量  
delta_line = zeros(1,90);
alpha_line = zeros(1,90);
%动压,过载,驻点热流
Dynamic_pressure      = zeros(1,90); 
Overload              = zeros(1,90);
Stagnation_point_heat = zeros(1,90); 


for k = 1:90
    k
    if  k == 1
        Dkl(k,:) = func_D(t0,tf,ts,90,Ns,k);
        %离散状态变量定义为ak
        a1(k)    = r0;
        a2(k)    = Theta0;
        a3(k)    = Fai0;
        a4(k)    = V0;
        a5(k)    = Gamma0;
        a6(k)    = Si0;
        %离散控制变量定义为bk
        b1(k)    = delta0;
        b2(k)    = alpha0;   
        x        = [a1(k) a2(k) a3(k) a4(k) a5(k) a6(k) b1(k) b2(k)];
        
        %将每个网络的最优解方程到过程变量数据中
        %六状态
        r_line(k)                = x(1);
        Theta_line(k)            = x(2);
        Fai_line(k)              = x(3);
        V_line(k)                = x(4);
        Gamma_line(k)            = x(5);
        Si_line(k)               = x(6); 
        %两个控制变量  
        delta_line(k)            = x(7);
        alpha_line(k)            = x(8);
        %动压,过载,驻点热流
        Dynamic_pressure(k)      = 0.5*p*x(4)^2; 
        D                        = 0.5*p*x(4)^2*Sref*(bb0 + bb1*x(8) + bb2*x(8)^2);
        L                        = 0.5*p*x(4)^2*Sref*(aa0 + aa1*x(8) + aa2*x(8)^2);
        Overload(k)              = sqrt(L^2 + D^2)/G;
        Stagnation_point_heat(k) = 3.0078*sqrt(p)*x(4)^3.08;         
        
    else    
        %注意,采用radau离散化之后的非线性方程组,没法直接使用fmincon进行求解,这里,我们自己编写了一个优化函数进行计算最优值
        %对控制状态进行循环(fmincon的原理,也是基于如下过程进行的)
        %优化精度Steps = 1;
        Steps = 5;
        %对于Radau分段后的每段网络中的配置点个数设置为Ns
        N     = Ns;
        cnt   = 0;
        dtf   = 0.4;
        nn    = 0;
        mm    = 0;
        alphass = [ 10:Steps:20]/180*pi;
        deltass = [-90:3*Steps:90]/180*pi;
        for alphas = alphass
            mm = 0;
            nn = nn+1;
            for deltas = deltass
                mm=mm+1;
                for NN  = 1:N
                    k_= k-1;
                    Dkl(k_,:) = func_D(t0,tf,ts,90,Ns,k_);
                    g = u/a1(k_)^2;
                    p = P*exp(-0.00015*(a1(k_)-Rs));
                    %部分由状态变量决定的参数
                    D = 0.5*p*a4(k_)^2*Sref*(bb0 + bb1*alphas + bb2*alphas^2);
                    L = 0.5*p*a4(k_)^2*Sref*(aa0 + aa1*alphas + aa2*alphas^2);
                    G = m;
                    
                    %状态方程(6个)
                    %公式1
                    a1(k_+1) =  a1(k_)+dtf*( (tf-t0)/2 * a4(k_)*sin(a5(k_)));
                    %公式2
                    a2(k_+1) =  a2(k_)+20*dtf*( (tf-t0)/2 * a4(k_)*cos(a5(k_))*cos(a6(k_)) / (a1(k_)*cos(a3(k_))));
                    %公式3
                    a3(k_+1) =  a3(k_)+20*dtf*( (tf-t0)/2 * a4(k_)*cos(a5(k_))*sin(a6(k_)) / (a1(k_)));
                    %公式4
                    a4(k_+1) =  a4(k_)+dtf*(  (tf-t0)/2 * (D/m + g*sin(a5(k_))))/20;
                    %公式5
                    a5(k_+1) =  dtf*( (tf-t0)/2 * (L/m * cos(deltas) -g*cos(a5(k_)) + a4(k_)^2/a1(k_)*cos(a5(k_))))/a4(k_);
                    %公式6
                    a6(k_+1) =  dtf*( (tf-t0)/2 * (L/m * sin(deltas)/cos(a5(k_)) - a4(k_)^2/a1(k_)*cos(a5(k_))*cos(a6(k_))*tan(a3(k_))))/a4(k_);    
                end
                
                D = 0.5*p*a4(k_+1)^2*Sref*(bb0 + bb1*alphas + bb2*alphas^2);
                L = 0.5*p*a4(k_+1)^2*Sref*(aa0 + aa1*alphas + aa2*alphas^2);
                if (0.5*p*a4(k_+1)^2 <= qmax) & (sqrt(L^2 + D^2)/G <= nmax) & (3.0078*sqrt(p)*a4(k_+1)^3.08 <= Qmax) &...
                   (0.5*p*a4(k_+1)^2 > 0) & (sqrt(L^2 + D^2)/G  > 0) & (3.0078*sqrt(p)*a4(k_+1)^3.08  > 0)&...
                    a1(k_+1) >= Rs+30 & a4(k_+1) >= 1.508 & a1(k_+1) <= Rs+80;
                    for ii = 1:90
                        Tmp7(ii) = C/sqrt(R)*p^0.5*(a4(k_+1))^3.08/(Ls(ii)^2);
                    end    
                    Js(nn,mm) = (tf-t0)/(90*(90+1))*sum(Tmp7); 
                else
                    Js(nn,mm) = inf; 
                end
            end
        end
            

        %找到最小的J,从而计算出对应的状态变量和控制变量
        [IX,IY]= find(Js==min(min(Js)));
        IX2    = IX(end);
        IY2    = IY(end);
        for alphas = alphass(IX2)
            for deltas = deltass(IY2)
                for NN  = 1:N
                    k_= k-1;
                    Dkl(k_,:) = func_D(t0,tf,ts,90,Ns,k_);
                    g = u/a1(k_)^2;
                    p = P*exp(-0.00015*(a1(k_)-Rs));
                    %部分由状态变量决定的参数
                    D = 0.5*p*a4(k_)^2*Sref*(bb0 + bb1*alphas + bb2*alphas^2);
                    L = 0.5*p*a4(k_)^2*Sref*(aa0 + aa1*alphas + aa2*alphas^2);
                    G = m;
                    %状态方程(6个)
                    %公式1
                    a1(k_+1) =  a1(k_)+dtf*(+ (tf-t0)/2 * a4(k_)*sin(a5(k_)));
                    %公式2
                    a2(k_+1) =  a2(k_)+20*dtf*( (tf-t0)/2 * a4(k_)*cos(a5(k_))*cos(a6(k_)) / (a1(k_)*cos(a3(k_))));
                    %公式3
                    a3(k_+1) =  a3(k_)+20*dtf*( (tf-t0)/2 * a4(k_)*cos(a5(k_))*sin(a6(k_)) / (a1(k_)));
                    %公式4
                    a4(k_+1) =  a4(k_)+dtf*(  (tf-t0)/2 * (D/m + g*sin(a5(k_))))/20;
                    %公式5
                    a5(k_+1) =  dtf*( (tf-t0)/2 * (L/m * cos(deltas) -g*cos(a5(k_)) + a4(k_)^2/a1(k_)*cos(a5(k_))))/a4(k_);
                    %公式6
                    a6(k_+1) =  dtf*( (tf-t0)/2 * (L/m * sin(deltas)/cos(a5(k_)) - a4(k_)^2/a1(k_)*cos(a5(k_))*cos(a6(k_))*tan(a3(k_))))/a4(k_);    
                end
            end
        end        

        
        a1(k) =  a1(k_+1);
        a2(k) =  a2(k_+1);
        a3(k) =  a3(k_+1);
        a4(k) =  a4(k_+1);
        a5(k) =  a5(k_+1);
        a6(k) =  a6(k_+1);
        b1(k) =  deltass(IY2);
        b2(k) =  alphass(IX2);

        x        = [a1(k) a2(k) a3(k) a4(k) a5(k) a6(k) b1(k) b2(k)];
        %将每个网络的最优解方程到过程变量数据中
        %六状态
        r_line(k)                = x(1);
        Theta_line(k)            = x(2);
        Fai_line(k)              = x(3);
        V_line(k)                = x(4);
        Gamma_line(k)            = x(5);
        Si_line(k)               = x(6); 
        %两个控制变量  
        delta_line(k)            = x(7);
        alpha_line(k)            = x(8);
        %动压,过载,驻点热流
        Dynamic_pressure(k)      = 0.5*p*x(4)^2; 
        D                        = 0.5*p*x(4)^2*Sref*(bb0 + bb1*x(8) + bb2*x(8)^2);
        L                        = 0.5*p*x(4)^2*Sref*(aa0 + aa1*x(8) + aa2*x(8)^2);
        Overload(k)              = sqrt(L^2 + D^2)/G;
        Stagnation_point_heat(k) = 3.0078*sqrt(p)*x(4)^3.08;        
    end
end

%%
%画图
%高度
figure;
subplot(4,2,1);
plot(1:90,r_line-Rs,'b-o');
xlabel('仿真时间');
ylabel('高度');
%速度
subplot(4,2,2);
plot(1:90,V_line,'b-o');
xlabel('仿真时间');
ylabel('速度');


%经纬度
subplot(4,2,[3,4]);
plot(1:90,Theta_line/pi*180,'r-o');
hold on;
plot(1:90,Fai_line/pi*180,'b-o');
xlabel('仿真时间');
ylabel('经纬度');
legend('经度','纬度');

%倾斜角
subplot(4,2,5);
plot(1:90,delta_line/pi*180,'r-o');
hold on;
xlabel('仿真时间');
ylabel('倾斜角');
%攻角
subplot(4,2,6);
plot(1:90,alpha_line/pi*180,'r-o');
hold on;
xlabel('仿真时间');
ylabel('攻角');


%动压
subplot(4,2,7);
plot(Dynamic_pressure(3:end),'r-o');
hold on;
xlabel('仿真时间');
ylabel('动压');
%驻点热流
subplot(4,2,8);
plot(Stagnation_point_heat(3:end),'r-o');
hold on;
xlabel('仿真时间');
ylabel('驻点热流');

 

3.仿真结论:

A-06-07

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fpga和matlab

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值