我已經實現了無樞軸的高斯算法。高斯算法顯示意外的行爲
import matplotlib.pyplot as plt
import numpy as np
import scipy as sp
def gauss_solve(A,b):
"""
args: coefficient matrix A of dim(nxn) and vector b of dim(n)
of a system of linear equations with n unknowns.
note: no zeroes on the main diagonal of A allowed!
returns: vector x of dim(n) which solves the SLE
"""
while np.ndim(A) != 2 or A.shape[0] != A.shape[1]:
A = input(["The matrix you entered is not square, specify new input matrix A: "])
# print "A ok."
while np.ndim(b) != 1 or A.shape[1] != b.shape[0]:
b = input(["The dimension of the constant vector b is incorrect, please specify new input vector b"])
# print "b ok."
if np.linalg.det(A) == 0:
return "This linear system doesn't have a single unique solution."
# print "System does have solution: "
n = len(b)
for i in xrange(n): # create triangular matrix
if A[i,i] == 0:
return "This implementation doesn't allow A to have zero entries on the main diagonal."
A[i] = A[i]/float(A[i,i])
b[i] = b[i]/float(A[i,i])
for l in xrange(i+1,n):
A[l] -= A[i]*A[l,i]
b[l] -= b[i]*A[l,i]
r = np.zeros(n) # result
for i in xrange(n):
r[-(i+1)] = b[-(i+1)] - np.dot(r,A[-(i+1)])
return r
def test_gauss():
m = 10
e = 0.1
A = sp.rand(m,m)
# A,b = np.array([[e,1.],[1.,1.]]),np.array([1.,e])
b = sp.rand(m)
print gauss_solve(A,b)
print "Build-in function says: \n", np.linalg.solve(A,b)
test_gauss()
測試函數可以生成用於A
b
和隨機條目。一切都運行完美我想,但我這裏有一個矩陣導致意想不到的結果:
A = [[e 1] [1 1]]
b = [1 e]
對於e != 1
的解析解
x = [-1 e+1]
但我試過e
一些值,我只是不」得到分析解決方案。即使內置函數solve(A,b)
失敗。例如x
的第一個條目總是0
(儘管它應該是-1
,完全獨立於e
)。有誰能解釋爲什麼會發生這種情況?
在行'b [i] = b [i]/float(A [i,i])',你使用的是'A [i,i]'的* new *值,它總是是'1.0',這要感謝上一行。對於行'b [l] - = b [i] * A [l,i]'也是如此。 –
@NPE:我,作爲我,我自己;) – Michael
@Michael:LOL。我已經修復了格式。 :) – NPE