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

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

测试函数可以为Ab生成随机条目。我觉得一切都很好,但我这里有一个矩阵,它会导致意想不到的结果:
A = [[e 1] [1 1]]
b = [1 e]

对于e != 1的情况,解析解为
x = [-1 e+1]

但我尝试了一些e的值,却没有得到解析解即使内置函数solve(A,b)也会失败。例如,x的第一个条目总是0(尽管它应该是-1,完全独立于e)有人能解释为什么会这样吗?

最佳答案

您对Ab的并行更新不正确,因为您正在使用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.0乘以b[i]

关于python - 高斯算法显示意外行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13661953/

10-11 04:37