Хотя технически вы не можете проверить, соответствуют ли данные кривой С1 или С2, вы можете сделать что-то еще полезное.
C1 означает непрерывную 1-ю производную. Таким образом, если вы рассчитываете производную численно, а затем видите большие скачки в производной, то вы можете подозревать, что базовая кривая не С1. (Вы не можете на самом деле гарантировать это, но вы можете гарантировать, что он не является C1 или имеет производную за некоторыми границами). И наоборот, если вы не получаете больших скачков, то существует кривая C1 с ограниченной производной, которая соответствует данным - просто не обязательно та же самая кривая, которая фактически генерировала данные.
Вы можете сделать что-то похожее с численно рассчитанной второй производной, чтобы определить ее статус C2. (Обратите внимание, что если это не C1, то это не может быть C2 - поэтому, если этот тест не пройден, вы можете забыть о втором тесте.)
Вот примерно так, как я бы сделал это в C ++ для случая C1 с равномерно расположенными x точками. (Если вещи не расположены равномерно, вам нужно настроить расчет 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). </p>
Я не тестировал этот код, поэтому он может не запускаться или содержать ошибки.
Я также не проверял, что 3 * stddev имеет смысл для любых кривых.
Это очень много предостережение emptor .