为什么ODE的数值解会偏离不稳定的平衡?


15

我希望模拟双摆式系统的行为。该系统是一个2自由度的机器人操纵器,该操纵器没有被致动,因此其行为主要类似于受重力影响的双摆。双摆的唯一主要区别在于,它由两个刚体组成,两个刚体在其质心处具有质量和惯性特性。

基本上,我ode45在Matlab下进行编程,以解决以下类型的ODE系统:

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

其中x1是第一物体相对于水平面的角度,x2是第一物体相对于水平面的角速度;x3是第二物体相对于第一物体的角度,x4是第二物体的角速度。在我创建的rhsfMass函数的以下代码中指定了所有系数。

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

请注意,我如何设置x1的初始条件(第一个物体相对于水平面的角度),以便系统从完全垂直的位置开始。这样,由于仅重力作用,因此明显的结果是系统根本不应该从该位置移动。

注意:在下面的所有图形中,我绘制了关于时间的解x1x3

ODE45

当我使用进行了6秒钟的仿真时ode45,我得到了没有任何问题的预期解决方案,系统保持原样并且不动:

在此处输入图片说明

但是,当我运行模拟10秒钟时,系统开始不合理地移动:

在此处输入图片说明

ODE23

然后,我运行模拟ode23以查看问题是否仍然存在。我最终得到相同的行为,只是这次差异在1秒后开始:

在此处输入图片说明

ODE15

然后,我运行模拟ode15s以查看问题是否仍然存在,并且不,即使在100秒内,系统也似乎是稳定的:

在此处输入图片说明

再说一次,ode15s只是一阶,请注意,只有几个集成步骤。因此,我ode15s在10秒内运行了另一个仿真,但MaxStep大小为0.01以提高精度,但是不幸的是,这导致了与ode45和相同的结果ode23

在此处输入图片说明

通常,这些模拟的明显结果将是系统保持在其初始位置,因为没有任何干扰。为什么会出现这种分歧?这些类型的系统本质上是混乱的,这是否与事实有关?这是odeMatlab中函数的正常行为吗?


除了方程式之外,我认为原理图也将有助于理解这个问题。
nicoguaro

如果您认为适当,则可以接受其中一个答案(有一个绿色按钮)。
Ertxiem-恢复莫妮卡

您没有说,但您似乎正在绘图x1x3。(约没有传说或描述图表插入干评论。)尝试绘制(的绝对值)的对数x2x4
Eric Towers

Answers:


15

我认为Brian和Ertxiem已经提出了两个主要观点:您的初始值是一个不稳定的平衡,而您的数值计算从未真正准确的事实提供了很小的扰动,这些扰动会引起不稳定。

为了更详细地说明这种情况如何发生,请以一般初始值问题的形式考虑您的问题

y˙(t)=M1f(t,y(t))
,其中y(t)=(x1(t),x2(t),x3(t),x4(t))

f(t,y(t))=[x2V1G1x4V2G2]

在精确的算法,你就必须f(0,y0)=0,因此y˙(0)=0,并没有什么时候改变:您的系统保持平衡。但是,计算机中的算术运算并不精确,这意味着由于种种原因,您的右手边并非精确为零,而是等于f~这几乎是但不完全为零。

在您的代码中,您可以通过计算来测试

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

得出6.191e-16-几乎但不完全是零。这对系统的动态有何影响?

fy0y~0

此外,在很短的时间内,您系统的解决方案看起来就像线性系统的解决方案

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

ffrhsy0d(t):=y(t)y0d

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

我不必费心去手工计算雅可比行列式,因此我使用自动微分来获得良好的近似值:

J:=f(0,y0)=[01009.8102.4525000012.452502.45250]

这样你的方程就变成

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

现在我们需要最后一步:我们可以计算雅可比行列式的特征值分解,使得

J=QDQ1

DJQde(t):=Q1d(t)

e˙(t)=De(t),e(0)=Q1d0.

D

e˙i(t)=λiei(t),ei(0)=ith component of Q1d0

i=1,2,3,4λ1=3.2485

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

d(0)=0e(0)=Q1d(0)=0e1(0)=0e1(0)


16

π/2π/2


4
如果仔细监视状态变量(通过查看以科学计数法表示的值),您应该能够看到初始的非常缓慢的运动偏离平衡。
Brian Borchers

这是有道理的,确实,当我在向下的垂直位置(即稳定的平衡点)启动系统时,系统完全不动,至少在模拟1000秒的过程中,我认为这是很长的时间。
jrojasqu

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

π/2

1
θ=0 1016

4

查看在函数中计算出的力的分量。

您可能会发现它们永远不会完全为零,因为正如其他答案所述,您无法表示π 完全是计算机算法,计算触发函数的例程也不是完全正确。

最终,微小的力量(可能是秩序的 10-16 在开始时)将使系统远离不稳定的平衡位置。

尽管系统的位移仍然很小,但是所有计算都会由于舍入误差而损失很多精度(您正在执行的计算与 一种=1.0; 一种=一种+10-16),因此系统在模拟中“翻倒”之前的时间将完全取决于您使用的集成方法,所需的时间步长等。


4

最初的假设是初始位置处于动能为零的稳定平衡状态(即势能的最小值),系统开始远离平衡状态。
由于从物理上讲不可能发生(如果我们考虑经典力学的话),我想到了两件事:

  1. 第一个可能是初始位置是:两个钟摆都指向上方(π/2 代替 -π/2?),这是不稳定的平衡点;

  2. 第二个问题是运动方程式可能有问题(也许在某处有错字?)。您能否明确写出方程式?也许您可以将角加速度作为每个摆的初始位置的函数进行绘制,假设角速度为零,以检查是否存在异常。


1
确实,我以垂直向上的位置启动了系统。因此,这是一个不稳定的平衡点。Brian Borcher的评论通过解释问题来完善您的答案π逼近导致系统最终从该位置移动。
jrojasqu

2
顺便说一句,只是出于娱乐目的,如果您想将系统保持在不稳定的垂直位置,则可以更改坐标原点,以使向上的角度等于零。
Ertxiem-恢复莫妮卡

@Ertxiem的另一种选择是在销中引入较小的摩擦,这会导致数值误差。
svavil

@Ertxiem为了好玩,我尝试更改坐标系,以便零角度可使系统指向上方。这确实是最好的参数化方法。显然,系统会无限期地停留在向上的位置。但是,在稳定的平衡位置(直向下)仍会产生振荡(最小的模拟时间为1000秒,但在那里),因为这样一来,π由势能得出的力来计算。因此,我坚持这样一个事实,即如果我对此进行足够长的仿真,系统也会开始偏离该位置。
jrojasqu

由于从物理上讲不可能发生 –考虑到我们处于不稳定的平衡状态,我对此提出了一些挑战。物理系统(没有太大的摩擦)不会保持不稳定的平衡。更一般而言,如果您模拟真实的系统,则要避免它偶然卡在不稳定的平衡中(无论如何到达那里)–这是一个功能,而不是错误。(对此,有一些罕见的例外,例如免疫学中未感染的状态,可以保持这种不稳定状态。)
Wrzlprmft

0

您应该搜索有关双摆的更多信息:它们被称为“混沌系统”。尽管它们的行为遵循简单的规则(从略有不同的初始条件开始),但解决方案的分歧却相当快。对这类系统进行数值模拟并不容易。看下面的视频以更深入地了解问题。

对于简单或双摆,您可以编写系统总能量的公式。假设摩擦力被忽略,该总能量将由分析系统保留。从数字上讲,这是另一个问题。

在尝试双摆之前,请尝试简单摆。您会注意到,对于小阶的Runge-Kutta方法,系统的能量将在数值模拟中增长,而不是保持不变(这就是模拟中发生的事情:您一无所有)。为了防止这种情况,可以使用更高阶的RK方法(ode45为4阶; 8阶的RK效果更好)。还有其他称为“渐近方法”的方法,其设计使得数值模拟可以节省能量。通常,与初始化相比,一旦能量显着增加,就应立即停止仿真。

并在尝试双重练习之前尝试了解简单的钟摆。


2
不过,这与系统混乱无关。您也可以在非混沌系统中具有不稳定的平衡,例如单个摆在“头部”,并且将表现出与问题中描述的行为相同的行为。
丹尼尔(Daniel)

1
小阶RKM的能量增加也是不正确的:隐式的欧拉一阶并且正好显示相反的行为。
丹尼尔(Daniel)

@BeniBogosel您提到了辛的方法引起了我的注意,因为显然,在我的示例中,能量是不守恒的。但是,您能否指出可以在此处实现的特定辛方法?
jrojasqu

@jrojasqu为什么您说系统上的能量不节省?
Ertxiem-恢复莫妮卡

@Ertxiem当我使用提供的输出来计算系统的总机械能(运动能+势能)时ode45,我得到一个从零开始然后随时间增长的值。该值在开始的几秒钟内非常小,但是仍然始终从零开始增长。我认为这是因为上述答案中提到的问题(近似π等)。
jrojasqu
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.