Ограниченное численное интегрирование
Обратите внимание, что я прошу не код, а информацию, возможно, от кого-то, кто уже сталкивался с подобной проблемой.
Я управляю кодом, который выполняется в реальном времени во встроенной системе. По соображениям безопасности необходимо провести новую проверку.
Эта проверка основана на интегрированном значении определенной переменной. Интеграл должен охватывать последние секунды "T_s", т. Е. При каждом новом цикле мне приходится удалять значение, которое переменная имела T_s секунд назад, и добавлять текущее.
Наивным подходом было бы хранить в массиве последние значения частоты с плавающей запятой T_s*.
Работая на частоте 62,5 Гц, это быстро тратит много драгоценной и ограниченной памяти.
Существуют ли известные подходы, которые за счет очевидной потери точности значительно сокращают объем памяти, необходимый для такой проверки?
Значение - это измерение, полученное из реальной системы, оно не генерируется функцией.
Я думал о сохранении N средних значений, каждой из M точек, а затем интегрировании N средних значений, это уменьшит требования к памяти до N+M чисел, которые могут быть значительно меньше частоты T_s*, но мне интересно:
если это было изучено и найдена "оптимальная" точка (например, в зависимости от M). Я разгорячился, но, видимо, мой гугл-фу не работает, так как поиск чего-либо, включая "числовую интеграцию", не приводит к тому, что я ищу.
если есть лучший подход
Я пометил этот пост буквой C, потому что это официальный язык проекта, и, к сожалению, любое решение, которое не работает в ANSI-C, не подходит для меня.
1 ответ
Кажется, я не могу найти интернет-страницу, где были описаны статистические расчеты только с тремя (?) Переменными. Может быть, вы делаете, когда ваш Google-фу восстанавливается.
Увы, если вам не нужна точность 100%, но вы можете жить со средним значением, вы можете сделать что-то вроде:
avg = (avg * 0.95) + ((newValue - avg) * 0.05);
Это даст вам приблизительное среднее из более старых значений, где самое последнее (newValue
) имеет не более 1/20 влияния; результат, умноженный на 20, является тогда вашим средним интегралом. Конечно, вы можете настроить две константы на любое значение 1-(1/N)
а также 1/N
соответственно для любого номера N
образцов для рассмотрения.
Редактировать:
"Онлайн" (итератор) алгоритмы для оценки статистической медианы, моды, асимметрии, эксцесса?
а также
https://math.stackexchange.com/questions/106700/incremental-averageing
может иметь несколько полезных ответов тоже.