Решатель Гаусса для БИХ-фильтра
Я пишу фрагмент кода в онлайн-GDB, используя C++, код вычисляет некоторые коэффициенты для БИХ-фильтра, который пытается аппроксимировать дробную производную и интеграл для дробного ПИД-регулятора. Код работает, как и ожидалось, в онлайн-IDE, но когда я пытаюсь выполнить его в Arduino Due, результаты только переполняются и нан, и я действительно не знаю, в чем проблема, поэтому,
Вот код в GDB онлайн https://onlinegdb.com/rycwt62XL, который дает ожидаемые результаты:
Массив А, Массив Б
1,41421,1
-0,707107,0,5
-2,12132,-1,5
0,883883,-0,625
0,883883,0,625
-0,265165,0,1875
-0,0883883,-0,0625
0,0110485,-0,0078125
А вот код для Arduino Due, который только изменяет метод печати с помощью последовательных команд, https://onlinegdb.com/ByAs5xyVU, и результаты:
Массив А, Массив Б
ovf,1.00
овф,овф
ovf,0.00
inf,ovf
ovf,0.00
inf,ovf
ovf,3,89
inf,ovf
И действительно не знаю, с чего начать, чтобы исправить эти результаты, спасибо. Метод точно такой же.
@user2461687, 👍0
Обсуждение1 ответ
Лучший ответ:
Я не могу найти первопричину проблемы - вероятно, потому, что Due, возможно, худшая плата, которую когда-либо делала Arduino, а компилятор /компоновщик/библиотеки поддержки едва ли работают в лучшие времена.
Однако в коде нужно обратить внимание на некоторые моменты:
double* h = new double[L];
for(int n = 0; n <= L; n++){
for(int k = 0; k <= n; k++){
h[n] += pow(operador,-alpha-n+k)*pow(1.0-operador,n-k)*Binomial_E(alpha,k)*Binomial(-alpha,n-k);
}
}
Там вы выделяете L
(15) двойных значений в массиве. Но затем вы переходите к срезам массива 0-15. Это 16 записей в массиве размером 15, поэтому вы переполняете его и повреждаете другую память.
Кроме того, у вас нет delete
для балансировки new
, поэтому у вас есть утечка памяти. Вам лучше использовать:
double h[L+1];
вместо новый
.
Вы правы, я избегаю использования массивов с переменным размером и работает, большое спасибо, @user2461687
- Ручная установка Arduino Due
- Arduino Uno: avrdude: stk500_recv(): программатор не отвечает
- Как настроить выводы ввода-вывода второго квадратурного декодера в Arduino IDE
- Пример UDPSendReceiveString с использованием Arduino Due с Ethernet-модулем ENC28J60
- Запись регистра по составному назначению и указателю в Arduino due
- Операторы If и while не работают
- Проблема повторения
- Изменение выходного напряжения через ЦАП Arduino Due
Отлично работает на всех устройствах, которые я тестировал, *кроме * Due. Мне никогда не нравился Due - компиляция всегда была очень-очень шаткой..., @Majenko
Majenko, я проверял на arduino Mega и работает очень хорошо, но я сделал все программирование в Due, но спасибо, @user2461687