让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)
由长度与a,b,c,d,e,f,g,w
相同的numpy数组x
构建。
让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等矩阵的创建移出循环,从而加快了速度。但是,是否可以进一步加快速度?