高斯消除与枢轴python

时间:2020-03-29 09:49:56

标签: python loops for-loop equation algebra

我正在尝试创建一个函数,该函数可以通过旋转进行高斯消除来求解线性方程。但是,即使尺寸很好,我也会遇到关于矩阵尺寸的错误。可能是什么问题? 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 :(得分:1)

必须修改一些行才能使其正常运行。虽然大多数是正确的。顺便说一句,我假设数组元素是float类型的,以保留系数的小数值。此外,我还跳过了将两个数组合并为一个数组的操作。虽然您可以根据需要进行更改。从逻辑上讲没什么区别。

  1. 发现max列(我相信波兰语为weirz)后,您 以后不使用它,而是使用k。我更改了线路以使用weirsz。
  2. 每次找到新的最大值时,您都在交换每一行。我已将此for循环推出,以便每列仅交换一次。 (我相信这是@DarryIG暗示的循环)并且仅当行不在正确的位置时才进行交换。
  3. 第三个嵌套的forloop的行和列索引已互换,因此将其修复。
  4. 最后一个for循环也出现索引问题。另外,我也不想更改计算出的矩阵项,所以改用temp变量。

希望这会有所帮助!

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))