什么地方出了错?
您有两组数字x
,并且两组中y
的元素数量相同。
你假设
:有一个函数f
,f( x_i ) = y_i
对于你的集合中的所有对x_i,y_i
。
湾。集合中的点是有序的:也就是说,如果你遵循f(x)
then x_i
"comes before"的曲线x_{i+1}
。
虽然这些假设适用于您拥有的“正确拟合”示例。它们不再适用于“不正确的拟合”示例。
正如您自己所看到的,顶部的输入轮廓不能表示为,y = f(x)
因为有些值x
有两个可能的对应值y
(参见数学函数的定义)。你得到的拟合是最接近数学函数的东西y = f(x)
,可以给出x,y
你给出的对(红色曲线具有每个x
只有一个y
值的属性)。
你能做什么?
在大多数情况下,当您尝试拟合 2D 曲线时,您会搜索参数曲线:也就是说,您会引入一个辅助参数t
,以便曲线上的每个点都可以表示[x(t), y(t)]
为 some 0<=t<=1
。
现在,如果假设 b 成立(并且通过查看您的示例,我不确定它是否成立),您可以做的是
t = linspace( 0, 1, numel(x) ); % define the parameter t
fitX = fit( t, x, 'cubicinterp'); % fit x as a function of parameter t
fitY = fit( t, y, 'cubicinterp'); % fit y as a function of parameter t
plot( fitX, fitY, 'r-' ); % plot the parametric curve