Desejo simular o comportamento de um sistema semelhante ao pêndulo duplo. O sistema é um manipulador de robôs de 2 graus de liberdade que não é acionado e, portanto, se comportará principalmente como um pêndulo duplo afetado pela gravidade. A única diferença principal com um pêndulo duplo é que ele é composto por dois corpos rígidos com propriedades de massa e inércia em seus centros de massa.
Basicamente, programei ode45
no Matlab para resolver um sistema de ODEs do seguinte tipo:
onde é o ângulo do primeiro corpo em relação à horizontal, é a velocidade angular do primeiro corpo; é o ângulo do segundo corpo em relação ao primeiro corpo e é a velocidade angular do segundo corpo. Todos os coeficientes são especificados no código a seguir, nas funções e que eu criei.rhs
fMass
clear all
opts= odeset('Mass',@fMass,'MStateDependence','strong','MassSingular','no','OutputFcn',@odeplot);
sol = ode45(@(t,x) rhs(t,x),[0 5],[pi/2 0 0 0],opts);
function F=rhs(t,x)
m=[1 1];
l=0.5;
a=[0.25 0.25];
g=9.81;
c1=cos(x(1));
s2=sin(x(3));
c12=cos(x(1)+x(3));
n1=m(2)*a(2)*l;
V1=-n1*s2*x(4)^2-2*n1*s2*x(2)*x(4);
V2=n1*s2*x(2)^2;
G1=m(1)*a(1)*g*c1+m(2)*g*(l*c1+a(2)*c12);
G2=m(2)*g*a(2)*c12;
F(1)=x(2);
F(2)=-V1-G1;
F(3)=x(4);
F(4)=-V2-G2;
F=F';
end
function M=fMass(t,x)
m=[1 1];
l=0.5;
Izz=[0.11 0.11];
a=[0.25 0.25];
c2=cos(x(3));
n1=m(2)*a(2)*l;
M11=m(1)*a(1)^2+Izz(1)+m(2)*(a(2)^2+l^2)+2*n1*c2+Izz(2);
M12=m(2)*a(2)^2+n1*c2+Izz(2);
M22=m(2)*a(2)^2+Izz(2);
M=[1 0 0 0;0 M11 0 M12;0 0 1 0;0 M12 0 M22];
end
Observe como eu defino a condição inicial de (ângulo do primeiro corpo em relação à horizontal) para que o sistema inicie na posição completamente vertical. Dessa forma, como apenas a gravidade está atuando, o resultado óbvio é que o sistema não deve se mover de nenhuma maneira a partir dessa posição.
NOTA: em todos os gráficos abaixo, plotei as soluções e com relação ao tempo.
ODE45
Quando executo a simulação por 6 segundos ode45
, obtenho a solução esperada sem problemas, o sistema permanece onde está e não se move:
No entanto, quando executo a simulação por 10 segundos, o sistema começa a se mover de maneira irracional:
ODE23
Em seguida, executei a simulação ode23
para ver se o problema persistia. Acabo com o mesmo comportamento, só que desta vez a divergência começa 1 segundo depois:
ODE15s
Em seguida, executei a simulação ode15s
para verificar se o problema persistia e não, o sistema parece estar estável mesmo durante 100 segundos:
Por outro lado, ode15s
é apenas de primeira ordem e observe que existem apenas algumas etapas de integração. Por isso, executei outra simulação ode15s
durante 10 segundos, mas com um MaxStep
tamanho de para aumentar a precisão e, infelizmente, isso leva ao mesmo resultado que com ambos e .ode45
ode23
Normalmente, o resultado óbvio dessas simulações seria que o sistema permanecesse em sua posição inicial, pois nada o perturba. Por que esta divergência está ocorrendo? Tem algo a ver com o fato de que esse tipo de sistema é de natureza caótica? Esse é um comportamento normal para ode
funções no Matlab?
fonte
x1
ex3
. (Insira um comentário seco sobre gráficos sem legendas ou descrições.) Tente plotar os logaritmos de (os valores absolutos de)x2
ex4
.Respostas:
Eu acho que os dois pontos principais já foram apresentados por Brian e Ertxiem: seu valor inicial é um equilíbrio instável e o fato de suas computações numéricas nunca serem realmente exatas fornece a pequena perturbação que fará com que a instabilidade entre em ação.
Para dar um pouco mais de detalhes de como isso ocorre, considere seu problema na forma de um problema geral de valor inicial
No seu código, você pode testar isso computando
o que dá 6.191e-16 - quase, mas não exatamente zero. Como isso afeta a dinâmica do seu sistema?
Além disso, em pouco tempo, a solução para o seu sistema se parece com a solução do sistema linearizado
rhs
Como não me incomodava em calcular o jacobiano manualmente, usei a diferenciação automática para obter uma boa aproximação:
para que sua equação se torne
Agora precisamos de um passo final: podemos calcular uma decomposição de autovalor do jacobiano de modo que
fonte
fonte
sin(0)
cos(0)
sin(pi/2)
cos(pi/2)
rhs(t,[0,0,0 0] == [0,0,0,0]
Veja os componentes das forças calculadas em suas funções.
fonte
A suposição inicial era de que a posição inicial estava em equilíbrio estável (isto é, no mínimo da energia potencial) com energia cinética zero e o sistema começou a se afastar do equilíbrio.
Como fisicamente isso não pode acontecer (se considerarmos a mecânica clássica), duas coisas vieram à minha mente:
A segunda é que talvez haja algo errado com as equações de movimento (talvez um erro de digitação em algum lugar?). Você pode escrever as equações explicitamente? Talvez você possa plotar a aceleração angular em função da posição inicial de cada pêndulo, assumindo velocidade angular zero para verificar se há algo estranho.
fonte
Você deve procurar mais sobre pêndulos duplos: eles são o que chamamos de "sistemas caóticos". Embora se comportem seguindo regras simples, a partir de condições iniciais ligeiramente diferentes, as soluções divergem rapidamente. Fazer simulações numéricas para esse tipo de sistema não é fácil. Dê uma olhada no vídeo a seguir para obter mais informações sobre o problema.
Para o pêndulo simples ou duplo, você pode escrever uma fórmula para a energia total do sistema. Assumindo que as forças de atrito são negligenciadas, essa energia total é preservada pelo sistema analítico. Numericamente, essa é uma questão totalmente diferente.
Antes de tentar o pêndulo duplo, tente o pêndulo simples. Você notará que, para os métodos de Runge-Kutta de pequena ordem, a energia do sistema aumentará nas simulações numéricas, em vez de permanecer constante (é o que acontece nas suas simulações: você obtém movimento do nada). Para evitar isso, métodos RK de ordem superior podem ser usados (ode45 é da ordem 4; RK da ordem 8 funcionaria melhor). Existem outros métodos chamados "métodos simpléticos" que são projetados de modo que as simulações numéricas conservem a energia. Em geral, você deve interromper a simulação assim que a energia aumentar significativamente em comparação com a sua inicialização.
E tente entender o pêndulo simples antes de ir para o duplo.
fonte
ode45