Math 如何检查曲线是否为C1类?

Math 如何检查曲线是否为C1类?,math,matlab,curve,Math,Matlab,Curve,如何检查曲线是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类“函数” 非常感谢。MatLab向量包含函数的样本,而不是函数本身 采样数据总是离散的,而不是连续的 有无穷多个函数具有相同的样本。具体来说,这些样本总是同时存在连续函数和不连续函数,因此无法仅从样本确定C1或C1 连续函数示例:傅里叶(或DCT)重构估

如何检查曲线是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类“函数”


非常感谢。

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

采样数据总是离散的,而不是连续的

有无穷多个函数具有相同的样本。具体来说,这些样本总是同时存在连续函数和不连续函数,因此无法仅从样本确定C1或C1


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


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

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


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

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

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

您可以对数值计算的二阶导数执行类似的操作,以确定其C2状态。(请注意,如果不是C1,则不可能是C2-因此,如果该测试失败,则可以忽略第二个测试。)

这里大致是我如何在C++中用均匀间隔的X点来处理C1情况。(如果事物的间隔不均匀,则需要调整

s
的计算)

双y[N]={0.56,1,12,41,…,11,0.11,3,23,95}; 双最大绝对斜率=0; 双和斜率=0; 双和绝对斜率平方=0; 无符号int-imax=0; 对于(无符号int i=0;imax_abs_slope){max_abs_slope=s;imax=i;} } //我们预计最大值在平均值的三个标准偏差范围内。 双标准差=sqrt((N*总和绝对斜率-总和绝对斜率-总和绝对斜率-总和绝对斜率)/(N*(N-1)); 如果((最大绝对斜率-总绝对斜率/(N-1))>3*stddev) {
std::C1指的是连续性顺序吗?C1对我来说是一阶导数连续的,C2是二阶导数连续的。这对你来说是什么意思吗?是的,正是:)谢谢你的回答。但是如何在Matlab曲线中检查这个呢(好的,但我必须检查我的10k随机生成样本,这是可能的C1类。这是不可能的吗?谢谢你的回答。这个点列表有一对一的关系,并且没有连接在一起,y只是随机生成的向量,x是曲线的子。我想用一条极值曲线来近似C1或C2泛函。正如大家所做的那样说,这是不可能知道的。我正试图弄清楚你说的我还没有报道的内容,这为你赢得了一张赞成票……我不知道,我没有读你的答案。我知道我对C1和C2的含义的评论是任何形式的第一反应。如果你觉得受到冷落,也许我对你的答案投赞成票你会感觉更好。你的评论他肯定是第一个,否则我就不知道他在说什么。(通常我认为人们不会试图做不可能的事)是的,例如hermit插值显示的是C1类状态。y,y'是随机生成的向量,但给出了向量中的第一个和最后一个元素。给定x曲线的子部分,y随机生成,y'随机生成,但y(1),y(n),y(1'),y(n)'是给定的。如果函数有较大的跳跃,插值无法生成结果。抱歉,deszhtop,这毫无意义。您的数据数组是x和y;我看不到y'的存在。这是您编造的。这种方式看起来不错,如果您有时间,请解释有关此结果的更多细节(方式).谢谢.非常感谢.我想了一个新的方法,也许可以解决这个问题。
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;
}