«RuntimeError: массив, возвращаемый func, должен быть одномерным, но получил ndim = 2». - PullRequest
0 голосов
/ 15 января 2019

Я хочу решить эту систему дифференциальных уравнений 3-3, используя odeint, и получаю эту ошибку:

Traceback (most recent call last):
  File "/home/spyros/Documents/Spyros/Diplwmatiki/ROS/Serial connection/Dynamic_problem.py", line 81, in <module>
    u = odeint(subsystem2,u0,t)
  File "/usr/local/lib/python2.7/dist-packages/scipy/integrate/odepack.py", line 233, in odeint
    int(bool(tfirst)))
RuntimeError: The array return by func must be one-dimensional, but got ndim=2.

Я читаю эти похожие темы: Как решить систему дифференциальных уравнений с помощью scipy.odeint ошибка с odeint (RuntimeError: массив, возвращаемый функцией, должен быть одномерным, но получил ndim = 2.) Ошибка оптимизации Scipy но я не нашел, как решения могут быть реализованы в моей проблеме. Как это возможно, что возвращаемый массив имеет размерность = 2. У меня есть 3 переменные на входе функции, 3 дифференциальных уравнения и те же уравнения в возвращаемом массиве. Как я могу решить эту ошибку? Заранее спасибо.

import numpy as np 
from scipy.integrate import odeint 
import matplotlib.pyplot as plt

added_mass_x = 0.03 # kg 
added_mass_y = 0.04 
mb = 0.3 # kg 
m1 = mb-added_mass_x 
m2 = mb-added_mass_y 
l1 = 0.07 # m 
l2 = 0.05 # m 
J = 0.00050797 # kgm^2 
Sa = 0.0110 # m^2 
Cd = 2.44 
Cl = 3.41 
Kd = 0.000655 # kgm^2 
r = 1000 # kg/m^3

c1 = 0.5*r*Sa*Cd 
c2 = 0.5*r*Sa*Cl 
c3 = 0.5*mb*(l1**2) 
c4 = Kd/J 
c5 = (1/(2*J))*(l1**2)*mb*l2 
c6 = (1/(3*J))*(l1**3)*mb

theta_0 = 10*(np.pi/180) # rad 
theta_A = 20*(np.pi/180) # rad 
f = 2 # Hz

t = np.linspace(0,100,8000) # s 
omega = 2*np.pi*f # rad/s 
theta = theta_0 + theta_A*np.sin(omega*t) # rad 
theta_deg = (theta*180)/np.pi # deg 
thetadotdot = -(omega**2)*theta_A*np.sin(omega*t) # rad/s^2

def subsystem2(u,t):
    vcx = u[0]
    vcy = u[1]
    wz = u[2]

    vcxdot = (m2/m1)*vcy*wz-(c1/m1)*vcx*np.sqrt((vcx**2)+(vcy**2))+(c2/m1)*vcy*np.sqrt((vcx**2)+(vcy**2))*np.arctan2(vcy,vcx)-(c3/m1)*thetadotdot*np.sin(theta)
    vcydot = -(m1/m2)*vcx*wz-(c1/m2)*vcy*np.sqrt((vcx**2)+(vcy**2))-(c2/m2)*vcx*np.sqrt((vcx**2)+(vcy**2))*np.arctan2(vcy,vcx)+(c3/m2)*thetadotdot*np.cos(theta)
    wzdot = ((m1-m2)/J)*vcx*vcy-c4*wz*wz*np.sign(wz)-c5*thetadotdot*np.cos(theta)-c6*thetadotdot

    return [vcxdot,vcydot,wzdot]

# arxikes synthikes 
vcx_0 = 0 
vcy_0 = 0 
wz_0 = 0 
u0 = [vcx_0,vcy_0,wz_0]

# epilysi systimatos diaforikwn 
u = odeint(subsystem2,u0,t,tfirst=False)

vcx = u[:,0] 
vcy = u[:,1] 
wz = u[:,2]

1 Ответ

0 голосов
/ 18 января 2019

Мне удалось решить эту проблему, переместив четыре уравнения (omega, theta, theta_deg и thetadotdot) в точку, прямо перед vcxdot. Я не знаю, в чем именно была проблема, но после этого она работает нормально.

...