Различные результаты с Matlab Cumtrapz и Scipy.integrate Cumtrapz - PullRequest
1 голос
/ 10 июля 2019

Я перевожу некоторый код Matlab в код Python и отлаживаю оба кода. Я получаю другой результат от вызова функции cumtrapz, я также проверял, что входные данные обоих одинаковы.Это коды:

Код Python

from numpy import zeros, ceil, array, mean, ptp, abs, sqrt, power
from scipy.integrate import cumtrapz

def step_length_vector(ics_y, fcs_y, acc_y, l, sf):
    step_length_m1 = zeros(int(ceil(len(ics_y)/2))-1) 

    for i in range(0, len(ics_y)-2, 2):
        av = acc_y[int(ics_y[i]):int(ics_y[i+2])+1]
        t = array(range(1, int((ics_y[i+2]-ics_y[i])+2)))/sf
        hvel = cumtrapz(t, av - mean(av), initial=0)
        h = cumtrapz(t, hvel - mean(hvel), initial=0)
        hend = ptp(h)
        sl = 6.8*(sqrt(abs(2*l*hend - hend**2)))
        step_length_m1[int(ceil(i/2))] = sl

    return step_length_m1

Код Matlab

function [StepLengthM1] = StepLengthVector(ICsY,FCsY,ACCY,l,sf)

        StepLengthM1 = zeros(1,ceil(length(ICsY)/2)-1);

        for i= 1:2:length(ICsY)-2
           av   = ACCY(ICsY(i):ICsY(i+2));           
           t    = (1:(ICsY(i+2)-ICsY(i))+1)/sf;
           hvel = cumtrapz(t,av-mean(av));      
           h    = cumtrapz(t,hvel-mean(hvel));
           hend = peak2peak(h);
           sl   = 6.8*(sqrt(abs(2*l*hend - hend.^2)));
           StepLengthM1(ceil(i/2)) = sl;
        end   
end

Переменная hvel различна для обоих кодов.Возможно, я неправильно использую scipy cumtrapz, потому что я полагаю, что полученное значение initial равно 0.В обоих случаях входы ics_y(ICsy), fcs_y(FCsY), acc_y (ACCY) являются одномерными массивами, а l и sf являются скалярами.

Спасибо !!!

1 Ответ

2 голосов
/ 10 июля 2019

(Если этот вопрос касается cumtrapz, вам следует упростить ваши тесты до одного вызова cumtrapz с одинаковыми входными массивами в matlab и Python. Кроме того, обязательно прочитайте документацию по matlab и SciPy каждого будьте осторожны. Функции SciPy обычно не являются точными дубликатами соответствующей функции matlab.)

Проблема в том, что когда вы задаете значения x и y, порядок, в котором они указываются в matlab / octave, равен x, y, но в версии SciPy это y, x.

Например,

octave:11> t = [0 1 1.5 4 4.5 6]
t =

   0.00000   1.00000   1.50000   4.00000   4.50000   6.00000

octave:12> y = [1 2 3 -2 0 1]
y =

   1   2   3  -2   0   1

octave:13> cumtrapz(t, y)
ans =

   0.00000   1.50000   2.75000   4.00000   3.50000   4.25000

Чтобы получить тот же результат с scipy.integrate.cumtrapz:

In [22]: from scipy.integrate import cumtrapz                                                         

In [23]: t = np.array([0, 1, 1.5, 4, 4.5, 6])                                                         

In [24]: y = np.array([1, 2, 3, -2, 0, 1])                                                            

In [25]: cumtrapz(y, t, initial=0)                                                                    
Out[25]: array([0.  , 1.5 , 2.75, 4.  , 3.5 , 4.25])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...