Por que a solução numérica de uma EDO se afasta de um equilíbrio instável?


15

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 ode45no Matlab para resolver um sistema de ODEs do seguinte tipo:

[10000M110M1200100M120M22][x˙1x˙2x˙3x˙4]=[x2V1G1x4V2G2]

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.x1x2x3x4rhsfMass

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.x1

NOTA: em todos os gráficos abaixo, plotei as soluções e com relação ao tempo.x1x3

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:

insira a descrição da imagem aqui

No entanto, quando executo a simulação por 10 segundos, o sistema começa a se mover de maneira irracional:

insira a descrição da imagem aqui

ODE23

Em seguida, executei a simulação ode23para ver se o problema persistia. Acabo com o mesmo comportamento, só que desta vez a divergência começa 1 segundo depois:

insira a descrição da imagem aqui

ODE15s

Em seguida, executei a simulação ode15spara verificar se o problema persistia e não, o sistema parece estar estável mesmo durante 100 segundos:

insira a descrição da imagem aqui

Por outro lado, ode15sé apenas de primeira ordem e observe que existem apenas algumas etapas de integração. Por isso, executei outra simulação ode15sdurante 10 segundos, mas com um MaxSteptamanho de para aumentar a precisão e, infelizmente, isso leva ao mesmo resultado que com ambos e .0,01ode45ode23

insira a descrição da imagem aqui

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 odefunções no Matlab?


Além das equações, acho que o esquema também ajudaria muito a entender a questão.
nicoguaro

Se você acha que é apropriado, você pode aceitar uma das respostas (existe um botão verde).
Ertxiem - restabelece Monica

Você não diz, mas parece estar tramando x1e x3. (Insira um comentário seco sobre gráficos sem legendas ou descrições.) Tente plotar os logaritmos de (os valores absolutos de) x2e x4.
Eric Towers

Respostas:


15

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

y˙(t)=M-1 1f(t,y(t))
y(t)=(x1 1(t),x2(t),x3(t),x4(t))

f(t,y(t))=[x2-V1 1-G1 1x4-V2-G2]

f(0 0,y0 0)=0 0y˙(0 0)=0 0f~

No seu código, você pode testar isso computando

norm(rhs(0,[pi/2 0 0 0]))

o que dá 6.191e-16 - quase, mas não exatamente zero. Como isso afeta a dinâmica do seu sistema?

fy0 0y~0 0

Além disso, em pouco tempo, a solução para o seu sistema se parece com a solução do sistema linearizado

y˙(t)=f(0 0,y0 0)+f(0 0,y0 0)(y(t)-y0 0)=f(0 0,y0 0)(y(t)-y0 0)

ffrhsy0 0d(t): =y(t)-y0 0d

d˙(t)=f(0 0,y0 0)d(t).

Como não me incomodava em calcular o jacobiano manualmente, usei a diferenciação automática para obter uma boa aproximação:

J: =f(0 0,y0 0)=[0 01 10 00 09,810 02,45250 00 00 00 01 12,45250 02,45250 0]

para que sua equação se torne

d˙(t)=Jd(t),d(0 0)=y~0 0-y0 0

Agora precisamos de um passo final: podemos calcular uma decomposição de autovalor do jacobiano de modo que

J=QDQ-1 1

DJQde(t): =Q-1 1d(t)

e˙(t)=De(t),e(0 0)=Q-1 1d0 0.

D

e˙Eu(t)=λEueEu(t),eEu(0 0)=Eu-th componente de Q-1 1d0 0

Eu=1 1,2,3,4λ1 1=3,2485

e1 1(t)=e1 1(0 0)e3,2485t.

d(0 0)=0 0e(0 0)=Q-1 1d(0 0)=0 0e1 1(0 0)=0 0e1 1(0 0)


16

π/2π/2


4
Se você monitorar cuidadosamente as variáveis ​​de estado (observando os valores impressos em notação científica), poderá ver o movimento inicial muito lento, longe do equilíbrio.
Brian Borchers

Isso faz sentido e, de fato, quando inicio o sistema em uma posição vertical descendente (sendo um ponto de equilíbrio estável), o sistema não se move, pelo menos por uma simulação de 1000 segundos, que considero um período de tempo muito longo .
Jrjasqu

6
x1 1sin(0)cos(0)sin(pi/2)cos(pi/2)rhs(t,[0,0,0 0] == [0,0,0,0]

π/2

11
θ=0 0 10-16

4

Veja os componentes das forças calculadas em suas funções.

π

10-16

uma=1.0uma=uma+10-16


4

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:

  1. π/2-π/2

  2. 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.


11
π

2
A propósito, apenas por diversão, se você quiser manter o sistema na posição vertical instável, poderá alterar sua origem de coordenadas para ter o ângulo igual a zero apontando para cima.
Ertxiem - restabelece Monica

@ Ertxiem outra opção é introduzir um pequeno atrito nos pinos que comeria erros numéricos.
svavil

pecado(π)

Como fisicamente isso não pode acontecer - Dada a percepção de que estamos em um equilíbrio instável, eu de certa forma desafio isso. Os sistemas físicos (sem muito atrito) não ficam em equilíbrio instável. De maneira mais geral, se você simular sistemas reais, evite que eles acidentalmente fiquem presos em um equilíbrio instável (como chegou lá) - é um recurso, não um bug. (Há algumas raras exceções a este, tais como o estado não infectado em imunologia, que é um equilíbrio instável que pode ser mantido.)
Wrzlprmft

0

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.


2
Isso não é uma questão de o sistema ser caótico, no entanto. Você também pode ter um equilíbrio instável em sistemas não caóticos, por exemplo, um único pêndulo "está de cabeça para baixo", e ele exibirá o mesmo comportamento descrito na pergunta.
Daniel

11
Também não é verdade que a energia aumente para RKM de pequena ordem: Euler implícito é de primeira ordem e mostra exatamente o comportamento oposto.
Daniel

@BeniBogosel Você mencionou métodos simpléticos que chamaram minha atenção porque, obviamente, no meu exemplo, a energia não é conservada. No entanto, você poderia indicar um método simplético específico que poderia ser implementado aqui?
Jrjasqu

@jrojasqu, por que você diz que a energia não é conservada no seu sistema?
Ertxiem - restabelece Monica

ode45π
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.