在Matlab中使用Opti-toolbox优化运动规律

时间:2015-12-12 19:39:01

标签: matlab optimization

我对使用Matlab中的Opti-toolbox进行理想运动定律的数值推导有疑问。

要遵循许多约束,但目标函数的主要原理如下:

Motion

  • 此功能是定期的,但仅使用1个句点。

  • 所有变量都是无量纲的,点数是n(这是一个奇数)。

  • 在0和1处,函数产生0。

  • 在中间,在(n + 1)/ 2处,该函数产生例如0.3。

  • 该功能需要在前半部分单调增加,在下半部分减少。

  • 速度需要介于-0.8和1之间。

  • 使用其他成本函数时,峰值加速度将受到限制。

我希望加速度的峰值尽可能低。之后这个成本函数将被更改。

我使用Opti-toolbox的尝试如下:

clear all
close all
%n is number of grid points, only odd numbers allowed!
n=11;
% parameters
tijd=[0:(1/(n-1)):1];
velmin=-0.8;
velmax=1;
accmax=100;
accmin=-100;
%First order derivative:
%Last value doesn't contribute, because function is periodic
%Implementation using FE: deltax=delta_i+1-delta_i-1/2*deltax
%With deltax=(1/(n-1))
    A_1=zeros(n-1,n);
    A_1(2:n-1,1:n-2)=A_1(2:n-1,1:n-2)-eye(n-2);
    A_1(1:n-2,2:n-1)=A_1(1:n-2,2:n-1)+eye(n-2);
    A_1(1,n-1)=-1;
    A_1(n-1,1)=1;
    A_1=A_1*(n-1)/2;
%Lower bound and upper bound + monotonically in and decreasing
    lb_111=0.1*ones((n-1)/2,1);
    ub_111=velmax*ones((n-1)/2,1);
    lb_112=velmin*ones((n-1)/2,1);
    ub_112=-0.1*ones((n-1)/2,1);
    ub_1=[ub_111; ub_112];
    lb_1=[lb_111; lb_112];

%2nd order derivative, same as before.
 A_12=zeros(n-1,n);
 A_12(2:n-1,1:n-2)=A_12(2:n-1,1:n-2)+eye(n-2);
  A_12(1:n-2,2:n-1)=A_12(1:n-2,2:n-1)+eye(n-2);
 A_12(1:n-1,1:n-1)=A_12(1:n-1,1:n-1)-2*eye(n-1);
 A_12(1,n-1)=1;
 A_12(n-1,1)=1;
 A_12=A_12*((n-1)^2);
 lb_12=accmin*ones(n-1,1);
 ub_12=accmax*ones(n-1,1);

 %First and last values are 0.
    A_2=zeros(2,n);
    A_2(1,1)=1;
    A_2(2,n)=1;
    lb_2=zeros(2,1);
    ub_2=zeros(2,1);

 %Middle value is known
 A_4=zeros(1,n);
 A_4(1,(n+1)/2)=1;
 lb_4=zeros(1,1);
 lb_4(1)=0.3;
 ub_4=zeros(1,1);
 ub_4(1)=0.3; 

%Main derivatives
%1st
    af_1=@(x) A_1*x;
%2nd
    af_2=@(x) A_12*x;

%Will be needed later, not relevant.   
%           a_3 = zeros(n-1,n);
%           a_3(1:(n-1)/2,(n+1)/2:n-1)=a_3(1:(n-1)/2,(n+1)/2:n-1)+eye((n-1)/2);
%           a_3((n+1)/2:n-1,1:(n-1)/2)=a_3((n+1)/2:n-1,1:(n-1)/2)+eye((n-1)/2);
%           a_fase=@(x) [a_3*x; x((n+1)/2)]; 

%Put all linear constraints together
    A = [A_4;A_1;A_12;A_2];
    lb = [lb_4;lb_1;lb_12;lb_2];
    ub = [ub_4;ub_1;ub_12;ub_2];
%Cost function
f = @(x) norm(af_2(x),inf);

%Non linear function later
%nlcon = @(x) [norm(g(x),inf)];
%cl = [-15];
%cu = [15];

%Estimate x0
temp = fliplr(tijd);
x_0 = [tijd(1:(n+1)/2) temp(((n+1)/2+1):end)];

%Options in solver
opts = optiset('solver','ipopt','display','iter');
Opt = opti('fun',f,'lin',A,lb,ub,'x0',x_0,'options',opts);
%Extract solution
delta1 = solve(Opt);
%delta2=a_fase(delta1);
vel1=af_1(delta1);
%vel2=af_1(delta2);
acc1=af_2(delta1);
%acc2=af_2(delta2);
%Tas=g(delta1);

%%%%%%%%%%%%%%%%
%PLOTS
%%%%%%%%%%%%%%%%
figure
subplot(2,2,1);
plot(tijd,delta1)
title('positie')
subplot(2,2,2);
plot(tijd,[vel1;vel1(1)])
title('snelheid')
subplot(2,2,3);
plot(tijd,[acc1;acc1(1)])
title('acceleratie')
subplot(2,2,4);
%plot(tijd,Tas)
title('Askoppel')

但这会产生不可行的问题。

有人知道我做错了吗?

见评论: 结果: Motion result

0 个答案:

没有答案