设x
为间距不均匀的严格递增数组(例如x = np.array([0, .1, .3, .7, .99])
)。我有以下样条函数:
from scipy.interpolate import InterpolatedUnivariateSpline
a_ = InterpolatedUnivariateSpline(x, a)
b_ = InterpolatedUnivariateSpline(x, b)
c_ = InterpolatedUnivariateSpline(x, c)
d_ = InterpolatedUnivariateSpline(x, d)
e_ = InterpolatedUnivariateSpline(x, e)
f_ = InterpolatedUnivariateSpline(x, f)
g_ = InterpolatedUnivariateSpline(x, g)
w_ = InterpolatedUnivariateSpline(x, w)
它们是从长度与x
相同的numpy数组a,b,c,d,e,f,g,w
构建的
设w
是一个形状为(2,len(x))
的数组。我现在执行以下循环:
y1 = []
y2 = []
for ii in range(len(x)):
xi = x[ii]
A_1 = np.array([[ a_(xi), -a_(xi)],
[ 0, -b_(xi)]])
B_1 = np.array([[ -a_(xi), 0],
[ b_(xi), 0]])
C_1 = np.array([[ 1, 0],
[ c_(xi), 0]])
D_1 = np.array([[ 1, 0],
[ -d_(xi), 1]])
D_2 = np.array([[ -1, 0],
[ 0, e(xi)]])
Amat = A_1 + B_1 @ np.linalg.inv(D_1) @ C_1
Bmat = B_1 @ np.linalg.inv(D_1) @ D_2
Cmat = np.linalg.inv(D_1) @ C_1
Dmat = np.linalg.inv(D_1) @ D_2
K1 = np.array([f_(xi), g_(xi)])
y1 += [-Amat.T@w - Cmat.T@K1]
y2 += [ Dmat.T@K1 + Bmat.T@w ]
但是,这很慢,因为x
很大,我需要多次执行此循环
我的感觉是,我应该能够矢量化所有这些代码,它将非常快。然而,当我尝试这样做时,我遇到了@
矩阵乘法的问题:
MemoryError: Unable to allocate array with shape (4800, 4800, 4800) and data type float64
下面是我的尝试,使用产生该错误的代码:
nil = np.zeros(len(x))
A_1 = np.array([[ a_(x), -a_(x)],
[ nil, -b_(x)]])
B_1 = np.array([[-a_(x), nil],
[ b_(x), nil]])
C_1 = np.array([[ 1+nil, nil],
[ c_(x), nil]])
D_1 = np.array([[ 1+nil, nil],
[-d_(x), 1+nil]])
D_2 = np.array([[ nil-1, nil],
[ nil, e_(x)]])
Amat = A_1 + B_1 @ np.linalg.pinv(D_1) @ C_1
Bmat = B_1 @ np.linalg.pinv(D_1) @ D_2
Cmat = np.linalg.pinv(D_1) @ C_1
Dmat = np.linalg.pinv(D_1) @ D_2
K1 = np.array([f_(x), g_(x)])
Cmat.T@K1 # produces the error
在一个基本的层次上,我可以将a_1等矩阵的创建移到循环之外,这样可以加快创建速度。然而,是否有可能进一步加快速度
目前没有回答
相关问题 更多 >
编程相关推荐