2017-02-24 13 views
2

로보트 구조의 오일러 - 라그랑지 방정식을 계산하려고합니다. 을 사용하여 공동 변수의 벡터를 나타냅니다. 내 코드에서 오일러 - 라그랑주 (Euler-Lagrange) 방정식을 사용한 기호의 차별화

, 나는 q1q2 시간 t에 따라 그 선언
syms t; 
q1 = sym('q1(t)'); 
q2 = sym('q2(t)'); 
q = [q1, q2]; 

를 사용합니다. 내가 계산 한 후 라그랑 L

L = (I1z*diff(q1(t), t)^2)/2 + (L1^2*M1*diff(q1(t), t)^2)/8 

문제는 내가 diff(L, q)를 사용하여 qL 존경을 구별 할 때, 나는이 오류가 있다는 것입니다 (이 경우에는이 rotoidal 공동 간단한 링크입니다)

sym/diff (줄 69)를 사용하는 중 오류
두 번째 인수는 차등 수를 지정하는 변수 또는 음수가 아닌 정수 여야합니다.

가 어떻게 qL 존중 오일러 - 라그랑 지 방정식의 첫 번째 항을 가지고 구별 할 수 있습니까? 내가 '무엇 그것은 즉, 분명 나에게 [0, 0]


를 제공합니다


나는 단순히 시간 의존성이없는

syms q1 q2 
q = [q1 q2] 

q를 작성하는 시도했지만 차별화가 작동하지 않습니다 (I1z는 z 축에 대한 링크의 관성이고, M1은 링크의 질량, L1은 링크의 길이 임) 당신은 전체 코드를 실행하려면

q = [q1(t), q2(t)] 
diff(q, t) = [diff(q1(t), t), diff(q2(t), t)] 
L = (I1z*diff(q1(t), t)^2)/2 + (L1^2*M1*diff(q1(t), t)^2)/8 

, 당신은 here에서 모든하는 .m 파일을 다운로드 한 후

[t, q, L, M, I] = initiate(); 
L = lagrangian(odof(q, L), q, M, I, t, 1) 

그렇지 않으면 다음 코드는 동일해야 사용해야합니다. AVK's answer

syms t I1z L1 M1 
q1 = sym('q1(t)'); 
q2 = sym('q2(t)'); 
q = [q1, q2]; 
qp = diff(q, t); 
L = (I1z*qp(1)^2)/2 + (L1^2*M1*qp(1)^2)/8; 

편집

덕분에 나는이 문제를 깨달았다.

예 1 (AVK의 코드)

syms t q1 q2 q1t q2t I1z L1 M1  % variables 
L = (I1z*q1t^2)/2 + (L1^2*M1*q1t^2)/8 
dLdqt = [diff(L,q1t), diff(L,q2t)] 

이 작동하며, 그 결과가있을 것입니다

dLdqt = [(M1*q1t*L1^2)/4 + I1z*q1t, 0]

예 2 (잘못된)

syms t q1 q2 q1t q2t I1z L1 M1 
L = (I1z*q1t^2)/2 + (L1^2*M1*q1t^2)/8; 
qt = [q1t q2t]; 
dLdqt = diff(L, qt) 

이 것 하지이므로 작업 73,210이 기대 분화 단일 변수

실시 예 3 (우)

syms t q1 q2 q1t q2t I1z L1 M1 
L = (I1z*q1t^2)/2 + (L1^2*M1*q1t^2)/8; 
qt = [q1t q2t]; 
dLdqt = jacobian(L, qt) 

작업 jacobian 기대 때문 적어도 분화 가변


EDIT 2

에 대해 MATLAB의 Symbolit Toolbox가 차별화를 처리 할 수 ​​없으므로 변수q을 사용해야합니다. 변수

qv = [q1, q2, q3, q4, q5, q6]; 
qvp = [q1p, q2p, q3p, q4p, q5p, q6p]; 

되도록 이들을 사용

로서 기능

q = [q1(t), q2(t), q3(t), q4(t), q5(t), q6(t)] 
qp = [diff(q1(t), t), diff(q2(t), t), diff(q3(t), t), diff(q4(t), t), diff(q5(t), t), diff(q6(t), t)] 

이러한 문제를 해결했다. 이 질문에 대한 L을 구분하려면

전체 코드의 뜻이

syms q1 q2 q3 q4 q5 q6; 
syms q1p q2p q3p q4p q5p q6p; 
qv = [q1, q2, q3, q4, q5, q6]; 
qvp = [q1p, q2p, q3p, q4p, q5p, q6p]; 

Lagv = subs(Lag, [q, qp], [qv, qvp]); 
dLdq = jacobian(Lagv, qv); 
dLdqp = jacobian(Lagv, qvp); 

dLdq = subs(dLdq, [qv, qvp], [q, qp]); 
dLdqp = subs(dLdqp, [qv, qvp], [q, qp]); 

m_eq = diff(dLdqp, t) - dLdq; 
+0

'I1z' 등은 정의되지 않습니다. 우리가 실행할 수있는 코드를 게시하십시오. –

+0

라그랑주 방정식에는 파생 상품의 두 가지 유형 (부분 및 전체)이 있습니다. 각 유형은 고유 한 방식으로 계산되어야합니다. 그 이유는 변수를 함수로 대체했기 때문입니다. Symbolic Math Toolbox는'q (t)'와 구분할 수 없으므로'q'는 변수 여야합니다. 그러나 나중에, 우리가 전체 미분을 계산할 필요가있을 때, 그것은't'의 함수 여야합니다. – AVK

+0

예, 문제는'q (t)'와 구별 할 수 없다는 것이 었습니다. 'q1'과'q1p'를 변수로 사용하고'subs'를 사용하면 문제가 해결됩니다. – igng

답변

1

처럼 보이는, q는 변수해야합니다. 당신은 함수로 대체 subs를 사용 ddt 나중에 계산할 수 있습니다

syms t q1 q2 q1t q2t I1z L1 M1  % variables 
L = (I1z*q1t^2)/2 + (L1^2*M1*q1t^2)/8 
dLdqt= [diff(L,q1t), diff(L,q2t)] 
dLdq = [diff(L,q1), diff(L,q2)] 
syms q1_f(t) q2_f(t) % functions 
q1t_f(t)= diff(q1_f,t) 
q2t_f(t)= diff(q2_f,t) 
    % replace the variables with the functions 
dLdq_f= subs(dLdq,{q1 q2 q1t q2t},{q1_f q2_f q1t_f q2t_f}) 
dLdqt_f= subs(dLdqt,{q1 q2 q1t q2t},{q1_f q2_f q1t_f q2t_f}) 
    % now we can solve the equation 
dsolve(diff(dLdqt_f,t)-dLdq_f==0)