我的代码考虑了一个三维图,但是,我需要添加依赖于“t”的“s1”,也就是说,它可以根据另一个的时间进行替换。如果不使用s1,则代码运行良好。添加“s1”时出错
ValueError: setting an array element with a sequence. The requested array has an inhomogeneous shape after 1 dimensions. The detected shape was (6,) + inhomogeneous part.
字符串
我尝试了不同的解决方案,使用数组,列表,覆盖,检查内容-但这些数组中没有虚部。我在一些主题中发现回滚numpy版本有帮助,但回滚时我得到一个错误,只安装了最新版本。也许还有其他方法来解决这个问题?
import numpy as np
from scipy.integrate import odeint
import scipy.integrate as integrate
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
b = 0.5182
c = 0.22439
d = 1.465
a1 = 30
a2 = 30
eps = 0.1
s = np.random.normal(0, 1, 100000)
n = s[1]
s1 = []
for i in range(1000):
s1.append(s[i])
as1 = np.asarray (s1)
def f(x):
if x<=-1.2:
f = 0.528
if -1.2<x<1.2:
f = x*(1-x*x)
else:
f = -0.528
return f
def dH_dt(H, t=0,*s1):
return np.array([(H[1]+s1),
-H[0]-b*H[1]+H[2],
c*(a1*f(H[0])-H[2])-d*H[1],
(H[4]+eps*(H[0]+H[5]))+s1,
-H[3]-b*H[4]+H[5],
c*(a2*f(H[3])-H[5])-d*H[4]])
t = np.linspace(0, 100, 1000)
H0 = [0.05, 0.07, 0.09, 0.09, 0.09, 0.09]
H, infodict = integrate.odeint(dH_dt, H0, t, args=(s1,), full_output=True)
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot(H[:,0], H[:,1], H[:,2])
plt.show()
型
x1c 0d1x的数据
2条答案
按热度按时间ctehm74n1#
在
dH_dt
函数中,H
是一个numpy数组。在返回的第一个元素中,你有H[1]
,它的类型是np.float64
和s1
,它是一个包含list
的tuple
。当执行H[1] + s1
时,numpy会将s1
转换为numpy数组,并将H[1]
的值添加到每个元素中,从而得到一个numpy数组结果。您正在创建一个返回值,其中一些元素被转换为numpy数组,而其他元素(即没有s1
)的项仅为np.float64
。这就产生了一个不规则的阵列,集成商不知道如何处理。目前,我不能建议任何改变,因为我不知道你实际上想做什么。
mpgws1up2#
如果我把你的函数改成更具诊断性的:
字符串
运行表明,它试图从混合的形状-标量和(1,1000)-组成一个数组
型
错误在行中:
型
即使我将
s1
设置为标量float,也会得到列表形状为型
我必须将
dH+dt
签名更改为def dH_dt(H, t, s1):
,以使其针对标量s1
运行。此函数必须返回一个与
H0
,(6,)形状相同的数组型
它使用
lsoda from the FORTRAN library odepack
。lsoda
是编译过的,不能像你期望的那样从纯python/numpy代码中进行'广播'或'迭代'。它没有通常的numpy
尺寸灵活性。简而言之,您不能通过一次对该函数的调用来执行多次
odeint
运行。