精华内容
下载资源
问答
  • BP神经网络matlab代码讲解与实现步骤

    万次阅读 多人点赞 2020-04-02 01:39:51
    BP神经网络matlab代码实现 文章目录BP神经网络matlab代码实现1. BP神经网络的简介和结构参数1.1 BP神经网络的结构组成1.2 BP神经网络训练界面的参数解读2. 实现BP网络的步骤3. matlab代码编写4. BP代码运行结果4.1 ...

    1. BP神经网络的简介和结构参数

    神经网络是机器学习中一种常见的数学模型,通过构建类似于大脑神经突触联接的结构,来进行信息处理。在应用神经网络的过程中,处理信息的单元一般分为三类:输入单元、输出单元和隐含单元。 顾名思义:输入单元接受外部给的信号与数据;输出单元实现系统处理结果的输出;隐含单元处在输入和输出单元之间,从网络系统外部是无法观测到隐含单元的结构的。除了上述三个处理信息的单元之外,神经元间的连接强度大小由权值等参数来决定。

    1.1 BP神经网络的结构组成

    下图是训练神经网络时经常出现的一个界面,从这部分我们可以看到,这是一个2输入1输出,5个隐含层的BP网络,称为2-5-1网络结构
    在这里插入图片描述

    1.2 BP神经网络训练界面的参数解读

    需要注意的是:
    1. 泛化性: 表示BP神经网络在训练过程中,如果均方误差(MSE)连续6次不降反升,则网络停止训练
    2. 误差精度: 关于mu参数含义的一种理解是,mu是误差精度参数,用于给神经网络的权重再加一个调制,这样可以避免在BP网络训练的过程中陷入局部最小值,mu的范围为0到1。英文的释义如下:
    Mu stands for momentum constant or momentum parameter which is included in weight update expression to avoid the problem of local minimum. Sometimes network may get stuck to local minimum and convergence does not occur. Range of mu is between 0 and 1.

    在这里插入图片描述

    2. 实现BP网络的步骤

    1. 读取数据
    2. 设置训练数据和预测数据
    3. 训练样本数据归一化
    4. 构建BP神经网络
    5. 网络参数配置(训练次数,学习速率,训练目标最小误差.等)
    6. BP神经网络训练
    7. 测试样本归一化
    8. BP神经网络预测
    9. 预测结果反归一化与误差计算
    10. 验证集的真实值与预测值误差比较

    3. matlab代码编写

    %% 此程序matlab编程实现的BP神经网络
    % 清空环境变量
    clear all
    clc
    
    %%第一步 读取数据
    load input  %载入输入数据
    load output  %载入输出数据
    
    %% 第二步 设置训练数据和预测数据
    input_train = input(:,1:190);
    output_train =output(1:190,:)';
    input_test = input(:,191:200);
    output_test =output(191:200,:)';
    %节点个数
    inputnum=2;
    hiddennum=5;%隐含层节点数量经验公式p=sqrt(m+n)+a ,故分别取2~13进行试验
    outputnum=1;
    %% 第三本 训练样本数据归一化
    [inputn,inputps]=mapminmax(input_train);%归一化到[-1,1]之间,inputps用来作下一次同样的归一化
    [outputn,outputps]=mapminmax(output_train);
    %% 第四步 构建BP神经网络
    net=newff(inputn,outputn,hiddennum,{'tansig','purelin'},'trainlm');% 建立模型,传递函数使用purelin,采用梯度下降法训练
    
    W1= net. iw{1, 1};%输入层到中间层的权值
    B1 = net.b{1};%中间各层神经元阈值
    
    W2 = net.lw{2,1};%中间层到输出层的权值
    B2 = net. b{2};%输出层各神经元阈值
    
    %% 第五步 网络参数配置( 训练次数,学习速率,训练目标最小误差等)
    net.trainParam.epochs=1000;         % 训练次数,这里设置为1000次
    net.trainParam.lr=0.01;                   % 学习速率,这里设置为0.01
    net.trainParam.goal=0.00001;                    % 训练目标最小误差,这里设置为0.00001
    
    %% 第六步 BP神经网络训练
    net=train(net,inputn,outputn);%开始训练,其中inputn,outputn分别为输入输出样本
    
    %% 第七步 测试样本归一化
    inputn_test=mapminmax('apply',input_test,inputps);% 对样本数据进行归一化
    
    %% 第八步 BP神经网络预测
    an=sim(net,inputn_test); %用训练好的模型进行仿真
    
    %% 第九步 预测结果反归一化与误差计算     
    test_simu=mapminmax('reverse',an,outputps); %把仿真得到的数据还原为原始的数量级
    error=test_simu-output_test;      %预测值和真实值的误差
    
    %%第十步 真实值与预测值误差比较
    figure(1)
    plot(output_test,'bo-')
    hold on
    plot(test_simu,'r*-')
    hold on
    plot(error,'square','MarkerFaceColor','b')
    legend('期望值','预测值','误差')
    xlabel('数据组数')
    ylabel('值')
    [c,l]=size(output_test);
    MAE1=sum(abs(error./output_test))/l;
    MSE1=error*error'/l;
    RMSE1=MSE1^(1/2);
    disp(['-----------------------误差计算--------------------------'])
    disp(['隐含层节点数为',num2str(hiddennum),'时的误差结果如下:'])
    disp(['平均绝对误差MAE为:',num2str(MAE1)])
    disp(['均方误差MSE为:       ',num2str(MSE1)])
    disp(['均方根误差RMSE为:  ',num2str(RMSE1)])
    
    

    4. BP代码运行结果

    4.1 预测值和真实值的误差计算(MAE、MSE、MRSE)

    在这里插入图片描述

    4.2 BP网络训练的性能分析图像

    1. 预测值和真实值、误差的分析图像
      在这里插入图片描述
    2. 训练集、验证集、测试集和总体的均方误差随训练次数的变化图像
      注:小圆圈位置代表终止的训练次数(即代数)处的均方误差
      在这里插入图片描述
    3. BP神经网络各阶段的训练图像
      在这里插入图片描述
    4. 各个样本集和总体的相关性分析图像
      在这里插入图片描述
    5. 训练集、验证集和测试集的误差分布直方图像
      在这里插入图片描述

    5. 结语

    1. 经过一周的努力编写,终于将BP网络的搭建思路和完整代码表述清楚,供大家学习。
    2. 伙伴们只需将自己的数据代入,即可得到相应的结果,如有问题,欢迎留言交流。
    3. 若有不恰当的地方,恳请码友指正。

    6. MATLAB代码与数据下载地址

    1. BP神经网络回归预测的MATLAB代码与数据地址

    https://mianbaoduo.com/o/bread/YZmTmptv

    2. BP神经网络数据分类的MATLAB代码与数据地址

    https://mianbaoduo.com/o/bread/YZmTmp5q

    3. BP神经网络回归预测的代码讲解

    https://mianbaoduo.com/o/bread/YZmUlZpw

    展开全文
  • MPC模型预测控制(二)-MATLAB代码实现

    万次阅读 多人点赞 2018-12-24 15:18:34
    update:MPC的QQ群 ... 这篇文章里主要写MPC的MATLAB实现。许多做控制的同学还是很喜欢用MATLAB的,可以先用MATLAB跑跑看自己的代码效果怎么样。 我看MPC的MATLAB代码实现...

    update:MPC的QQ群

    第一个群已经满500人(贫穷使我充不起鹅厂会员),这是第二个群。

    群都满了。

     

    https://blog.csdn.net/tingfenghanlei/article/details/85046120在这篇文章里主要讲了下MPC的原理和C++实现的一个简单例子。

    这篇文章里主要写MPC的MATLAB实现。许多做控制的同学还是很喜欢用MATLAB的,可以先用MATLAB跑跑看自己的代码效果怎么样。

    我看MPC的MATLAB代码实现,主要看的是《无人驾驶车辆模型预测控制》这本书,书里的代码也比较完备。这里实现的代码基本上都是这本书中的,CSDN也有下载链接,大家可以去下载观看。

    在实现MPC的代码之前,书中讲了LQR的代码实现。

    LQR和MPC的区别:

    LQR solves an optimization,

    MPC solves a constrained optimization

    In practice, optimization could lead to over-voltage, ovre-current, excessive force etc. You want a motor starts very quickly? The optimizer tells you give it an infinite electric current. So you use a saturation which destroys the optimality. MPC solves an optimization without excessing the limits.

    In addition, LQR can be solved offline for an LTI system. However, MPC is not a linear controller. Typically, it must be solved online at each sample time. It requires higher computational load. MPC has toolbox in MATLAB. You can use it before you learn its theory in deep.

    参考链接https://www.quora.com/Whats-the-difference-between-constrained-LQR-and-MPC

    function LQR_1()
    %这里先从简单开始,给定一个直线车道和车辆位置偏差。
    %参考轨迹的生成方法有两种:
    %1.车辆在Path上投影,然后在PATH上选取一系列的点作参考点
    %*现在遇到的问题是Q R的参数怎么设置。而且通用性怎么办?*%
    
    clear all;
    close all;
    clc;
    %% 给定参数:
    
    vel = 6; % 纵向车速,单位:m/s
    L=2.85;%轴距
    T=0.05;% sample time, control period
    % 给定圆形参考轨迹
     CEN=[0,0];       % 圆心
     Radius=20;       % 半径
    
    %% 设置参数
    Hp =10;%predictive horizion, control horizon 
    N_l=200;% 设置迭代次数
    
    Nx=3;%状态变量参数的个数
    Nu=1;%控制变量参数的个数
    
    FWA=zeros(N_l,1);%前轮偏角
    FWA(1,1)= 0; %初始状态的前轮偏角
    
    x_real=zeros(Nx,N_l);%实际状态
    x_real(:,1)= [22 0 pi/2]; %x0=车辆初始状态X_init初始状态
    % x_piao=zeros(N_l,Nx);%实际状态与参考轨迹的误差
    % 
    % u_real=zeros(N_l,Nu);%实际的控制量
    % u_piao=zeros(N_l,Nu);%实际控制量与参考控制量的误差
    
    % X_PIAO=zeros(N_l,3*Hp);%通过DR估计的状态
    % 
    % XXX=zeros(N_l,3*Hp);%用于保持每个时刻预测的所有状态值
    
    RefTraj=zeros(3,1);
    Delta_x = zeros(3,1);
    
    Q=[10 0 0; 0 10 0; 0 0 100];
    R=[10];%r是对控制量误差的weighting matrice
    
    Pk=[1 0 0; 0 1 0; 0 0 1]; %人为给定,相当于QN
    Vk=[0 0 0]'; %人为给定,相当于QN
    
    %%  算法实现
     u_feedBackward=0;
     u_feedForward=0;
     
     %*首先生成参考轨迹,画出图来作参考*%
     [RefTraj_x,RefTraj_y,RefTraj_theta,RefTraj_delta]=Func_CircularReferenceTrajGenerate(x_real(1,1),x_real(1,2),CEN(1),CEN(2),Radius,250,vel,T,L);
    
    figure(1) %绘制参考路径
    plot(RefTraj_x,RefTraj_y,'k')
    xlabel('x','fontsize',14)
    ylabel('y','fontsize',14)
    title('Plot of x vs y - Ref. Trajectory');
    legend('reference traj');
    axis equal 
    grid on
    hold on
    
    
    for i=1:1:N_l
    
        G_Test = 3;
        %先确定参考点和确定矩阵A,B.这里姑且认为A和B是不变的
        [RefTraj_x,RefTraj_y,RefTraj_theta,RefTraj_delta]=Func_CircularReferenceTrajGenerate(x_real(1,i),x_real(2,i),CEN(1),CEN(2),Radius,Hp,vel,T,L);
        u_feedForward = RefTraj_delta(G_Test);%前馈控制量
    %     u_feedForward=0;
        RefTraj_x(G_Test)
        RefTraj_y(G_Test)
        RefTraj_theta(G_Test)
        Delta_x(1,1) = x_real(1,i) - RefTraj_x(G_Test);
        Delta_x(2,1) = x_real(2,i) - RefTraj_y(G_Test);
        Delta_x(3,1) = x_real(3,i) - RefTraj_theta(G_Test);
        if  Delta_x(3,1) > pi
             Delta_x(3,1) = Delta_x(3,1)-2*pi;
        else if Delta_x(3,1) < -1*pi
                Delta_x(3,1) = Delta_x(3,1) +2*pi;
            else
                Delta_x(3,1) = Delta_x(3,1);
            end            
        end
        
         % 通过Backward recursion 求K    
        for  j=Hp:-1:2   
            Pk_1 = Pk;
            Vk_1 = Vk;     
            A=[1    0   -vel*sin(RefTraj_theta(j-1))*T; 0    1   vel*cos(RefTraj_theta(j-1))*T; 0    0   1;];
    %         B=[cos(RefTraj_theta(j-1))*T   0; sin(RefTraj_theta(j-1))*T   0; 0            vel*T/L;]; 
            COS2 = cos(RefTraj_delta(j-1))^2;
            B=[ 0 0  vel*T/(L*COS2)]'; 
    
            K = (B'*Pk_1*A)/(B'*Pk_1*B+R);
            Ku = R/(B'*Pk_1*B+R);
            Kv = B'/(B'*Pk_1*B+R);
    
            Pk=A'*Pk_1*(A-B*K)+Q;   
            Vk=(A-B*K)'*Vk_1 - K'*R*RefTraj_delta(j-1); 
        end
        
         u_feedBackward = -K*(Delta_x)-Ku*u_feedForward-Kv*Vk_1;  
        
        FWA(i+1,1)=u_feedForward+u_feedBackward;
        
         [x_real(1,i+1),x_real(2,i+1),x_real(3,i+1)]=Func_VehicleKineticModule_Euler(x_real(1,i),x_real(2,i),x_real(3,i),vel,FWA(i,1),FWA(i+1,1),T,L);  
         
        
    end
    
    %%   绘图
    %        figure(1);
    %     plot(RefTraj_x,RefTraj_y,'b')
    %     hold on;
        plot(x_real(1,:),x_real(2,:),'r*');
        title('跟踪结果对比');
        xlabel('横向位置X');
        % axis([-1 5 -1 3]);
        ylabel('纵向位置Y');  
    
    
    end

    还有4个子函数

    function K=Func_Alpha_Pos(Xb,Yb,Xn,Yn)
    AngleY=Yn-Yb;
    AngleX=Xn-Xb;
    %***求Angle*******%
    if Xb==Xn
        if Yn>Yb
            K=pi/2;
        else
            K=3*pi/2;
        end
    else
        if Yb==Yn
            if Xn>Xb
                K=0;
            else
                K=pi;
            end
        else
            K=atan(AngleY/AngleX);
        end    
    end
    %****修正K,使之在0~360°之间*****%
       if (AngleY>0&&AngleX>0)%第一象限
            K=K;
        elseif (AngleY>0&&AngleX<0)||(AngleY<0&&AngleX<0)%第二、三象限
            K=K+pi;
        else if (AngleY<0&&AngleX>0)%第四象限
                K=K+2*pi;  
            else
                K=K;
            end
        end
    end
    function Theta=Func_Theta_Pos(Alpha)
    
    if Alpha >= 3*pi/2
        Theta = Alpha-3*pi/2;
    else
        Theta = Alpha+pi/2;
    end
    
    end
    function [RefTraj_x,RefTraj_y,RefTraj_theta,RefTraj_delta]=Func_CircularReferenceTrajGenerate(Pos_x,Pos_y,CEN_x,CEN_y,Radius,N,Velo,Ts,L)
    %RefTraj为要生成的参考路径
    %Pos_x,Pos_y为车辆坐标
    %CEN_x,CEN_y,Radius圆心与半径
    %N要生成几个参考点,即预测空间。
    %Velo,Ts车速与采样时间
    %L汽车的轴距
    RefTraj=zeros(N,4);%生成的参考路径
    Alpha_init=Func_Alpha_Pos(CEN_x,CEN_y,Pos_x,Pos_y);%首先根据车辆位置和圆心确定alpha
    
    Omega=Velo/Radius%已知车速和半径,可以求得角速度。
    
    DFWA=atan(L/Radius);
    
    for k=1:1:N
        Alpha(k)=Alpha_init+Omega*Ts*(k-1);
        RefTraj(k,1)=Radius*cos(Alpha(k))+CEN_x;%x
        RefTraj(k,2)=Radius*sin(Alpha(k))+CEN_y;%y
        RefTraj(k,3)=Func_Theta_Pos(Alpha(k));%theta  
     
        RefTraj(k,4)=DFWA;%前轮偏角,可以当做前馈量
    
    end
    RefTraj_x= RefTraj(:,1);
    RefTraj_y= RefTraj(:,2);
    RefTraj_theta= RefTraj(:,3);
    RefTraj_delta= RefTraj(:,4);
    
    end
    function [X,Y,H]=Func_VehicleKineticModule_Euler(x,y,heading,vel,FWA,DFWA,T,L)
    %车辆运动学模型,状态量,x,y,heading;控制量:vel=constant,FWA
    %固定的步数,来求得数值解
    
    %%
    %initial the status of the vehicle
    num=100;
    Xmc=zeros(1,num);
    Ymc=zeros(1,num);
    Headingmc=zeros(1,num);
    Xmc(1)=x;
    Ymc(1)=y;%x,y初始坐标
    Headingmc(1)=heading;%航向,
    
    Headingrate=zeros(1,num);
    FrontWheelAngle=zeros(1,num);
    
    t=T/num;
    %%
    FrontWheelAngle=linspace(FWA,DFWA,num);%前轮偏角
    Headingrate=vel*tan(FrontWheelAngle)/L;
    for i=2:num
        Headingmc(i)=Headingmc(i-1)+Headingrate(i)*t;
        Xmc(i)=Xmc(i-1)+vel*t*cos(Headingmc(i-1));
        Ymc(i)=Ymc(i-1)+vel*t*sin(Headingmc(i-1));
    end
    %%
        X=Xmc(num);
        Y=Ymc(num);
        H=Headingmc(num);
    end
    
    %% test
    % [X,Y,H]=VehicleKineticModule_Euler(0,0,0,10,0,3,0.1,2.85)
    %plot(X,Y,'b');
    

    现在再看看MPC的代码实现

    clc;
    close all;
    clear all;
    %% 参考轨迹生成
    N=100;%参考轨迹点数量
    T=0.05;%采样时间,控制周期
    % Xout=zeros(2*N,3);
    % Tout=zeros(2*N,1);
    Xout=zeros(N,3);
    Tout=zeros(N,1);
    for k=1:1:N
        Xout(k,1)=k*T;
        Xout(k,2)=2;
        Xout(k,3)=0;
        Tout(k,1)=(k-1)*T;
    end
    
    %% Tracking a constant reference trajectory
    Nx=3;%状态量个数
    Nu =2;%控制量个数
    Tsim =20;%仿真时间
    X0 = [0 0 pi/3];%初始状态
    [Nr,Nc] = size(Xout); % Nr is the number of rows of Xout,100*3
    % Mobile Robot Parameters
    c = [1 0 0 0;0 1 0 0;0 0 1 0;0 0 0 1];
    L = 1;%车辆轴距
    Rr = 1;
    w = 1;
    % Mobile Robot variable Model
    vd1 = Rr*w; % For circular trajectory,参考系统的纵向速度
    vd2 = 0;%参考系统的前轮偏角
    
    %根据控制系统的维度信息,提前定义好相关矩阵并赋值
    x_real=zeros(Nr,Nc);%X的真实状态
    x_piao=zeros(Nr,Nc);%X的误差状态
    u_real=zeros(Nr,2);%真实控制量
    u_piao=zeros(Nr,2);%误差控制量
    x_real(1,:)=X0;%初始状态
    x_piao(1,:)=x_real(1,:)-Xout(1,:);%与预期的误差值
    X_PIAO=zeros(Nr,Nx*Tsim);
    XXX=zeros(Nr,Nx*Tsim);%用于保持每个时刻预测的所有状态值
    q=[1 0 0;0 1 0;0 0 0.5];
    Q_cell=cell(Tsim,Tsim);
    for i=1:1:Tsim
        for j=1:1:Tsim
            if i==j
                Q_cell{i,j}=q;
            else 
                Q_cell{i,j}=zeros(Nx,Nx);
            end 
        end
    end
    Q=cell2mat(Q_cell);%权重矩阵
    R=0.1*eye(Nu*Tsim,Nu*Tsim);%权重矩阵
    
    %模型预测控制主体
    for i=1:1:Nr
        t_d =Xout(i,3);
        a=[1    0   -vd1*sin(t_d)*T;
           0    1   vd1*cos(t_d)*T;
           0    0   1;];
        b=[cos(t_d)*T   0;
           sin(t_d)*T   0;
           0            T;];     
        A_cell=cell(Tsim,1);
        B_cell=cell(Tsim,Tsim);
         for j=1:1:Tsim
            A_cell{j,1}=a^j;
            for k=1:1:Tsim
               if k<=j
                    B_cell{j,k}=(a^(j-k))*b;
               else
                    B_cell{j,k}=zeros(Nx,Nu);
               end
            end
        end
        A=cell2mat(A_cell);
        B=cell2mat(B_cell);
        
        H=2*(B'*Q*B+R);
        f=2*B'*Q*A*x_piao(i,:)';
        A_cons=[];
        b_cons=[];
        lb=[-1;-1];
        ub=[1;1];
        tic
        [X,fval(i,1),exitflag(i,1),output(i,1)]=quadprog(H,f,A_cons,b_cons,[],[],lb,ub);%二次规划求解
        toc
        X_PIAO(i,:)=(A*x_piao(i,:)'+B*X)';
        if i+j<Nr
             for j=1:1:Tsim
                 XXX(i,1+3*(j-1))=X_PIAO(i,1+3*(j-1))+Xout(i+j,1);
                 XXX(i,2+3*(j-1))=X_PIAO(i,2+3*(j-1))+Xout(i+j,2);
                 XXX(i,3+3*(j-1))=X_PIAO(i,3+3*(j-1))+Xout(i+j,3);
             end
        else
             for j=1:1:Tsim
                 XXX(i,1+3*(j-1))=X_PIAO(i,1+3*(j-1))+Xout(Nr,1);
                 XXX(i,2+3*(j-1))=X_PIAO(i,2+3*(j-1))+Xout(Nr,2);
                 XXX(i,3+3*(j-1))=X_PIAO(i,3+3*(j-1))+Xout(Nr,3);
             end
        end
        u_piao(i,1)=X(1,1);
        u_piao(i,2)=X(2,1);
        Tvec=[0:0.05:4];
        X00=x_real(i,:);
        vd11=vd1+u_piao(i,1);
        vd22=vd2+u_piao(i,2);
        XOUT=dsolve('Dx-vd11*cos(z)=0','Dy-vd11*sin(z)=0','Dz-vd22=0','x(0)=X00(1)','y(0)=X00(2)','z(0)=X00(3)');
         t=T; 
         x_real(i+1,1)=eval(XOUT.x);
         x_real(i+1,2)=eval(XOUT.y);
         x_real(i+1,3)=eval(XOUT.z);
         if(i<Nr)
             x_piao(i+1,:)=x_real(i+1,:)-Xout(i+1,:);
         end
        u_real(i,1)=vd1+u_piao(i,1);
        u_real(i,2)=vd2+u_piao(i,2);
        
        figure(1);
        plot(Xout(1:Nr,1),Xout(1:Nr,2));
        hold on;
        plot(x_real(i,1),x_real(i,2),'r*');
        title('跟踪结果对比');
        xlabel('横向位置X');
        axis([-1 5 -1 3]);
        ylabel('纵向位置Y');
        hold on;
        for k=1:1:Tsim
             X(i,k+1)=XXX(i,1+3*(k-1));
             Y(i,k+1)=XXX(i,2+3*(k-1));
        end
        X(i,1)=x_real(i,1);
        Y(i,1)=x_real(i,2);
        plot(X(i,:),Y(i,:),'y.')
        hold on;
        
    end
    % figure(5)
    % plot(X(2,:),Y(2,:),'b');
    %% 以下为绘图部分
    figure(2)
    subplot(3,1,1);
    plot(Tout(1:Nr),Xout(1:Nr,1),'k--');
    hold on;
    plot(Tout(1:Nr),x_real(1:Nr,1),'k');
    %grid on;
    %title('状态量-横向坐标X对比');
    xlabel('采样时间T');
    ylabel('横向位置X')
    subplot(3,1,2);
    plot(Tout(1:Nr),Xout(1:Nr,2),'k--');
    hold on;
    plot(Tout(1:Nr),x_real(1:Nr,2),'k');
    %grid on;
    %title('状态量-横向坐标Y对比');
    xlabel('采样时间T');
    ylabel('纵向位置Y')
    subplot(3,1,3);
    plot(Tout(1:Nr),Xout(1:Nr,3),'k--');
    hold on;
    plot(Tout(1:Nr),x_real(1:Nr,3),'k');
    %grid on;
    hold on;
    %title('状态量-\theta对比');
    xlabel('采样时间T');
    ylabel('\theta')
    
    figure(3)
    subplot(2,1,1);
    plot(Tout(1:Nr),u_real(1:Nr,1),'k');
    %grid on;
    %title('控制量-纵向速度v对比');
    xlabel('采样时间T');
    ylabel('纵向速度')
    subplot(2,1,2)
    plot(Tout(1:Nr),u_real(1:Nr,2),'k');
    %grid on;
    %title('控制量-角加速度对比');
    xlabel('采样时间T');
    ylabel('角加速度')
    
    figure(4)
    subplot(3,1,1);
    plot(Tout(1:Nr),x_piao(1:Nr,1),'k');
    %grid on;
    xlabel('采样时间T');
    ylabel('e(x)');
    subplot(3,1,2);
    plot(Tout(1:Nr),x_piao(1:Nr,2),'k');
    %grid on;
    xlabel('采样时间T');
    ylabel('e(y)');
    subplot(3,1,3);
    plot(Tout(1:Nr),x_piao(1:Nr,3),'k');
    %grid on;
    xlabel('采样时间T');
    ylabel('e(\theta)');

    添加了一些注释,但是感觉这个代码写的不是很好。

    下次看到好的MPC代码我会放上来。

    展开全文
  • 详解遗传算法(含MATLAB代码

    万次阅读 多人点赞 2019-05-29 11:30:47
    目录 一、遗传算法概述 二、遗传算法的特点和应用 三、遗传算法的基本流程及实现技术 3.1 遗传算法的基本流程 3.2 遗传算法的实现技术 ...五、遗传算法编程实例(MATLAB) 一、遗传算法概述 遗传算法(...

    目录

    一、遗传算法概述

    二、遗传算法的特点和应用

    三、遗传算法的基本流程及实现技术

    3.1 遗传算法的基本流程

    3.2 遗传算法的实现技术

    1.编码

    2.适应度函数

    3.选择算子

    4.交叉算子

    5.变异算子

    6.运行参数

    四、遗传算法的基本原理

    4.1 模式定理

    4.2 积木块假设

    五、遗传算法编程实例(MATLAB)


    一、遗传算法概述

            遗传算法(Genetic Algorithm,GA)是进化计算的一部分,是模拟达尔文的遗传选择和自然淘汰的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法。该算法简单、通用,鲁棒性强,适于并行处理。

    二、遗传算法的特点和应用

       遗传算法是一类可用于复杂系统优化的具有鲁棒性的搜索算法,与传统的优化算法相比,具有以下特点:

    1. 以决策变量的编码作为运算对象。

        传统的优化算法往往直接利用决策变量的实际值本身来进行优化计算,但遗传算法是使用决策变量的某种形式的编码作为运算对象。这种对决策变量的编码处理方式,使得我们在优化计算中可借鉴生物学中染色体和基因等概念,可以模仿自然界中生物的遗传和进化激励,也可以很方便地应用遗传操作算子。

    2. 直接以适应度作为搜索信息。

        传统的优化算法不仅需要利用目标函数值,而且搜索过程往往受目标函数的连续性约束,有可能还需要满足“目标函数的导数必须存在”的要求以确定搜索方向。

        遗传算法仅使用由目标函数值变换来的适应度函数值就可确定进一步的搜索范围,无需目标函数的导数值等其他辅助信息。直接利用目标函数值或个体适应度值也可以将搜索范围集中到适应度较高部分的搜索空间中,从而提高搜索效率。

    3. 使用多个点的搜索信息,具有隐含并行性

        传统的优化算法往往是从解空间的一个初始点开始最优解的迭代搜索过程。单个点所提供的搜索信息不多,所以搜索效率不高,还有可能陷入局部最优解而停滞;

        遗传算法从由很多个体组成的初始种群开始最优解的搜索过程,而不是从单个个体开始搜索。对初始群体进行的、选择、交叉、变异等运算,产生出新一代群体,其中包括了许多群体信息。这些信息可以避免搜索一些不必要的点,从而避免陷入局部最优,逐步逼近全局最优解。

    4. 使用概率搜索而非确定性规则。

       传统的优化算法往往使用确定性的搜索方法,一个搜索点到另一个搜索点的转移有确定的转移方向和转移关系,这种确定性可能使得搜索达不到最优店,限制了算法的应用范围。

       遗传算法是一种自适应搜索技术,其选择、交叉、变异等运算都是以一种概率方式进行的,增加了搜索过程的灵活性,而且能以较大概率收敛于最优解,具有较好的全局优化求解能力。但,交叉概率、变异概率等参数也会影响算法的搜索结果和搜索效率,所以如何选择遗传算法的参数在其应用中是一个比较重要的问题

    综上,由于遗传算法的整体搜索策略和优化搜索方式在计算时不依赖于梯度信息或其他辅助知识,只需要求解影响搜索方向的目标函数和相应的适应度函数,所以遗传算法提供了一种求解复杂系统问题的通用框架。它不依赖于问题的具体领域,对问题的种类有很强的鲁棒性,所以广泛应用于各种领域,包括:

    • 函数优化
    • 组合优化生产调度问题
    • 自动控制
    • 机器人学
    • 图像处理(图像恢复、图像边缘特征提取......)
    • 人工生命
    • 遗传编程
    • 机器学习

    三、遗传算法的基本流程及实现技术

       基本遗传算法(Simple Genetic Algorithms,SGA)只使用选择算子、交叉算子和变异算子这三种遗传算子,进化过程简单,是其他遗传算法的基础。

    3.1 遗传算法的基本流程

    1.  通过随机方式产生若干由确定长度(长度与待求解问题的精度有关)编码的初始群体;
    2. 通过适应度函数对每个个体进行评价,选择适应度值高的个体参与遗传操作,适应度低的个体被淘汰;
    3. 经遗传操作(复制、交叉、变异)的个体集合形成新一代种群,直到满足停止准则(进化代数GEN>=?);
    4. 将后代中变现最好的个体作为遗传算法的执行结果。

                                                       

    其中,GEN是当前代数;M是种群规模,i代表种群数量。

    3.2 遗传算法的实现技术

    基本遗传算法(SGA)由编码、适应度函数、遗传算子(选择、交叉、变异)及运行参数组成。

    1.编码

    (1)二进制编码

    二进制编码的字符串长度与问题所求解的精度有关。需要保证所求解空间内的每一个个体都可以被编码。

    优点:编、解码操作简单,遗传、交叉便于实现

    缺点:长度大

    (2)其他编码方法

    格雷码、浮点数编码、符号编码、多参数编码等

    2.适应度函数

    适应度函数要有效反映每一个染色体与问题的最优解染色体之间的差距。

    3.选择算子

    通过选择算子模拟“优胜劣汰”,适应度高的个体被遗传到下一代的概率较大,适应度低的算子被遗传到下一代的概率较小。

    常用的选择算法:轮盘赌选择法,即令\sum f_i表示群体的适应度函数值的总和,f_i表示群体中第i个染色体的适应度值,则它产生后代的能力刚好为其适应度值所占的份额\frac{f_i}{\sum f_i}

    4.交叉算子

    • 交叉运算是指对两个相互配对的染色体按某种方式相互交换其部分基因,从而形成两个新的个体;
    • 交叉运算是遗传算法区别于其他进化算法的重要特征,是产生新个体的主要方法。

    在交叉之前需要将群体中的个体进行配对,一般采取随机配对原则。

    常用的交叉方式:

    • 单点交叉
    • 双点交叉(多点交叉,交叉点数越多,个体的结构被破坏的可能性越大,一般不采用多点交叉的方式)
    • 均匀交叉
    • 算术交叉

    5.变异算子

    遗传算法中的变异运算是指将个体染色体编码串中的某些基因座上的基因值用该基因座的其他等位基因来替换,从而形成一个新的个体。

    就遗传算法运算过程中产生新个体的能力方面来说,交叉运算是产生新个体的主要方法,它决定了遗传算法的全局搜索能力;而变异运算只是产生新个体的辅助方法,但也是必不可少的一个运算步骤,它决定了遗传算法的局部搜索能力。交叉算子与变异算子的共同配合完成了其对搜索空间的全局搜索和局部搜索,从而使遗传算法能以良好的搜索性能完成最优化问题的寻优过程。

    6.运行参数

    • 编码长度。编码长度取决于问题解的精度,精度越高,编码越长;
    • 种群规模。规模小,收敛快但降低了种群的多样性,N=20-200
    • 交叉概率。较大的交叉概率容易破坏种群中已形成的优良结构,使搜索具有太大随机性;较小的交叉概率发现新个体的速度太慢,一般取值为P_c=0.4-0.99
    • 变异概率。变异概率太小,则变异操作产生新个体的能力和抑制早熟现象的能力会较差;变异概率过高随机性过大,一般建议取值范围为0.005~0.01
    • 终止进化代数。算法运行结束的条件之一,一般取100~1000

    四、遗传算法的基本原理

    4.1 模式定理

    定义1:模式H是由{0,1,*}中的元素组成的一个编码串,其中“*”表示通配符,既能被当作0,也能被当作1。e.g. H=10**1

    定义2:模式的阶,是指模式中所含有0,1的数量,记作O(H)  e.g. O(11*00**)=4

    定义3:模式的矩,即模式的长度,是指模式中从左到右第一个非*位和最后一个非*位之间的距离,记作\delta (H)

              e.g. \delta (01**1)=3;\delta (**0*1)=2;\delta (***1**)=1

    定义4:模式的适应度值,是群体中所包含的全部个体的适应度值的平均值。

    定义5:在选择、交叉、变异遗传算子的作用下,低阶、长度短、超过群体平均适应值的模式的生存数量,将随迭代次数以指数规律增长。

    模式定理不仅说明基因块的样本呈指数增长,也说明用遗传算法寻求最优样本的可能性,但它并未指出遗传算法一定能够寻求到最优解,积木块假设说明了遗传算法的寻找最优解的能力。

    4.2 积木块假设

    具有低阶、定义长度短,且适应度值高于群体平均适应度值的模式称为基因块或积木块。

    积木块假设:个体的基因块通过选择、交叉、变异等遗传算子的作用,能够相互拼接在一起,形成适应度更高的个体编码串。

    积木块假设说明了用遗传算法求解各类问题的基本思想,即通过积木块直接相互拼接在一起能够产生更好的解。

    五、遗传算法编程实例(MATLAB)

    https://github.com/strawberry-magic-pocket/Genetic-Algorithm.git

     

    展开全文
  • MATLAB/matlab代码转化为python代码

    千次阅读 2020-12-23 19:17:40
    MATLAB/matlab代码转化为python代码 方案1:使用smop 下载:https://pypi.org/project/smop/0.26.2/ 转化效果 MATLAB代码 % matlab to python clc;clear;close all; varX = 1:1:200; Y = sin(2*pi*0.01*varX); ...

    MATLAB/matlab代码转化为python代码

    方案1:使用smop

    下载:https://pypi.org/project/smop/0.26.2/
    转化效果
    MATLAB代码

    % matlab to python
    clc;clear;close all;
    varX = 1:1:200;
    Y = sin(2*pi*0.01*varX);
    figure;
    plot(varX,Y);
    title('matlab to python');
    xlabel('x');
    ylabel('y');
    

    Python代码

    # Generated with SMOP  0.41
    from libsmop import *
    # matlab.m
    
        # matlab to python
        clc
        clear
        close_('all')
        varX=arange(1,200,1)
    # matlab.m:3
        Y=sin(dot(dot(dot(2,pi),0.01),varX))
    # matlab.m:4
        figure
        plot(varX,Y)
        title('matlab to python')
        xlabel('x')
        ylabel('y')
    

    转化完基本不能使用,还得一块块的修改
    评价:不中

    2. 其他方案

    还有其他的尝试方案(没有试过,不想折腾了):

    There are several tools for converting Matlab to Python code.
    
    The only one that's seen recent activity (last commit from June 2018) is Small Matlab to Python compiler (also developed here: SMOP@chiselapp).
    
    Other options include:
    
    LiberMate: translate from Matlab to Python and SciPy (Requires Python 2, last update 4 years ago).
    OMPC: Matlab to Python (a bit outdated).
    Also, for those interested in an interface between the two languages and not conversion:
    
    pymatlab: communicate from Python by sending data to the MATLAB workspace, operating on them with scripts and pulling back the resulting data.
    Python-Matlab wormholes: both directions of interaction supported.
    Python-Matlab bridge: use Matlab from within Python, offers matlab_magic for iPython, to execute normal matlab code from within ipython.
    PyMat: Control Matlab session from Python.
    pymat2: continuation of the seemingly abandoned PyMat.
    mlabwrap, mlabwrap-purepy: make Matlab look like Python library (based on PyMat).
    oct2py: run GNU Octave commands from within Python.
    pymex: Embeds the Python Interpreter in Matlab, also on File Exchange.
    matpy: Access MATLAB in various ways: create variables, access .mat files, direct interface to MATLAB engine (requires MATLAB be installed).
    MatPy: Python package for numerical linear algebra and plotting with a MatLab-like interface.
    Btw might be helpful to look here for other migration tips:
    
    http://bci2000.org/downloads/BCPy2000/Migration.html
    On a different note, though I'm not a fortran fan at all, for people who might find it useful there is:
    
    matlab2fortran
    

    参考https://www.it1352.com/1601186.html

    3. matlab迁移到python避坑

    https://zhuanlan.zhihu.com/p/142516585

    展开全文
  • 遗传算法 求解旅行商 TSP 问题,matlab代码

    万次阅读 多人点赞 2016-11-02 01:24:11
    上课时,老师不知从哪里找了一个非常粗糙的程序,自己将不少错误修正,增加了一些注释方便理解,并增加了一些代码使程序更完美。该代码可以动态显示每一代的路线,非常直观!(备注:对于一般的 ...
  • 随机森林matlab代码

    千次下载 热门讨论 2013-07-02 17:27:31
    随机森林matlab代码,可运行。可用于分类和回归。
  • MATLAB 代码转为python代码

    千次阅读 2020-08-25 17:43:27
    MATLAB 代码转为python代码 import numpy as np import itertools 1、二维的零矩阵,全一矩阵 双层括号 np.zeros((col,row)) 2、cell数组 np.empty((col,row),dtype=object) ...matlab代码用法 https://blog.c
  • MATLAB Coder可以从MATLAB代码生成独立的、可读性强、可移植的C/C++代码。本文基于matlab2015a编制,但是也适用于matlab 2014~2016的版本。 1. 使用MATLAB Coder产生C代码的4个步骤: (1) 开发实现特定算法功能的...
  • Matlab:序列分析法MATLAB代码

    万次阅读 2018-05-20 10:33:14
    Matlab:序列分析法MATLAB代码 目录 输出结果 设计代码 输出结果 更新…… 设计代码 ###下面所有带代码中的n值需要以自己输入的数据为准### 1、简单一次滑动平均法预测MATLAB程序代码 y=[_...
  • Poisson image editing算法实现的Matlab代码解析

    万次阅读 多人点赞 2016-01-29 14:00:25
    这应该算是我这个系列的完结篇,会用用Matlab代码一点一点的演示,原文作者到底是如何设计和实现他那个强大且影响深远的算法的。希望你在看本文之前务必参考一下文章来了解算法原理,本文将主要讲解编程实现的问题,...
  • DBSCAN聚类算法matlab代码

    热门讨论 2017-03-22 01:34:59
    DBSCAN聚类算法matlab代码,内包含测试数据,下载可以直接运行。
  • 基于MATLAB Coder将matlab代码转换成C代码 官网视频讲解 matlab调用c/c++代码 特此感谢! 一、概念及开发流程 MATLAB Coder可以从MATLAB代码生成独立的、可读性强、可移植的C/C++代码。 通俗地说,就是将写好的ma.....
  • matlab代码转换成C代码

    万次阅读 2018-11-29 22:47:15
    MATLAB Coder可以从MATLAB代码生成独立的、可读性强、可移植的C/C++代码。本文基于matlab2015a编制,但是也适用于matlab 2014~2016的版本。 1. 使用MATLAB Coder产生C代码的4个步骤: (1) 开发实现特定算法功能的...
  • logistic模型MATLAB代码

    万次阅读 2019-08-03 09:41:39
    logistic模型MATLAB代码 先来一个简单MATLAB代码说明logistic模型: clear all;clc;x=0:1:12; y=[43.65 109.86 187.21 312.67 496.58 707.65 960.25 1238.75 1560.00 1824.29 2199.00 2438.89 2737....
  • AdaBoost等MatLab代码(带测试数据)

    千次下载 热门讨论 2013-06-09 20:26:32
    本人研究生阶段写文档所写的Matlab代码。 包括: 1、图片预处理; 2、特性提取:颜色、灰度共生矩阵、灰度差分、Harr-Like、等多个特征提取算法; 3、特性选择:从特征向量中选取有效的特性; 4、基础算法:...
  • Python调用Matlab代码

    千次阅读 2017-08-25 09:51:27
    Python调用Matlab代码 参考文献 [1]Python调用Matlab代码(matlab官网)
  • MATLAB Coder 可以将 MATLAB 代码生成独立的、可读性强、可...检查MATLAB代码的兼容性(有些matlab代码语句并不能生成c/c++代码);产生最终使用的源代码或 MEX。 一个简单的例子,两数相乘: 1、安装 matlab2011a 或者
  • 服务器运行matlab代码

    2020-04-28 21:13:02
    远程服务器运行matlab代码 上传本地写好的代码,用Filezilla传到服务器数据对应的位置 putty登录服务器,进入到对应文件夹下,输入matlab,然后直接在命令行输入代码名,即可运行 用到的参考 ...
  • 元胞自动机交通流模型代码(matlab代码

    千次下载 热门讨论 2015-01-09 13:39:13
    元胞自动机交通流模型matlab代码,双车道模型,靠右行驶模型,代码很容易修改成其他相关模型。
  • 广义贝塞尔曲线Matlab代码

    千次阅读 2020-12-01 19:45:34
    是的,人们用Matlab代码编写了n个点,此程序将绘制任意数量的点的Bezier曲线,无论是2点还是3点,甚至100点或更多点... 1)首先输入no。程序询问时的点数 2)选择是否要单击或以矩阵形式通过键盘输入所有x&y坐标 3...
  • 灰色预测模型介绍及MATLAB代码实现

    万次阅读 多人点赞 2019-08-18 09:31:30
    matlab代码5. 实验数据5.1. 测试一5.2. 测试二 1. 按 灰色预测模型\color{red}灰色预测模型灰色预测模型(Gray Forecast Model)是一种基于小样本数据进行预测的模型。灰色预测模型所需建模信息少,运算方便,建模...
  • 鸢尾花分类matlab代码

    千次阅读 多人点赞 2020-03-01 20:16:06
    鸢尾花分类matlab代码 本文是基于matlab平台的libsvm工具箱进行的,是羊同学的练手做,代码编写不太仔细,欢迎大家斧正。 一、Iris数据集介绍 Iris 鸢尾花数据集是一个经典数据集,在统计学习和机器学习领域都经常...
  • 关于Critic确定权重的matlab代码和python代码

    千次阅读 热门讨论 2020-06-27 22:59:04
    关于Critic确定权重的matlab代码和python代码: 观察到关于Critic确定权重的相关知识比较少,笔者写了一点自己的理解,如果有不对的地方还请指教!另外文章最后给出我自己写的matlab代码和python代码! 本文采用...
  • 相关系数matlab代码

    千次阅读 2018-12-30 11:28:47
    %matlab代码 function CC=cc(T1,T2) %T1,T2是图片 T1=T1(:); T2=T2(:); T1=double(T1); T2=double(T2); A=cov(T1,T2); b=sqrt(var(T1)*var(T2)); CC=A(1,2)/b; end 这是测试用图 这是测试例程 %matlab代码 T1=...
  • BP神经网络matlab代码

    千次阅读 多人点赞 2020-08-31 19:15:56
    BP神经网络matlab代码 %%随机权重→前向计算→误差→权重更新,再来一遍→达到误差限,停止 %% 初始化 clear close all clc %% 读取数据 input=rand(2,200); output=input(1,:).*input(2,:); %% 训练集、测试集 ...
  • SVM实例及Matlab代码

    千次阅读 2018-05-16 20:28:47
    SVM实例及Matlab代码SVM的matlab代码及SVM的多分类的作法从文件中导入数据。&gt;&gt; imported_data = importdata('matlab.mat')&gt;&gt; load('matlab.mat')
  • 粒子群算法求解约束多目标优化万能matlab代码

    千次下载 热门讨论 2013-07-02 16:10:16
    粒子群算法 约束多目标 优化 matlab代码
  • matlab编写好了,但是对应的C语言代码不知如何去写。比如编写好了神经网络代码...MATLAB Coder可以从MATLAB代码生成独立的、可读性强、可移植的C/C++代码。 MATLAB可以转化为C/C++,C/C++也可以转化为MATLAB语言(...
  • 粒子滤波Matlab代码

    千次阅读 2015-08-13 11:09:39
    粒子滤波Matlab代码,很详实。看完秒懂! 本文地址:http://blog.csdn.net/shanglianlm/article/details/47445909

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 51,428
精华内容 20,571
关键字:

matlab代码

matlab 订阅