数值求解运动常数

计算科学 计算物理学 微分方程
2021-11-30 01:32:27

给定一组 ODEz˙=f(z)(或离散时间zt+1=f(zt)),有没有办法以数值方式找到运动常数?

为了f(zt)Mzt,对角化矩阵M并找到等于 1 的特征值,但这只能找到z那是不变的。我想找到诸如半径、能量和动量之类的东西。

当我整合李群时,我对运动常数特别感兴趣。

编辑:

只是为了澄清,至少为了这个问题,运动常数被定义为,

f:RnRs.t.  ddtf(z(t))=0

因此,对于给定的轨迹z(t),我们可能会期望多个运动常数fi(z(t)),但我想找到运动常数fi这样它们对于所有可能的轨迹都是恒定的。

ddtfi(z(t;z0(k)))=0  z0(k)Rn

3个回答

一般来说,这似乎是一个难以解决的问题,但这里有一个想法。

假设您寻找形式的所有运动常数

i=1mλiφi(t),
在哪里λi是一些未知系数,并且{φi}i是一组基函数,可以通过 ODE 的数值积分来计算。例如,φi's 可能在一定程度上都是单项式,由z,z˙,z¨,.

那么条件是iλiφi(t)=const可以近似为矩阵方程

Φλ=0,where Φij=φj(ti)φj(0),
在哪里λ是一个未知向量,Φ是一个n×m矩阵,和t1,,tn是一些任意方便的时间点(n>m)。

这样你就可以找到所有可能的系数λ通过询问数值核来生成运动常数Φ. 如果运动常数是多项式z及其衍生物,这会起作用,但是由于您可以拥有多少不同的单项式,矩阵可能会非常大。这确实需要您提前猜测运动常数可能是什么样子,我不知道这对您是否现实。

如果您可以使用通用常量写下问题,那么这将成为参数估计问题。DifferentialEquations.jl 文档更详细地解释了一堆方法,但我将重点介绍此处示例的简单且标准方法该示例是关于查找生物常数(Lotka-Volterra 中的出生率和死亡率),但其想法与查找运动常数相同:将问题转换为带有参数的 ODE 并优化参数值。

内部循环本质上是:

  1. 用参数解决问题p.
  2. 计算成本函数。
  3. 让优化例程更新参数p希望有更好的参数。
  4. 如果您的成本太高,请返回 1。

如果你有一些关于微分方程路径应该是什么的数据,那么你可以定义一个成本函数,它是l2数据和每个点的数值解之间的差异。最小化此成本与最大化正态对数似然相同,并导致找到最适合数据的 ODE 参数。

但这种技术不需要数据。您可以在解决方案上定义任何有意义的损失函数,并使用适合它的优化器。例如,您可能只知道您想要的最大值u有时t=1,2,3,4成为1. 所以你可以使成本函数为

C(u)=t=1,2,3,4u(t)1

并让优化器搜索最能满足此约束的参数。当然,越能更好地定义成本函数以匹配您真正想要的结果,您就会得到更好的结果,尽管更复杂的成本函数会给优化器带来更大的压力。

这里的基本优化方法包括 Levenberg-Marquardt,你会看到一些使用它的教程,但你真的不应该使用它,因为它对找到局部最小值非常敏感,而且这些参数估计问题对于局部优化器来说非常困难。相反,您应该使用像 NLopt 这样好的全局优化库来获得不错的结果(这仍然很困难!)

仍然希望有一个更好的答案,但这是我想到的(受到 Christ Rackauckas 所说的其他内容的启发),但不是特别喜欢。

定义参数化的“运动常数”fi(z(t);θ)然后优化θ喜欢,

L(θi,λ)=12(θ21)+t,k12(fi(z(k)(t);θi)λki)2

我们离开λki“自由”,因此每个轨迹的每个常数仍然可以缩放,但受制于每个时间步长的状态函数。

下一个运动常数的训练可以通过添加一个损失项来解释最后一个运动常数。

t,kj=1i1(fi(z(k)(t);θi)fj(z(k)(t);θj))2

我不喜欢这个,原因很明显,这是一个可怕的优化问题要解决。