Arrays 在odeint中将numpy数组用作参数

Arrays 在odeint中将numpy数组用作参数,arrays,python-2.7,numpy,scipy,odeint,Arrays,Python 2.7,Numpy,Scipy,Odeint,我正试图用odeint解一个微分方程组。我有4个txt文件(如下图所示)。我阅读它们并将它们保存在numpy数组中(长度:8000)(可能不是最有效的方法,但无论如何…)。我想在odeint中将这4个数组作为参数传递并求解系统。例如,每次odeint(8000中的一个)求解系统时,我都希望它使用不同于这些数组的值。有没有什么方法可以在不陷入for循环的情况下自动完成?我试图这样做(见下面的代码),但我得到了错误: if g2>0: ValueError: The truth value o

我正试图用odeint解一个微分方程组。我有4个txt文件(如下图所示)。我阅读它们并将它们保存在numpy数组中(长度:8000)(可能不是最有效的方法,但无论如何…)。我想在odeint中将这4个数组作为参数传递并求解系统。例如,每次odeint(8000中的一个)求解系统时,我都希望它使用不同于这些数组的值。有没有什么方法可以在不陷入for循环的情况下自动完成?我试图这样做(见下面的代码),但我得到了错误:

if g2>0: ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
g2应该是odeint的每个循环的1x1大小。因此,它必须与我使用4个数组(xdot、ydot、xdotdot、ydotdot)的方式有关

我是python新手,在Ubuntu 16.04 LTS上使用python 2.7.12。 先谢谢你。

将numpy导入为np
从scipy.integrate导入odeint
将matplotlib.pyplot作为plt导入
附加质量=0.03千克
附加质量=0.04
mb=0.3千克
m1=mb-添加的质量
m2=mb-增加的质量
l1=0.07米
l2=0.05米
J=0.00050797#kgm^2
Sa=0.0110#m^2
Cd=2.44
Cl=3.41
Kd=0.000655千克/平方米
r=1000千克/米^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
θ0=10*(np.pi/180)#rad
θ=20*(np.pi/180)#rad
f=2#Hz
###################################################################
t=np.linspace(01008000)#s
###################################################################
#将txt文件中的数据保存到numpy数组中
xdot_列表=[]
ydot_列表=[]
xdotdot_list=[]
ydotdot_列表=[]
以open('xdot.txt','r')作为文件句柄:
filecontents=filehandle.readlines()
对于文件内容中的行:
当前位置=行[:-1]
xdot\u list.append(当前位置)
xdot=np.array(xdot_列表,dtype=np.float32)
以open('ydot.txt','r')作为文件句柄:
filecontents=filehandle.readlines()
对于文件内容中的行:
当前位置=行[:-1]
ydot_list.append(当前位置)
ydot=np.array(ydot_列表,dtype=np.float32)
以open('xdotdot.txt','r')作为文件句柄:
filecontents=filehandle.readlines()
对于文件内容中的行:
当前位置=行[:-1]
xdotdot\u list.append(当前位置)
xdotdot=np.array(xdotdot_列表,dtype=np.float32)
以open('ydotdot.txt','r')作为文件句柄:
filecontents=filehandle.readlines()
对于文件内容中的行:
当前位置=行[:-1]
ydotdot_list.append(当前位置)
ydotdot=np.array(ydotdot_列表,dtype=np.float32)
def反转(k、t、xdot、ydot、xdotdot、ydotdot):
vcx_i=k[0]
vcy_i=k[1]
psi_i=k[2]
wz_i=k[3]
θi=k[4]
θi=k[5]
#子系统4
vcx_i=xdot*np.cos(psi_i)-ydot*np.sin(psi_i)
vcy_i=ydot*np.cos(psi_i)+xdot*np.sin(psi_i)
psidot_i=wz_i
vcxdot_i=xdotdot*np.cos(psi_i)-xdot*np.sin(psi_i)*psidot_i-ydotdot*np.sin(psi_i)-ydot*np.cos(psi_i)*psidot_i
vcydot_i=ydotdot*np.cos(psi_i)-ydot*np.sin(psi_i)*psidot_i+xdotdot*np.sin(psi_i)+xdot*np.cos(psi_i)*psidot_i
g1=-(m1/c3)*vcxdot_i+(m2/c3)*vcy_i*wz_i-(c1/c3)*vcx_i*np.sqrt((vcx_i**2)+(vcy_i**2))+(c2/c3)*vcy_i*np sqrt((vcx_i**2)+np arctan2(vcy_i,vcx_i)
g2=(m2/c3)*vcydot_i+(m1/c3)*vcx_i*wz_i+(c1/c3)*vcy_i*np.sqrt((vcx_i**2)+(vcy_i**2))+(c2/c3)*vcx_i*np sqrt((vcx_i**2)+np arctan2(vcy_i,vcx_i)
A=12*np.sin(2*np.pi*f*t+np.pi)#eksiswsi tail#u频率apo simulink
如果A>=0.1:
wzdot_i=((m1-m2)/J)*vcx_i*vcy_i-c4*wz_i**2*np.符号(wz_i)-c5*g2-c6*np.sqrt((g1**2)+(g2**2))
elif A0:
θi=np.arctan2(g1,g2)
elif g2=0:
θi=np.arctan2(g1,g2)-np.pi

elif G2你希望我们做什么?看着你的
g2
计算,我的眼睛呆滞了。你不能输入一些诊断打印来检查g2的大小和键输入吗?如果我在g2定义之后打印g2,它会显示为一个列表:[0.-9.03776932-18.75782013…,-0.07217789-2.3700428-5.73972082]。它应该只是一个数字,因为它仍然在函数中。只有在计算系统后,数据才会保存到列表中,不带逗号,它实际上是一个
numpy
数组<代码>g2。形状
将显示其大小。该方程使用了
vcydot_i
,它是从定义为数组的
xdotdot
派生出来的。同样地,
ydotdot
。你是对的。g2的形状是(8000,),就像ydotdot一样。这意味着我的错误是在设置odeint和逆函数的参数。这是使用数组作为参数的正确方法吗?我想每次只取数组中的一个数字进行计算。这里给出了一个类似的简化问题的答案:你希望我们做什么?看着你的
g2
计算,我的眼睛呆滞了。你不能输入一些诊断打印来检查g2的大小和键输入吗?如果我在g2定义之后打印g2,它会显示为一个列表:[0.-9.03776932-18.75782013…,-0.07217789-2.3700428-5.73972082]。它应该只是一个数字,因为它仍然在函数中。只有在计算系统后,数据才会保存到列表中,不带逗号,它实际上是一个
numpy
数组<代码>g2。形状将显示其大小。该方程使用了
vcydot_i
,它是从定义为数组的
xdotdot
派生出来的。同样地,
ydotdot
。你是对的。g2的形状是(8000,),就像ydotdot一样。这意味着我的错误是在设置odeint和逆函数的参数。这是使用数组作为参数的正确方法吗?我希望每次只取数组中的一个数字进行计算。下面给出了一个类似简化问题的答案:
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

###################################################################

# Save data from txt files into numpy arrays
xdot_list = []
ydot_list = []
xdotdot_list = []
ydotdot_list = []

with open('xdot.txt', 'r') as filehandle:
    filecontents = filehandle.readlines()

    for line in filecontents:
        current_place = line[:-1]
        xdot_list.append(current_place)

xdot = np.array(xdot_list, dtype=np.float32) 

with open('ydot.txt', 'r') as filehandle:
    filecontents = filehandle.readlines()

    for line in filecontents:
        current_place = line[:-1]
        ydot_list.append(current_place)

ydot = np.array(ydot_list, dtype=np.float32)

with open('xdotdot.txt', 'r') as filehandle:
    filecontents = filehandle.readlines()

    for line in filecontents:
        current_place = line[:-1]
        xdotdot_list.append(current_place)

xdotdot = np.array(xdotdot_list, dtype=np.float32) 

with open('ydotdot.txt', 'r') as filehandle:
    filecontents = filehandle.readlines()

    for line in filecontents:
        current_place = line[:-1]
        ydotdot_list.append(current_place)

ydotdot = np.array(ydotdot_list, dtype=np.float32) 

def inverse(k,t,xdot,ydot,xdotdot,ydotdot):
    vcx_i = k[0]
    vcy_i = k[1]
    psi_i = k[2]
    wz_i = k[3]
    theta_i = k[4]
    theta_deg_i = k[5]

    # Subsystem 4
    vcx_i = xdot*np.cos(psi_i)-ydot*np.sin(psi_i)
    vcy_i = ydot*np.cos(psi_i)+xdot*np.sin(psi_i)
    psidot_i = wz_i
    vcxdot_i = xdotdot*np.cos(psi_i)-xdot*np.sin(psi_i)*psidot_i-ydotdot*np.sin(psi_i)-ydot*np.cos(psi_i)*psidot_i
    vcydot_i = ydotdot*np.cos(psi_i)-ydot*np.sin(psi_i)*psidot_i+xdotdot*np.sin(psi_i)+xdot*np.cos(psi_i)*psidot_i

    g1 = -(m1/c3)*vcxdot_i+(m2/c3)*vcy_i*wz_i-(c1/c3)*vcx_i*np.sqrt((vcx_i**2)+(vcy_i**2))+(c2/c3)*vcy_i*np.sqrt((vcx_i**2)+(vcy_i**2))*np.arctan2(vcy_i,vcx_i)
    g2 = (m2/c3)*vcydot_i+(m1/c3)*vcx_i*wz_i+(c1/c3)*vcy_i*np.sqrt((vcx_i**2)+(vcy_i**2))+(c2/c3)*vcx_i*np.sqrt((vcx_i**2)+(vcy_i**2))*np.arctan2(vcy_i,vcx_i)

    A = 12*np.sin(2*np.pi*f*t+np.pi) # eksiswsi tail_frequency apo simulink
    if A>=0.1:
        wzdot_i = ((m1-m2)/J)*vcx_i*vcy_i-c4*wz_i**2*np.sign(wz_i)-c5*g2-c6*np.sqrt((g1**2)+(g2**2))
    elif A<-0.1:
        wzdot_i = ((m1-m2)/J)*vcx_i*vcy_i-c4*wz_i**2*np.sign(wz_i)-c5*g2+c6*np.sqrt((g1**2)+(g2**2))
    else:
        wzdot_i = ((m1-m2)/J)*vcx_i*vcy_i-c4*wz_i**2*np.sign(wz_i)-c5*g2

    # Subsystem 5
    if g2>0:
        theta_i = np.arctan2(g1,g2)
    elif g2<0 and g1>=0:
        theta_i = np.arctan2(g1,g2)-np.pi
    elif g2<0 and g1<0:
        theta_i = np.arctan2(g1,g2)+np.pi
    elif g2==0 and g1>0:
        theta_i = -np.pi/2
    elif g2==0 and g1<0:
        theta_i = np.pi/2
    elif g1==0 and g2==0:
        theta_i = 0

    theta_deg_i = (theta_i*180)/np.pi


    return [vcxdot_i, vcydot_i, psidot_i, wzdot_i, theta_i, theta_deg_i]

# initial conditions
vcx_i_0 = 0.1257
vcy_i_0 = 0
psi_i_0 = 0
wz_i_0 = 0
theta_i_0 = 0
theta_deg_i_0 = 0
#theta_i_0 = 0.1745
#theta_deg_i_0 = 9.866
k0 = [vcx_i_0, vcy_i_0, psi_i_0, wz_i_0, theta_i_0, theta_deg_i_0]

# epilysi systimatos diaforikwn
k = odeint(inverse, k0, t, args=(xdot,ydot,xdotdot,ydotdot), tfirst=False)

# apothikeysi apotelesmatwn
vcx_i = k[:,0]
vcy_i = k[:,1]
psi_i = k[:,2]
wz_i = k[:,3]
theta_i = k[:,4]
theta_deg_i = k[:,5]

# Epanalipsi tu Subsystem 5 gia na mporun na plotaristun ta theta_i, theta_deg_i
theta_i = [inverse(k_i, t_i)[4] for t_i, k_i in zip(t, k)]
theta_deg_i = [inverse(k_i, t_i)[5] for t_i, k_i in zip(t, k)]

# Ypologismos mesis gwnias theta kai platus talantwsis
mesi_gwnia = sum(theta_i)/len(theta_i) # rad
platos = (max(theta_i)-min(theta_i))/2