为未知函数构建线性逼近

时间:2016-03-12 02:12:57

标签: algorithm matlab numeric

我有一些未知函数f(x),我使用matlab在函数图上计算2000点。我需要一个包含20到30段的分段线性函数g,它最适合原始函数,我怎么能以可接受的方式做到这一点?可能的解决方案空间是不可能遍历的,并且无法想到一个好的启发式函数来有效地缩小它。

以下是从中派生函数的代码:

x = sym('x', 'real'); 
inventory = sym('inventory', 'real'); 
demand = sym('demand', 'real'); 
f1 = 1/(sqrt(2*pi))*(-x)*exp(-(x - (demand - inventory)).^2./2); 
f2 = 20/(sqrt(2*pi))*(x)*exp(-(x - (demand - inventory)).^2./2);
expectation_expression = int(f1, x, -inf, 0) + int(f2, x, 0, inf);

1 个答案:

答案 0 :(得分:0)

根据您对良好近似的看法,可能会有一个动态编程解决方案。

例如,给定2000个点和相应的值,我们希望找到20个分段的分段线性逼近,它最小化每个点的真值与线性逼近的结果之间的平方偏差之和。

从左到右沿着2000点工作,并且在每个点处计算i = 1到20从最左边到该点的总误差,用于使用i段的最佳分段线性逼近。

您可以使用为该位置左侧的点计算的值计算位置n + 1处的值 - 点1..n。对于i的每个值,考虑其左边的所有点 - 比如点j<的n + 1。计算从点j到点n + 1的线性段产生的误差贡献。在j点使用i-1段(或者可能是j-1点,取决于您定义的分段线性逼近的确切位置),为此找出最佳可能误差的值。如果现在对所有可能的j采用最小值,则使用i段对前n + 1个点的最佳分段线性逼近计算误差。

当您使用20个分段计算出前2000个点的最佳值时,您已经解决了问题,并且您可以沿着此表返回以找出分段的位置 - 或者,如果这样不方便,您可以随着时间的推移保存额外的信息,使这更容易。

我相信类似的方法可以最大限度地减少绝对偏差的总和,或者最小化任何点的最大偏差,这取决于您是否能够解决单条线的相应问题。我隐含地假设你可以拟合一条直线来最小化平方误差的总和,这当然是标准的平方和线拟合。最小化与直线的绝对偏差是凸优化的练习,我将通过重复加权最小二乘来尝试。最小化最大绝对偏差是线性编程。