我对Python和Numpy很陌生,所以如果我在这里遗漏了一些明显的东西,我会道歉。
我有一个函数可以解决一个由2个微分方程组成的系统:
import numpy as np
import numpy.linalg as la
def solve_ode(x0, a0, beta, t):
At = np.array([[0.23*t, (-10**5)*t], [0, -beta*t]], dtype=np.float32)
# get eigenvalues and eigenvectors
evals, V = la.eig(At)
Vi = la.inv(V)
# get e^At coeff
eAt = V @ np.exp(evals) @ Vi
xt = eAt*x0
return xt
但是,使用以下代码运行它:
import matplotlib.pyplot as plt
# initial values
x0 = 10**6
a0 = 2.5
beta = 0.05
t = np.linspace(0, 3600, 360)
plt.semilogy(t, solve_ode(x0, a0, beta, t))
...抛出此错误:
ValueError: setting an array element with a sequence.
在这一行:
At = np.array([[0.23*t, (-10**5)*t], [0, -beta*t]], dtype=np.float32)
请注意,t
和beta
应为floats
。我认为Python可能无法推断出这一点,但我不知道如何做到这一点......
提前帮助你。
答案 0 :(得分:1)
您正在从linspace提供t
作为形状360的numpy数组而不仅仅是一个浮点数。由于所有列的长度必须相同,因此您尝试创建的At
numpy数组生成错误。在python中,列表和numpy数组之间存在重要差异。例如,您可以在此处作为列表列表执行操作,例如
At = [[0.23*t, (-10**5)*t], [0, -beta*t]]
尺寸[[360 x 360] x [1 x 360]]。
或者,如果At的所有元素都是t
数组的长度,
At = np.array([[0.23*t, (-10**5)*t], [t, -beta*t]], dtype=np.float32)
形状[2,2,360]。
答案 1 :(得分:1)
当您提供list
或list
list
时,或者在这种情况下,list
list
lists
s,所有这些都应该具有相同的长度,以便numpy
可以自动推断出结果矩阵的维度(形状)。
在您的示例中,除了您将0
作为列放置的部分之外,它都被正确放置了。不知道该怎么称呼它,因为我想你的预期输出是一个立方体。
您可以通过提供正确数量的零来修复它:
At = np.array([[0.23*t, (-10**5)*t], [np.zeros(len(t)), -beta*t]], dtype=np.float32)
但请检查生成的数组的.shape
,并确保它符合您的要求。
答案 2 :(得分:0)
其他人注意到问题是内部列表中的0
。它与其他表达式生成的360
长度数组不匹配。 np.array
可以从那个(2x2)创建一个对象dtype数组,但不能创建一个浮点数。
At = np.array([[0.23*t, (-10**5)*t], [0*t, -beta*t]])
产生一个(2,2,360)阵列。但我怀疑该函数的其余部分是围绕At
是(2,2) - 带有eig
,inv
等的2d方阵的假设而构建的。
应该是什么回报xt
?
这有用吗?
S = np.array([solve_ode(x0, a0, beta, i) for i in t])
为1d数组提供与t
中相同数量的值?
我并不是说这是解决问题的最快方法,但它是最简单的,特别是如果你只生成360值。