【问题标题】:ODE solver of a system with adaptive law具有自适应律的系统的 ODE 求解器
【发布时间】:2013-12-14 01:06:26
【问题描述】:

我有一个未知的非线性系统,我想使用另一个具有一些可调整参数的系统(例如,神经网络)对其进行建模。因此,我想在不知道其动态的情况下修复未知系统的在线学习结构,我只能通过输入-输出与它进行交互。我的问题是我无法使用 ode 求解器使其在 MATLAB 中工作。假设我们有这个真实的系统(我的实际系统比较复杂,但我会举一个简单的例子以便理解):

function dx = realsystem(t, x)
u = 2;
dx = -3*x+6*u;
end

我们解方程如下:

[t,x_real] = ode15s(@(t,x)realsystem(t,x), [0 1], 0)

我们假设这是一个未知系统,我们不知道系数 3 和 6,因此我们采用具有 2 个自适应定律的自适应系统:

dx(t) = -p1(t)*x(t) + p2(t)*u(t)

dp1(t) = -e(t)*x(t)

dp2(t) = e(t)*u(t)

对于 e(t),误差 e(t) = x(t) - x_real(t)。

问题是我找不到将每个 t 的实际值提供给 ode 求解器以便进行在线学习的方法。

我试过这样的东西,但没有用:

function dx = adaptivesystem(t, x, x_real)
dx = zeros(3,1);
e = x_real - x;
u = 2;
dx(1) = -x(2)*x(1)+x(3)*u;
dx(2) = -e*x(1); %dx(2) = dp1(t)
dx(3) = e*u; %dx(3) = dp2(t)
end

【问题讨论】:

  • 您为什么认为 ODE 求解器是适合这项工作的工具?不管你怎么努力,锤子都不能在螺丝上工作。
  • 我认为这是模拟一个知道其微分方程的系统的正确工具。知道这些方程,有没有其他方法可以估计模型的参数?
  • 对于线性近似,你有 ARMA(X) 和状态空间模型。对于非线性参数拟合,lsqcurvefit。此外,如果您需要随着时间的推移改进对传入数据的拟合,扩展卡尔曼滤波器可能会很好地工作(并非所有数据都可用于初始估计)。

标签: matlab ode


【解决方案1】:

您应该意识到,您的问题本身是不适定的。给定任何通过采样和平滑/插值获得的轨迹 x(t),您可以随意选择 p1(t) 并设置

p2(t) = ( x'(t) - p1(t)*x(t) ) / u.

所以你必须制定限制。一个明显的问题是函数 p1 和 p2 应该对黑盒系统的所有轨迹都有效。你有不同的轨迹可用吗?

另一个变体是要求 p1 和 p2 是常数。实际上,在这种情况下,如果您有等间距的样本可用,首先为数据找到一个好的差分方程会更容易。使用时间 t[n]=t0+n*dt 的样本 x[n] 形成一个矩阵 X,其中包含行

[ -u, x[n], x[n+1], ... ,x[n+k] ] 对于 n=0, ... , N-k

并对 X 应用 QR 分解或 SVD 以确定右手核向量。 QR 可能无法显示可用的秩不足,因此在 R = USV^T,S 对角线的顶部正方形部分使用 SVD,按常规排序,U,V 正方形和正交,并使用 V 的最后一行,带有系数

[b, a[0], ..., a[k] ],

对应最小特征值,形成差分方程

a[0]*x[n]+a[1]*x[n-1]+...+a[k]*x[n-k]=b*u.

如果 R 的有效秩分别。 S不是(k-1),则将k降为有效秩加一,重新开始。

如果最后找到k=1,那么你可以用它做一个微分方程。将差分方程改写为

a[0]*(x[n]-x[n-1])/dt = -(a[0]+a[1])/dt * x[n-1] + b/dt *你

并读出微分方程

x'(t) = -(a[0]+a[1])/(a[0]*dt) * x(t) + b/(a[0]*dt) * u

如果系数变得非常大,人们可能会拒绝这个等式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-21
    相关资源
    最近更新 更多