matlab高斯消元,高斯消元法的MATLAB和PYTHON实现 | 学步园

Img_line.gif

Img_line.gif

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

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用来实现真正的复制!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值