Gauss 列主元消去法的Python程序

# -*- coding: UTF-8 -*- 
class ClassGauss(object):

	def __init__(self, a, b):	
		super(ClassGauss, self).__init__()
		self.a = a
		self.b = b
		self.n = len(self.b)

	def max(self, max_i, max_v, i, j):# get max
		a = self.a
		abs_of_a = abs(a[i][j])

		if max_v < abs_of_a:
			max_v = abs_of_a
			max_i = i
		return max_i, max_v

	def swap(self, ai, j):# change line
		a = self.a
		b = self.b
		n = self.n
		for i in range(0, n):
			temp = a[ai][i]
			a[ai][i] = a[j][i]
			a[j][i] = temp

			tempb = b[ai]
			b[ai] = b[j]
			b[j] = tempb

	def gauss(self):
		n = self.n
		max_i = 0 # line num of max value
		max_v = m = self.a[0][0]
		for j in range(0, n-1): 
			for i in range(j, n): 
				max_i, max_v = self.max(max_i, max_v, i, j)
			if max_v == 0:
				raise ValueError('no unique solution')
			if debug:
				print('max_v = %f' % max_v)
				print('max_i = %f , j = %f' % (max_i, j))
			if max_i != j:
				# jiaohuan ai hang he ajhang
				self.swap(max_i, j)
			if debug:
				print('SWAP*******')
				print(self.a)
				print(self.b)
			for p in range(j+1, n):
				l =  a[p][j] / a[j][j]
				# print('l = %f' % (l))
				b[p] -= l * b[j]
				for q in range(j, n):
					a[p][q] -= l * a[j][q]
			if debug:		
				print('CAL_a******')
				print(self.a)
				print(self.b)
			max_v = m
		if debug:
			print("************************")
			print(self.a)
			print(self.b)
		self.calculate()

	def calculate(self):
		n = self.n - 1
		xn = b[n] / a[n][n]
		print('xn = %f'% xn)
					
    
   
if __name__ == '__main__':
	# example1
    a = [[0.012, 0.0100, 0.1670],
         [1.000, 0.8334, 5.910],
         [3200, 1200, 4.200]]
    b = [0.6781, 12.10, 983.3]
    debug = False
    # example2
    # a = [[2.00, -4.00, 2.00],[1.00, 2.00, 3.00],[-3.00, -2.00, 5.00]]
    # b = [2.00, 3.00, 1.00]
    g = ClassGauss(a,b)
    g.gauss()	

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值