С температурами всё достаточно просто, графики без шумов. Можно брать локальные минимумы/максимумы, просто перебираете весь массив считая разницу между значениями в текущей и в следующей точках меняет знак, то записываете точку как локальный экстремум.
d = V[1]-V[0];
for (i = 1; i < N-1, i++) {
d1 = V[i+1]-V[i];
if (d < 0 && d1 > 0) {
// Локальный минимум V[i]
} else if (d > 0 && d1 < 0) {
// Локальный максимум V[i]
}
d = d1;
}
Для объёма график с шумами, если уровень шумов заранее известен, то его можно исключить игнорируя разницу, попадающую в уровень шума. Для нахождения середины перегиба в этом случае можно анализировать два перехода - от повышения к нулю и от нуля к снижению (наоборот для нижнего перегиба) и брать значение в середине перегиба или среднее значение между крайними точками перегиба.
noise = 2; // Уровень шума, поставить нужное значение
t1 = 0; // Точка перехода к нулю
upDown = 0; // Направление движения до нуля, > 0 - вверх, < 0 - вниз, 0 - начало графика
d = V[1]-V[0];
if (abs(d) < noise)
d = 0;
for (i = 1; i < N-1, i++) {
d1 = V[i+1]-V[i];
if (abs(d1) < noise)
d1 = 0;
if (d < 0 && d1 > 0) {
// Локальный минимум V[i]
} else if (d > 0 && d1 > 0) {
// Локальный максимум V[i]
} else if (d != 0 && d1 == 0) {
t1 = i;
upDown = d;
} else if (d == 0 && d1 > 0 && upDown < 0) {
// Локальный минимум V[(t1+i)/2] или (V[t1]+V[i])/2
} else if (d == 0 && d1 < 0 && upDown > 0) {
// Локальный максимум V[(t1+i)/2] или (V[t1]+V[i])/2
}
d = d1;
}