将非光滑(非连续可微)系统动态近似为 n 光滑的系统方法是什么?

计算科学 非线性方程 最优控制 平滑
2021-12-14 01:59:18

我有一个不平滑的系统动态,因为它有几个符号和绝对值函数(三罐级控制)。我显然可以选择不同的 sigmoid 函数来近似动态,使它们成为 n 次连续可微分。有人可以指出我这样做的系统方法吗?或者甚至有一些集成商可以自动处理不连续性?

我可以想出许多近似函数的方法,但我很难决定“最好”的方法。现在,我将根据以下标准做出决定:

  • 平滑度(可微分等级)

  • 数值计算工作(尤其是关于积分)

我想要平滑的一个示例术语是:

h(x)=sign(x1x2)|x1x2|

我的问题的背景是非线性模型预测控制。

假设x0我们可以说:

sign(x1x2)=x1x2|x1x2|

我“测试”的近似值之一(我将如何正确地做到这一点?)是:

|x1x2|(x1x2)2+ϵ

ϵ1.

就我而言,我选择了ϵ=106通过在 0 附近的平滑和适当表示之间进行权衡。

1个回答

平滑函数的两种系统方法h将是:

1.使用Hermite 插值加入函数的分段平滑部分,以使导数匹配到您满意的程度。

2.卷积你的函数h(x)具有以下形式的热核f(x)=exp{x22σ2}2πσ2这样,而不是与h(x)你会处理

g(x)=f(xy)h(y)dy.

σ>0参数决定多近gh并且通过热方程解的性质,可以保证g是无限光滑的。

第二种方法的示例

第二种方法的示例h(x)=sign(x)|x|,这是不光滑的x=0, 使用σ值 0.05、0.1 和 0.01 如下图所示。

原始函数和平滑版本

用于符号积分和绘图的 MATLAB (2019a) 代码:

syms x_1 x_2 x_int x x_hk sigma
h(x_1, x_2) = sign(x_1-x_2)*sqrt(abs(x_1-x_2))
h(x_int) = subs(h(x_1, x_2), x_1-x_2, x_int)

heat_kernel(x_hk, sigma) = exp(-(x_hk)^2/(2*sigma^2))/(sqrt(2*pi*sigma^2))
assume(sigma, {'real', 'positive'})
g(x, sigma) = int(heat_kernel(x-x_int, sigma)*h(x_int), x_int, -inf, inf)

fplot(h(x_int), [-0.4, 0.4])
hold on
fplot(g(x, 0.05), [-0.4, 0.4])
fplot(g(x, 0.1), [-0.4, 0.4])
fplot(g(x, 0.01), [-0.4, 0.4])
legend(["h(x)", "g(x, 0.05)", "g(x, 0.1)", "g(x, 0.01)"], 'Location', 'NorthEastOutside')