Как проверить, соответствует ли кривая классу С1? - PullRequest
0 голосов
/ 26 октября 2011

Как проверить, является ли кривая классом С1 или классом С2.

Пример:

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?

Большое спасибо.

Ответы [ 3 ]

4 голосов
/ 26 октября 2011

Векторы MatLab содержат выборки функции, а не саму функцию.

Выборочные данные всегда дискретны, а не непрерывны.

Существует бесконечно много функций с одинаковыми выборками.В частности, всегда есть как непрерывные, так и прерывистые функции с этими выборками, поэтому нет способа определить C1 или не только из выборок.


Пример непрерывной функции: восстановленная оценка Фурье (или DCT).

Пример прерывистой функции: оценка, восстановленная Фурье, плюс пилообразная волна с периодом, равным частоте дискретизации.

3 голосов
/ 27 октября 2011

Вы не можете судить по данным, которые вы дали; Вы должны знать кое-что о том, как вы представляете функцию из нее.

Например, если я отображаю их как гистограмму, это прерывисто (скачки в каждой точке). Если я делаю прямую интерполяцию между точками, это C0 непрерывно. Если я использую плавную интерполяцию, такую ​​как сплайн, я могу получить непрерывность C1 и так далее, в зависимости от того, как я решу представить функцию из ваших массивов данных.

0 голосов
/ 27 октября 2011

Хотя технически вы не можете проверить, соответствуют ли данные кривой С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 .

...