我有一个未知的非线性系统,我想使用另一个具有一些适应性参数的系统(例如,神经网络)对其进行建模。因此,我想在不了解其动态的情况下修复未知系统的在线学习结构,我只能通过输入 - 输出与其进行交互。我的问题是我无法使用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的真实值提供给颂歌解算器,以便进行在线学习。
我尝试了类似的东西,但它不起作用:
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
答案 0 :(得分:0)
你应该意识到你的问题是不正确的。给定通过采样和平滑/插值获得的任何轨迹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
对于n = 0,...,N-k ,[-u,x [n],x [n + 1],...,x [n + k]]
并将QR分解或SVD应用于X以确定右手核矢量。 QR可能无法显示可用的秩缺陷,因此在R = USV ^ T,S对角线的顶部正方形部分使用SVD,按常规排序,U,V平方和正交,并使用V的最后一行,系数
[b,a [0],...,a [k]],
对应于最小特征值,以形成差分方程
一个[0] * X [n]的一个+ [1] * X [N-1] + ... + A [k]的* X [n-k个] = B * U
如果R的有效等级。 S不是(k-1),然后将k减少为有效等级加1并重新开始。
如果最终找到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
如果系数变得非常大,可以拒绝这个等式。