Гауссово исключение с поворотом python - PullRequest
0 голосов
/ 29 марта 2020

Я пытаюсь создать функцию, которая бы решала линейные уравнения с гауссовым исключением с поворотом. Однако я получаю ошибку о размерах матрицы, хотя размеры в порядке. В чем может быть проблема? a = np.array ([0,2,3], [4,6,7], [2, -3,6]) b = np.array ([8, -3,6])


Вот мой код:

import numpy as np 

def zad2(a,b):
    n=len(b)
    AB=np.append(a,b,axis=1) 
    x=np.zeros(n)  
    for i in range(n):  
        maks=abs(AB[i][i])
        wiersz=i
        for k in range(i+1,n): 
            if abs(AB[k][i])>maks: 
                maks=abs(AB[k][i])
                wiersz=k
                for l in range(i,n+1): 
                    el=AB[wiersz][l]
                    AB[wiersz][l]=AB[i][l]
                    AB[i][l]=el
         for k in range(i+1,n): 
            ws=AB[k][i]/AB[i][i] 
            for j in range(i,n+1): 
               AB[k][j]-=ws*AB[i][j]

    for i in range(n-1,-1,-1): 
        x[i]=AB[i][n]/AB[i][i]
        for k in range(i - 1, -1, -1):
            AB[k][n] -= AB[k][i] * x[i]
    return x

, поэтому я получаю: ValueError: все входные массивы должны иметь одинаковое количество измерений, но массив с индексом 0 имеет 2 измерения и массив с индексом 1 имеет 1 измерение (я)

1 Ответ

0 голосов
/ 29 марта 2020

пришлось изменить несколько строк, чтобы заставить его работать. Большая часть этого была правильна все же. Кстати, я предполагаю, что элементы массива имеют тип float для сохранения дробных значений коэффициентов. Кроме того, я пропустил объединение двух массивов в один. Хотя вы можете внести изменения, если это желательно. Логически это не имеет никакого значения.

  1. После обнаружения столбца max (weirsz в poli sh, я полагаю), вы не используете его позже, но используете k. Я изменил строки, чтобы использовать weirsz.
  2. Вы меняете каждую строку каждый раз, когда обнаруживается новый максимум. Я выдвинул это для l oop, чтобы поменять местами только один раз на столбец. (Я полагаю, что это l oop, на который намекает @DarryIG) И замена только в том случае, если строка уже не в нужном месте.
  3. Третий вложенный forl oop поменял местами индексы строк и столбцов, так исправил.
  4. Последний для l oop также имел проблему индекса. Кроме того, я не хотел изменять записи вычисленной матрицы, поэтому вместо этого использовал временную переменную.

Надеюсь, это поможет!

import numpy as np 

def zad2(a,b):
    print(a)
    print(b)
    print("Len:{0} Shape:{1}".format(len(a),a.shape))
    print("Len:{0} Shape:{1}".format(len(b),b.shape))
    n=len(b)
    x=np.zeros(n, dtype='f')

    for i in range(n):
        maks=abs(a[i,i])
        wiersz=i
        print("maks: ",maks)
        print("i: ",i)

        for k in range(i+1,n): 
            print("Searching Max row value for the a column: row_i (k): {0}, a[k,i]: {1}".format(k, a[k,i]))
            if abs(a[k,i])>maks:
                maks=abs(a[k,i])
                wiersz=k 
        if wiersz != i:
            a[wiersz], a[i] = (a[i].copy(),a[wiersz].copy()) # Swapping entire row at once
            b[i], b[wiersz] = (b[wiersz], b[i]) # Swapping entire row at one

        for k in range(i+1,n): #tworzenie macierzy trojkatnej 
            print('k: {0}, a[k,i]: {1}, a[i,i]: {2}'.format(k, a[k,i], a[i,i]))
            ws=a[k,i]/a[i,i] #wspolczynnik taki jak przy zwyklej metodzie Gaussa
            for j in range(i,n): #dla kolejnego wiersza eliminacja, wzor z zadania 1
                a[k,j]=a[k,j]- ws*a[i,j]
            b[k]=b[k]-ws*b[i]
        print("i: {0}, maks: {1}, wiersz: {2}".format(i,maks,wiersz))
        print(a)
        print(b)
        input()
    x[n-1] = b[n-1]/a[n-1,n-1]
    for i in range(n-1,-1,-1): #substytucja od konca
        temp = b[i]
        for k in range(i+1,n):
            temp -= a[i,k]*x[k]
        x[i] = (tem)/a[i,i]
    return x

a=np.array([[0,2,3],[4,6,7],[2,-3,6]], dtype='f')
b=np.array([8, -3, 6], dtype='f')

print(zad2(a,b))
...