zoukankan      html  css  js  c++  java
  • 高斯消元法的MATLAB和PYTHON实现

    什么是高斯消元法?请见维基百科的定义

    MATLAB实现:

    function x = gauss(a,b)
    
    n = length(b);
    for i = 1 : n-1
    for j = (i+1) : n
    if a(i,i)~=0
    lam = a(j,i)/a(i,i);
    a(j,(i+1):n) = a(j,(i+1):n) - lam*a(i,(i+1):n);
    b(j) = b(j) -lam*b(i);
    end
    end
    end
    for i = n:-1:1
    b(i) = (b(i) - sum(a(i,(i+1):n).*b((i+1):n)))./a(i,i);
    end
    x = b;

    PYTHON实现:

    import numpy
    
    numpy import dot

    def gauss(a,b):
    n = len(b)
    for i in range(0,n-1):
    for j in range(i+1,n):
    #print a[j,i]
    if a[j,i] != 0.0:
    lam = float(a[j,i])/a[i,i]
    a[j,(i+1):n] = a[j,(i+1):n] - lam*a[i,(i+1):n]
    b[j] = b[j] - lam*b[i]
    for k in range(n-1,-1,-1):
    b[k] = (b[k] - dot(a[k,(k+1):n],b[(k+1):n]))/a[k,k]
    result = b
    return result

    x = numpy.matrix([[2,1,-1],[-3,-1,2],[-2,1,2]],dtype = numpy.float)
    aa = numpy.matrix([[2,1,-1],[-3,-1,2],[-2,1,2]], dtype = numpy.float)
    y = numpy.array([8,-11,-3],dtype = numpy.float)
    bb = numpy.array([8,-11,-3], dtype = numpy.float)
    c = gauss(aa,bb)

    这次练习过程中发现的一个问题是关于矩阵变量的传递的问题,gauss(aa,bb)函数调用后,aa和bb的值都将会被修改,利用Python的id语句可以查看函数外的参数aa,bb和函数内的参数a和b的id,发现他们是一样的,这个问题应该怎么解决,怎样像C一样进行数值传递呢?目前能够想到的办法只有在函数中复制一下matrix,但是矩阵复制貌似和列表复制有所区别。列表的赋值使用b = a[:]就可以了,但是matrix不行…

    终于找到答案了!利用matrix内置的method copy!

    >>> x
    matrix([[ 2.,  1., -1.],
            [-3., -1.,  2.],
            [-2.,  1.,  2.]])
    >>> y = x.copy()
    >>> y
    matrix([[ 2.,  1., -1.],
            [-3., -1.,  2.],
            [-2.,  1.,  2.]])
    >>> id(x)
    32482800
    >>> id(y)
    39972208

    list还是使用原来的方法进行复制,因为list里面没有copy这个method,在matrix或者dict中都有copy这个method用来实现真正的复制!

  • 相关阅读:
    go
    go
    go
    postgresql
    go
    go
    sql
    铂金软件公司
    HRIS 的价值评估
    [转]数据库SQL优化大总结之 百万级数据库优化方案
  • 原文地址:https://www.cnblogs.com/bovine/p/2264498.html
Copyright © 2011-2022 走看看