Решатель Гаусса для БИХ-фильтра

Я пишу фрагмент кода в онлайн-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

И действительно не знаю, с чего начать, чтобы исправить эти результаты, спасибо. Метод точно такой же.

, 👍0

Обсуждение

Отлично работает на всех устройствах, которые я тестировал, *кроме * Due. Мне никогда не нравился Due - компиляция всегда была очень-очень шаткой..., @Majenko

Majenko, я проверял на arduino Mega и работает очень хорошо, но я сделал все программирование в Due, но спасибо, @user2461687


1 ответ


Лучший ответ:

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