-2

如何检查曲线是C1类还是C2类。

例子:

x = [1,2,3,4,5,6,7,8,9 ......1500] 

y = [0.56, 1, 12, 41, 01. ....... 11, 0.11, 3, 23, 95] 

这条曲线是 C1 类“功能”吗?

非常感谢。

4

3 回答 3

4

MatLab 向量包含函数的样本,而不是函数本身。

采样数据始终是离散的,而不是连续的。

有无限多个具有相同样本的函数。具体来说,这些样本总是有连续和不连续的函数,因此无法仅从样本中确定 C1 与否。


连续函数示例:傅立叶(或 DCT)重构估计。

不连续函数的示例:傅立叶重构估计,加上周期等于采样率的锯齿波。

于 2011-10-26T19:01:40.560 回答
3

您无法从提供的数据中分辨出来;您必须了解如何从中表示函数。

例如,如果我将它们绘制为直方图,它是不连续的(在每个点跳跃)。如果我在点之间进行直线插值,它是 C0 连续的。如果我使用像样条曲线这样的平滑插值,我可以获得 C1 连续性等等,这取决于我选择如何从数据数组中表示函数。

于 2011-10-26T20:02:31.927 回答
-1

虽然从技术上讲,您无法检查数据是否对应于 C1 或 C2 曲线 - 您可以做一些仍然可能有用的事情。

C1 表示连续一阶导数。因此,如果您用数值计算导数,然后看到导数有很大的跳跃,那么您可能会怀疑基础曲线不是 C1。(您实际上不能保证这一点,但您可以保证它不是 C1 或具有超出某些范围的导数)。相反,如果你没有得到任何大的跳跃,那么就会有一条带有有限导数的 C1 曲线确实适合数据——只是不一定是实际生成数据的同一条曲线。

您可以对数值计算的二阶导数执行类似的操作,以确定其 C2 状态。(请注意,如果它不是 C1,那么它就不可能是 C2 - 所以如果该测试失败,您可以忘记第二个测试。)

对于具有均匀间隔的 x 点的 C1 案例,这大致是我在 C++ 中的做法。(如果事情不是均匀分布的,你需要调整 的计算s)。

double y[N] = {0.56, 1, 12, 41, ..., 11, 0.11, 3, 23, 95 };

double max_abs_slope = 0;
double sum_abs_slope = 0;
double sum_abs_slope_sq = 0;
unsigned int imax=0;

for(unsigned int i=0; i<N-1; ++i )
{
  double s = fabs( y[i+1]-y[i] );
  sum_abs_slope += s;
  sum_abs_slope_sq += s*s;
  if(s>max_abs_slope) { max_abs_slope = s; imax = i; }
}

// We expect the max to be within three std-dev of the average.
double stddev = sqrt(  (N*sum_abs_slope_sq - sum_abs_slope*sum_abs_slope)/(N*(N-1)) );

if( ( max_abs_slope - sum_abs_slope/(N-1) ) > 3 * stddev )
{  
   std::cout<<"There's an unexpectedly large jump in interval "<<imax<<std::endl;
}
else
{
   std::cout<<"It seems smooth"<<std::endl;
}

但是,您可以使用与 不同的阈值3*stddev,您可以根据您对潜在问题的了解选择一个实际限制,或者您可以选择更严格(使用值 >3)或不那么严格(<3)。

我没有测试过这段代码,所以它可能无法运行或可能有问题。我也没有检查 3*stddev 是否​​对任何曲线有意义。这是非常警告购买者

于 2011-10-27T01:44:40.267 回答