2017-02-14 14 views
1

のシンボリックツールボックス(R2016b、Windows)を使用して運動方程式を見つけた後、私は次のような形式がありますMATLAB、equationsToMatrixは非線形方程式

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

MbequationsToMatrixを使用していたが。

さて、私はコリオリと私は

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

を適用することができれば、それは非常に便利であるが、残念ながらそれはないでしょう

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

ような潜在的な用語にbを分離する必要がありますbが非線形である場合には、qdotを除外します。 Cは、ベクトルqdotをファクタリングした後であっても、qqdotの関数であることは気にしません(実際には必要です)。私は結果としてcoeffsfactorを試しました。

ありがとうございました。

+2

非線形は「行列で記述することはできません」を意味します。 MATLABのequationsToMatrix'では、「**線形方程式**を行列形式に変換する」 –

+0

私はこのようなコメントを引き付けると思っていましたが...ドキュメンテーションが何を言っているのか知っています。私が必要とすることをするための別の機能。また、それらは間違いなくマトリックスで記述することができます。行列はちょうどqdot項を持つようになります。 – abatea

+0

それで数値行列ではなく、その可変行列 –

答えて

2

少なくとも1つの回答がある可能性があるので、私自身のソリューションを投稿してください。 この機能はうまく機能しますが、それほどテストされていません。それは私が私の元の質問で示唆したのとまったく同じです。名前を変更して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 
関連する問題