我正在尝试创建一个函数,该函数可以通过旋转进行高斯消除来求解线性方程。但是,即使尺寸很好,我也会遇到关于矩阵尺寸的错误。可能是什么问题? 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个维
答案 0 :(得分:1)
必须修改一些行才能使其正常运行。虽然大多数是正确的。顺便说一句,我假设数组元素是float类型的,以保留系数的小数值。此外,我还跳过了将两个数组合并为一个数组的操作。虽然您可以根据需要进行更改。从逻辑上讲没什么区别。
希望这会有所帮助!
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))