2017-02-14 3 views
1

После нахождения уравнений движения с использованием символьной Toolbox (R2016b, Windows), у меня есть следующий вид:MATLAB, equationsToMatrix для нелинейных уравнений

M(q)*qddot = b(q,qdot) + u

M и b были найдены с помощью equationsToMatrix.

Теперь мне нужно отделить b в Кориолиса и потенциальных терминов, что

M(q)*qddot + C(q,qdot)*qdot + G(q) = u

Было бы очень удобно, если бы я мог применить

[C,G] = equationsToMatrix(b,qdot)

, но, к сожалению, не будет фактор qdot, когда b является нелинейным. Мне все равно (и на самом деле это необходимо), что C является функцией от q и qdot, даже после разворачивания вектора qdot. Я пробовал coeffs и factor без каких-либо результатов.

Спасибо.

+2

Вы не можете. Нелинейные средства «не могут быть описаны с помощью матрицы». MATLABs 'equationToMatrix' ясно говорит вам« Преобразовать набор ** линейных уравнений ** в матричную форму » –

+0

Я думал, что я бы привлек такой комментарий ... Я знаю, что говорит документация. Я ищу обходное решение или различная функция, чтобы делать то, что мне нужно. Кроме того, они определенно описываются с помощью матрицы; матрица просто заканчивается с qdot-членами. – abatea

+0

Тогда его не численная матрица, ее переменная матрица –

ответ

2

Публикация моего собственного решения, так что может быть хотя бы один ответ ... Эта функция работает, но она не подвергается серьезной проверке. Он работает точно так же, как я предложил в моем первоначальном вопросе. Не стесняйтесь переименовывать его, чтобы он не конфликтует с встроенным MATLAB.

function [A,b] = equationsToMatrix(eq, x) 
%EQUATIONSTOMATRIX equationsToMatrix for nonlinear equations 
% factors out the vector x from eq such that eq = Ax + b 
% eq does not need to be linear in x 
% eq must be a vector of equations, and x must be a vector of symbols 

assert(isa(eq,'sym'), 'Equations must be symbolic') 
assert(isa(x,'sym'), 'Vector x must be symbolic') 

n = numel(eq); 
m = numel(x); 

A = repmat(sym(0),n,m); 

for i = 1:n % loop through equations 
    [c,p] = coeffs(eq(i),x); % separate equation into coefficients and powers of x(1)...x(n) 
    for k = 1:numel(p) % loop through found powers/coefficients 
     for j = 1:m % loop through x(1)...x(n) 
      if has(p(k),x(j)) 
       % transfer term c(k)*p(k) into A, factoring out x(j) 
       A(i,j) = A(i,j) + c(k)*p(k)/x(j); 
       break % move on to next term c(k+1), p(k+1) 
      end 
     end 
    end 
end 

b = simplify(eq - A*x,'ignoreanalyticconstraints',true); % makes sure to fully cancel terms 

end