高斯消元法的MATLAB和PYTHON實現

來源:互聯網
上載者:User

什麼是高斯消元法?請見維基百科的定義

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用來實現真正的複製!

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.