2015-10-26 3 views
0

Я пытаюсь имитировать динамику вращения системы. Я проверяю свой код, чтобы убедиться, что он работает с использованием моделирования, но я никогда не восстанавливал параметры, которые я передал модели. Другими словами, я не могу переоценить параметры, которые я выбрал для модели.Не удается восстановить параметры модели с помощью ode45

Я использую MATLAB для этого и, в частности, ode45. Вот мой код:

% Load the input-output data 
[torque outputs] = DataLogs2(); 
u = torque; 

% using the simulation data 
Ixx = 1.00; 
Iyy = 2.00; 
Izz = 3.00; 

x0   = [0; 0; 0]; 
Ts   = .02; 
t   = 0:Ts:Ts * (length(u) - 1); 
[ T, x ] = ode45(@(t,x) rotationDyn(t, x, u(1+floor(t/Ts),:), Ixx, Iyy, Izz), t, x0); 

w   = x'; 
N   = length(w); 
q   = 1;   % a counter for the A and B matrices 

% The Algorithm 
for k=1:1:N 
    w_telda = [ 0  -w(3, k) w(2,k); ... 
        w(3,k)  0  -w(1,k); ... 
        -w(2,k) w(1,k)  0 ]; 

    if k == N  % to handle the problem of the last iteration 
     w_dash(:,k) = (-w(:,k))/Ts; 
    else 
     w_dash(:,k) = (w(:,k+1)-w(:,k))/Ts; 
    end 

    a   = kron(w_dash(:,k)', eye(3)) + kron(w(:,k)', w_telda); 
    A(q:q+2,:) = a;   % a 3N*9 matrix 
    B(q:q+2,:) = u(k,:)';  % a 3N*1 matrix % u(:,k) 

    q = q + 3; 
end 

% Forcing J to be diagonal. This is the case when we consider our quadcopter as two thin uniform 
% rods crossed at the origin with a point mass (motor) at the end of each. 
A_new     = [A(:, 1) A(:, 5) A(:, 9)]; 
vec_J_diag   = A_new\B; 
J_diag    = diag([vec_J_diag(1), vec_J_diag(2), vec_J_diag(3)]) 
eigenvalues_J_diag = eig(J_diag) 
error     = norm(A_new*vec_J_diag - B) 

где моя динамическая модель определяется как:

function [dw, y] = rotationDyn(t, w, tau, Ixx, Iyy, Izz, varargin) 

    % The output equation 
    y = [w(1); w(2); w(3)]; 

    % State equation 
    % dw = (I^-1)*(tau - cross(w, I*w)); 
    dw = [Ixx^-1 * tau(1) - ((Izz-Iyy)/Ixx)*w(2)*w(3); 
      Iyy^-1 * tau(2) - ((Ixx-Izz)/Iyy)*w(1)*w(3); 
      Izz^-1 * tau(3) - ((Iyy-Ixx)/Izz)*w(1)*w(2)]; 
    end 

Практически то, что этот код должен делать, чтобы вычислить собственные значения матрицы инерции, J, т.е. восстановить Ixx, Iyy и Izz, которые я передал модели в самом начале (1, 2 и 3), но все, что я получаю, является неправильным результатом.

Проблема с использованием ode45?

+0

Извините, что не зная, где проблема в точности, но я много дней искал ее без везения. –

+0

Пожалуйста, предоставьте некоторый тип вывода, чтобы мы могли лучше понять, что вы подразумеваете под «неправильными результатами». Возможно, сюжет результатов и сюжет (или описание) того, что вы думаете о нем. –

+0

@brian. Предварительно заданные значения трех инерций «Ixx, Iyy, Izz» равны 1.0, 2.0 и 3.0, но оценочные результаты, которые я получаю: [-2.855851586472459e-01, 2.086082382514133e-03, 6.027561523432094e-02], которые являются собственными значениями матрицы 'J_diag' выше в коде –

ответ

0

Ну проблема была не в ode45 инструкции, проблема заключается в том, что в идентификации системы можно создать n-1 образцов-сигнала из выборок сигнала n, таким образом, цикл должен закончиться в N-1 в приведенном выше код.