Python - Точечный продукт среза ряда матрицы с срезом вектора - PullRequest
1 голос
/ 17 февраля 2020

Я пытаюсь написать простой код для исключения Гаусса.

import numpy as np

def g_elimination(A,B):
    n=A.shape[0]
    for i in range(0,n-1):# Pivot Rows where 1st pivot is Row 0
        for j in range(i+1,n):#Rows to transform exclude Row 0
            B[j]=B[j]-(A[j,i]/A[i,i])*B[i]
            A[j]=A[j]-np.dot(A[j,i]/A[i,i],A[i])


def back_substitution(X,A,B):
    n=B.shape[0]
    for i in reversed(range(0,n)): 
        X[i]=(B[i]-np.dot([X[:i]],A[i:,:i]))/A[i,i]



A=np.array([[4.0,-2,1],[-2,4,-2],[1,-2,4]])
B=np.array([11,-16,17],dtype='float64')
X=np.zeros(B.shape)

g_elimination(A,B)
back_substitution(X,A,B)

Во время фазы обратной замены я пытаюсь найти скалярное произведение среза строки матрицы A с срезом вектора X. Я получаю сообщение об ошибке

Traceback (most recent call last):
  File "main.py", line 25, in <module>
    back_substitution(X,A,B)
  File "main.py", line 16, in back_substitution
    X[i]=(B[i]-np.dot([X[:i]],A[i:,:i]))/A[i,i]
  File "<__array_function__ internals>", line 5, in dot
ValueError: shapes (1,2) and (1,2) not aligned: 2 (dim 1) != 1 (dim 0)

Может кто-нибудь помочь мне исправить эту ошибку.

1 Ответ

0 голосов
/ 17 февраля 2020

помогите мне исправить эту ошибку.

Для приведенных вами примеров данные np.dot в конечном итоге станут 1d и 2d, если вы переключитесь их около np.dot(2d,1d) эта ошибка исчезает. К сожалению, я не знаком с вашими вычислениями / процессами, поэтому я не знаю, хотите ли вы этого. Поскольку одним из терминов является 1d, мне интересно, предполагали ли вы, что это скаляр.

def back_substitution(X,A,B):
    n=B.shape[0]
    for i in reversed(range(0,n)):
        #X[i]=(B[i]-np.dot([X[:i]],A[i:,:i]))/A[i,i]
        q = X[:i]
        r = A[i:,:i]
        s = A[i,i]
        t = B[i]
        try:
            #u = np.dot([q],r)
            #u = np.dot(q,r)
            #u = np.dot(r,q)
            little,big = sorted([q,r],key=lambda w: w.ndim)
            u = np.dot(big,little)
        except ValueError as e:
            print(e)
            print(q)
            print(r)
            print(q.shape,r.shape)
            print('*****')
        v = (t-u)/s
        X[i] = v
        #print(X)

Это избавляет от оригинальной ValueError, о которой вы спрашивали, - но теперь X[i] = v жалуется, что вы пытаетесь установить элемент массива с последовательностью. Снова будучи незнакомым с тем, что вы пытаетесь сделать, я не знаю, каково это решение.

...