1

我已经实现了一个没有旋转的高斯算法。

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)。谁能解释为什么会这样?

4

1 回答 1

1

A您对和的并行更新b正确,因为您正在b使用. 您需要替换以下行:A

A[i] = A[i]/float(A[i,i])
b[i] = b[i]/float(A[i,i])

有类似的东西:

divisor = A[i,i]
A[i] = A[i]/float(divisor)
b[i] = b[i]/float(divisor)

同样,这些行:

A[l] -= A[i]*A[l,i]
b[l] -= b[i]*A[l,i]

multiplier = A[l,i]
A[l] -= A[i]*multiplier
b[l] -= b[i]*multiplier

在您的原始代码中,b什么都不做的行(忽略浮点精度问题):代码的第一部分除以b[i],而1.0第二部分从.0.0b[i]b[l]

于 2012-12-01T18:00:58.527 回答