如何检查曲线是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类“功能”?
非常感谢。
答案 0 :(得分:4)
MatLab向量包含函数的样本,而不是函数本身。
采样数据始终是离散的,而不是连续的。
具有相同样本的无限多个函数。具体来说,这些样本总是存在连续和不连续的函数,因此无法仅从样本中确定C1。
连续函数的示例:傅里叶(或DCT)重建估计。
不连续函数的示例:傅立叶重建估计,加上周期等于采样率的锯齿波。
答案 1 :(得分:3)
你无法从你给出的数据中得知;你必须知道如何用它代表一个函数。
例如,如果我将它们绘制为直方图,则它是不连续的(在每个点跳跃)。如果我在点之间进行直线插值,则它是连续的C0。如果我使用像样条曲线那样的平滑插值,我可以获得C1连续性等等,这取决于我选择如何从数据数组中表示函数。
答案 2 :(得分:-1)
虽然从技术上讲你无法检查数据是否与C1或C2曲线相对应 - 你可以做一些仍然有用的事情。
C1表示连续的一阶导数。因此,如果您在数值上计算导数,然后在导数中看到大跳跃,那么您可能会怀疑基础曲线不是C1。 (你实际上无法保证,但你可以保证它不是C1或者在某些界限之外有衍生物)。相反,如果你没有得到任何大的跳跃,那么有一条带有界导数的C1曲线确实适合数据 - 不一定是实际生成数据的相同曲线。
您可以使用数值计算的二阶导数做类似的事情来确定其C2状态。 (注意,如果它不是C1,则它不能是C2 - 所以如果测试失败,你可以忘记第二次测试。)
这里大致是我在C ++中如何使用均匀间隔的x点的C1情况。 (如果事情间隔不均匀,则需要调整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对任何曲线都有意义。 这非常警告经纪人。