Вот код, который работает:
for iElem in range(nElem) :
nodes = elem[iElem]
x = X[nodes]
y = Y[nodes]
jac = abs((x[0]-x[1]) * (y[0]-y[2]) - (x[0]-x[2])* (y[0]-y[1]))
B[iElem,:] = np.dot(Ainverse,B[iElem])/jac
Вот код, который не работает
x2 = X[elem]
y2 = Y[elem]
jac2 = abs((x2[:,0] - x2[:,1]) * (y2[:,0]-y2[:,2]) - (x2[:,0]-x2[:,2])* (y2[:,0]-y2[:,1]))
iJac2 = np.power(jac2,-1)
K = np.zeros(np.shape(B))
F = np.zeros(np.shape(B))
K = np.einsum('ih,jh->ji',Ainverse,B)
F = np.einsum('ih,i->ih',K,iJac2)
B = F
Видимо, когда я печатаю B с наивным методом и B сМетод einsum содержит те же элементы, но когда я его использую, следующий код не имеет того же значения и выдает предупреждение:
RuntimeWarning: переполнение обнаружено при умножении
RuntimeWarning: возникло переполнениев дополнения .,.
.Ошибки, похоже, не связаны с изменением кода, но это единственное, что меняется от одного запуска без ошибок и одного с ошибками
На мой взгляд, эта ошибка вообще не понятна.
I 'мы пытались найти разницу dtype в массиве, созданном numpy, но они одинаковы в обоих подходах.