Можно ли устранить ошибки округления фильтра между MATLAB и Python? - PullRequest
0 голосов
/ 12 декабря 2018

Я пытаюсь скопировать некоторый код Matlab в Python, и в данный момент я разрабатываю модульный тест для проверки эквивалентности.В приведенном ниже коде я получаю ошибки в порядке E-11, который указывает мне, что это может быть ошибкой округления.

Matlab Code:

width = 200;
x = 1:100000;
b = ones(width,1)/width;
y = filter(b, 1, x);
save('mat_data')

Python Code:

import numpy as np
from scipy.io import loadmat
from scipy import signal

def plot_fig(x, y=None):
    import matplotlib.pyplot as plt
    if y is None:
        y = x
        x = np.arange(0, len(y))
    plt.figure()
    plt.plot(x, y)
    plt.show()

def mat_data(param):
    data = loadmat('mat_data.mat')
    return np.squeeze(data[param])

y = signal.lfilter(mat_data('b'), 1, mat_data('x'), axis=0)
plot_fig(mat_data('y') - y)

Я использовал функцию loadmat, чтобы обеспечить эквивалентность между числовыми массивами, которые я использую в качестве входов функции,В результате получается:

график различий

Я вижу, что ошибка невелика, поэтому возможны ошибки округления, но, похоже, накапливается, что меня беспокоит.

В данный момент приложение, над которым я работаю, имеет решающее значение для обеспечения бинарной эквивалентности между двумя кодами (matlab и python), поэтому я был бы очень признателен за любую помощь в устранении этого несоответствия.

Заранее спасибо,

A.

1 Ответ

0 голосов
/ 13 декабря 2018

Вы можете попробовать поплавки с двойной точностью, а не с одинарной точностью в python.Я думаю, что это значительно уменьшит накопившуюся ошибку округления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...