Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
微妙的MatLab函数拟合(按值离散,而不是参数)_Matlab - Fatal编程技术网

微妙的MatLab函数拟合(按值离散,而不是参数)

微妙的MatLab函数拟合(按值离散,而不是参数),matlab,Matlab,因此,我有相当多(超过60000)的数据点 f(x_k)=k,这里k=0,1,2,…,N 函数是单调递增的,在视觉上看起来非常平滑。我希望能够找到合适的F(x),这样对于每个x_k来说,k(这看起来有点像一个查找表。可能是某种图像处理应用程序?在我过去的生活中,我做过一些需要解圈的工具。) 这是一次性的问题,还是你会经常这样做,所以你需要速度 我会把它扔进去。由于我没有数据,我无法亲自测试或给你任何结果,但只要你使用足够数量的结,你想要的质量的可靠匹配肯定没有问题。您将需要在右侧添加额外的结,因

因此,我有相当多(超过60000)的数据点 f(x_k)=k,这里k=0,1,2,…,N

函数是单调递增的,在视觉上看起来非常平滑。我希望能够找到合适的F(x),这样对于每个x_k来说,k(这看起来有点像一个查找表。可能是某种图像处理应用程序?在我过去的生活中,我做过一些需要解圈的工具。)

这是一次性的问题,还是你会经常这样做,所以你需要速度

我会把它扔进去。由于我没有数据,我无法亲自测试或给你任何结果,但只要你使用足够数量的结,你想要的质量的可靠匹配肯定没有问题。您将需要在右侧添加额外的结,因为它似乎接近垂直渐近线,因此是奇点。样条曲线通常不喜欢奇点,因为它们的本质仍然是多项式

更好的是,交换x轴和y轴进行拟合,从而拟合x=f(y)。左端点不是渐近线,因此不再存在奇点。现在,您需要做的就是将结果约束为单调递增和下凹(因此到处都是负二阶导数)。反向拟合所需的节点要少得多,但要使用足够的节点,以确保拟合质量足以满足您的目标

要使用反向拟合,只需反向插值,这是SLMEVAL能够做到的。我将通过您提供的少量测试数据(仅使用默认的节点数)了解它的工作情况:

因此,拟合似乎合理,但我注意到,您的数据似乎有点颠簸。可能确实很难找到一个平滑但完全符合您需求的解决方案

让我们看看它做得有多好:

[x;y;slmeval(x,slm,-1)]'
ans =
         0         0    0.0190
    1.0000    1.0000    0.9656
    3.0000    2.0000    2.0522
    5.0000    3.0000    2.9239
    8.0000    4.0000    4.1096
   10.0000    5.0000    4.8419
   14.0000    6.0000    6.1963
   16.0000    7.0000    6.8331
   20.0000    8.0000    8.0638
   23.0000    9.0000    8.9699
   27.0000   10.0000   10.1459
   29.0000   11.0000   10.7088
   35.0000   12.0000   12.2942
   37.0000   13.0000   12.8285
   41.0000   14.0000       NaN
它完全忽略了最后一点,拒绝推断。但剩下的就不远了。但他们确实不符合你的要求,因为事实并非如此

k <= F(x_k) < k+1
lsqlin有点不高兴,因为此时它不处理这种形式的稀疏问题。因此,它抛出一个警告,表示它正在将问题转化为完整问题

Warning: Large-scale algorithm can handle bound constraints only;
    using medium-scale algorithm instead. 
> In lsqlin at 270 
Warning: This problem formulation not yet available for sparse matrices.
Converting to full to solve. 
> In lsqlin at 320 
Optimization terminated.
当然,对于一个有60k未知量的问题来说,这种转换是完全不可接受的。不要在60k数据点上尝试!!!!!!!!!!!!!!!!你的电脑将进入深度冻结状态

它是怎么做到的

disp([x,k,yhat,k+1])
         0         0    0.4356    1.0000
    1.0000    1.0000    1.0000    2.0000
    3.0000    2.0000    2.0504    3.0000
    5.0000    3.0000    3.0000    4.0000
    8.0000    4.0000    4.2026    5.0000
   10.0000    5.0000    5.0000    6.0000
   14.0000    6.0000    6.2739    7.0000
   16.0000    7.0000    7.0000    8.0000
   20.0000    8.0000    8.0916    9.0000
   23.0000    9.0000    9.0000   10.0000
   27.0000   10.0000   10.2497   11.0000
   29.0000   11.0000   11.0000   12.0000
   35.0000   12.0000   12.2994   13.0000
   37.0000   13.0000   13.0000   14.0000
   41.0000   14.0000   14.0594   15.0000
它工作得很好,尽管对于你所遇到的大问题来说,它将是一只淫秽的猪。也许有另一个优化器(可能在TOMLAB或其他包中)可以处理大规模稀疏线性问题,受线性约束和有界约束。您也可能希望强制第一个点通过零,但这是微不足道的


最后一个选择是,如果1000个点是可行的,则使用上述方案一次以1010个点为一批重新创建曲线。lsqlin应该能够毫无问题地处理这种规模的问题。在末端留下一些重叠,每个重叠区域中有5个点就足够了。然后对重叠区域的结果求平均值。

您需要拟合或插值吗?@Shai先生,我不知道您的意思。拟合过程可能包括插值。不过我不会说英语。@Shai我重新考虑了你说的话。我只关心插值,在某种意义上,F(x)也应该是单调递增的。事实上,它类似于一个与图像处理相关的查找表。也是一次计算。这是一个(可能是天真的)想法,一个人可以携带一个函数,而不是到处都是庞大的数组。对不起,不,肯定没有简单的函数可以满足你的限制。感谢分享你的经验木片,因为你和你的工具,我学到了很多。祝贺你当之无愧的金色Matlab徽章!
x = [0 1 3 5 8 10 14 16 20 23 27 29 35 37 41]';
n = numel(x);
k = (0:(n-1))';

% The "unrounding" bound constraints
LB = k;
UB = k+1;

% The best fit possible
Afit = speye(n,n);

% And as smooth as possible
ind = 1:(n-2);
% could do this with diff of course
dx1 = x(ind+1) - x(ind);
dx2 = x(ind+2) - x(ind + 1);

% central second finite difference, for unequal spacing
den = dx1.*dx2.*(dx1 + dx2)/2;
Areg = spdiags([dx2./den,-(dx1 + dx2)./den,dx1./den],[0 1 2],n-2,n);
rhs = [k;zeros(n-2,1)];

% monotonicity constraints...
Amono = spdiags(repmat([1 -1],14,1),[0 1],n-1,n);
bmono = zeros(n-1,1);

% choose a value for r, that allows you to control the smoothness
% larger values of r will make the curve smoother, but the bounds
% will always be enforced. I played with it, and r = 5 seemed a
% reasonable compromise here.
r = 5;
yhat = lsqlin([Afit;r*Areg],rhs,Amono,bmono,[],[],LB,UB);
Warning: Large-scale algorithm can handle bound constraints only;
    using medium-scale algorithm instead. 
> In lsqlin at 270 
Warning: This problem formulation not yet available for sparse matrices.
Converting to full to solve. 
> In lsqlin at 320 
Optimization terminated.
disp([x,k,yhat,k+1])
         0         0    0.4356    1.0000
    1.0000    1.0000    1.0000    2.0000
    3.0000    2.0000    2.0504    3.0000
    5.0000    3.0000    3.0000    4.0000
    8.0000    4.0000    4.2026    5.0000
   10.0000    5.0000    5.0000    6.0000
   14.0000    6.0000    6.2739    7.0000
   16.0000    7.0000    7.0000    8.0000
   20.0000    8.0000    8.0916    9.0000
   23.0000    9.0000    9.0000   10.0000
   27.0000   10.0000   10.2497   11.0000
   29.0000   11.0000   11.0000   12.0000
   35.0000   12.0000   12.2994   13.0000
   37.0000   13.0000   13.0000   14.0000
   41.0000   14.0000   14.0594   15.0000