+ -
当前位置:首页 → 问答吧 → 新手求助:自编高斯消元if判断怎么不起作用?

新手求助:自编高斯消元if判断怎么不起作用?

时间:2011-03-13

来源:互联网

编了个小代码,用高斯消元的方法把一个行列式变成上三角的,代码如下:
  1. def dyh_gauss_elimination(list1):
  2.         # This function is used to transform a determination to upper-triangle determination
  3.         temp = list1
  4.         if dyh_query_dimensionality(temp)!=2:
  5.                 print 'This is not a determination'
  6.                 return False
  7.         loop = min([len(temp),len(temp[0])])
  8.         tolerance = 0.001
  9.         for i in range(1,loop):
  10.                 # check the first dimension
  11.                 if abs(temp[i-1][i-1]) < tolerance:
  12.                         for j in range(i,len(temp)):
  13.                                 if abs(temp[j][i-1]) > tolerance:
  14.                                         temp1 = temp[i-1]
  15.                                         temp[i-1] = temp[j]
  16.                                         temp[j] = temp1
  17.                                         break
  18.                 if abs(temp[i-1][i-1]) >= tolerance:
  19.                         for j in range(i,len(temp)):
  20.                                 lambda1 = -1.0 * temp[j][i-1]/temp[i-1][i-1]
  21.                                 for k in range(i-1,len(temp[j])):
  22.                                         temp[j][k] += lambda1 * temp[i-1][k]
  23.        
  24.         return temp
复制代码
测试情况如下:
  1. >>> from dyh_models import dyh_gauss_elimination as dyh
  2. >>> b = [[4,-2,1],[-2,4,-2],[1,-2,4]]
  3. >>> dyh(b)
  4. [[4, -2, 1], [0.0, 3.0, -1.5], [0.0, 0.0, 3.0]]
  5. >>> b = [[1]*3]*3
  6. >>> b
  7. [[1, 1, 1], [1, 1, 1], [1, 1, 1]]
  8. >>> dyh(b)
  9. Traceback (most recent call last):
  10.   File "<stdin>", line 1, in ?
  11.   File "H:\ABAQUS\dyh_models\dyh_models.py", line 228, in dyh_gauss_elimination
  12.     lambda1 = -1.0 * temp[j][i-1]/temp[i-1][i-1]
  13. ZeroDivisionError: float division
  14. >>> sys.version
  15. '2.4.3 (#0, Apr  2 2009, 18:40:00) [MSC v.1400 32 bit (Intel)]'
复制代码
我明明加了if来避免0除情况,怎么没起作用?求高手指点

作者: lj2009jl   发布时间: 2011-03-13

这是很低级的问题吗,查看数100+却没人回复。。。。。

作者: lj2009jl   发布时间: 2011-03-14

本帖最后由 iamkey9 于 2011-03-14 09:39 编辑

lambda1 = -1.0 * temp[j][i-1]/temp[i-1][i-1]

ZeroDivisionError: float division


除 0 错误? 你 print temp[i-1][i-1] 看看是什么值?
可能要import demical,  用demical 来处理python中的float 值

作者: iamkey9   发布时间: 2011-03-14