Python - Странные сюжетные точки на оде - PullRequest
0 голосов
/ 26 апреля 2018

В настоящее время я разрабатываю динамическую модель для транспортного средства в рамках моей магистерской диссертации.

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

Часть моего кода выглядит следующим образом:

 f = [#0 - x_ctr     
            dx_ctrdt,
        #1 - dx_ctrdt
            (flx_car1_A + flx_car1_B + flx_car2_A + flx_car2_B)/M_car + (x_ctr)*(V_tr**2)/R_curve/R_ctr - F_drag/M_car,
        #2 - y_ctr     
            dy_ctrdt,
        #3 - dy_ctrdt
            (fly_car1_A + fly_car1_B + fly_car2_A + fly_car2_B)/ M_car + (R_curve + y_ctr)*(V_tr**2)/R_curve/R_ctr - 9.8*np.sin(beta),
        #4 - omega_1
            -(flx_car1_A + flx_car1_B)*r/Inertia_1 - 0.5*F_rr*r/Inertia_1 + F_motor_1*r/Inertia_1,
        #5 - omega_2
            -(flx_car2_A + flx_car2_B)*r/Inertia_2 - 0.5*F_rr*r/Inertia_2 + F_motor_2*r/Inertia_2,
        #6 - alpha
            dalphadt,  
        #7 - dalphadt
            (mz_car_1  + mz_car_2 ) / Inertia_car,                            
        #8 - x_1A
            v_1A*cos_theta_1 - (V_tr/R_curve)*R_1A*cos_psi_1A,
        #9 - y_1A
            v_1A*sin_theta_1 - (V_tr/R_curve)*R_1A*sin_psi_1A,
        #10 - x_1B
            v_1B*cos_theta_1 - (V_tr/R_curve)*R_1B*cos_psi_1B,
        #11 - y_1B
            v_1B*sin_theta_1 - (V_tr/R_curve)*R_1B*sin_psi_1B,
        #12 - x_2A
            v_2A*cos_theta_2 - (V_tr/R_curve)*R_2A*cos_psi_2A,
        #13 - y_2A
            v_2A*sin_theta_2 - (V_tr/R_curve)*R_2A*sin_psi_2A,
        #14 - x_2B
            v_2B*cos_theta_2 - (V_tr/R_curve)*R_2B*cos_psi_2B,
        #15- y_2B
            v_2B*sin_theta_2 - (V_tr/R_curve)*R_2B*sin_psi_2B,
        ]

Когда я строю график решений f, я получаю плавный график.

dif_var_initial = [0.000, 0.000,    y_ctr_0,  -0.000, 140.0027, 140.0027, 0.000 ,  0.000,  x_1A_0, y_1A_0,  x_1B_0,  y_1B_0,  x_2A_0,  y_2A_0, x_2B_0, y_2B_0]

def dif_eqts(dif_var, t, kx1, ky1, cy1, M_car):
    global v_ax_1, v_ax_2,R_ctr,psi_ctr,Lamb_tk, A_tk, Time_max, delta_t, y_track_1_vector ,y_track_2_vector,R_curve, dRdt,z,j,v_1A,v_1B,v_2A,v_2B,P

    x_ctr, dx_ctrdt, y_ctr, dy_ctrdt, omega_1, omega_2, alpha, dalphadt, x_1A, y_1A, x_1B, y_1B, x_2A, y_2A, x_2B, y_2B = dif_var 

    #   Track disturbances
    eps_ax_1 = A_tk * np.sin(2.*np.pi*(V_tr/Lamb_tk)*t)
    eps_ax_1_tracker.append(eps_ax_1)
    .
    .
    .

Но, когда я делаю график, например, с помощью eps_ax_1_tracker, я получаю странные графики, которые не являются гладкими (программа явно больше, чем эта, но я не хочу утомлять вас чтением большого количества строк кода).

Например:

enter image description here

и ближе:

enter image description here

Это нормальное поведение? Я искал похожие проблемы, но не нашел ничего, что могло бы мне помочь.

Надеюсь, у вас есть несколько предложений, почему это происходит, и большое спасибо за вашу помощь.

Edit (1)

Я получаю вывод для x_ctr следующим образом: x_ctr

и для сил как: сила

Колебательное поведение - это неровности рельсовых путей. Надеюсь, это поможет.

1 Ответ

0 голосов
/ 26 апреля 2018

Числовые решатели используют «пробные» значения в состояниях, которые близки, но не находятся на траектории решения. Грубо говоря, это выборка поля направления вокруг траектории, так что вычисленное значение для следующего шага может быть более точным. Используйте документированные пути для получения выходных данных, в scipy.integrate.ode используйте плотный вывод через sol_out или аналогичный, см. Использование адаптивных размеров шагов с scipy.integrate.ode , для scipy.integrate.odeint используйте временной список входной аргумент для определения точек выборки, о которых сообщается в выходных данных.

...