免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2975 | 回复: 5
打印 上一主题 下一主题

新手求助:自编高斯消元if判断怎么不起作用? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-03-13 16:31 |只看该作者 |倒序浏览
编了个小代码,用高斯消元的方法把一个行列式变成上三角的,代码如下:
  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除情况,怎么没起作用?求高手指点

论坛徽章:
0
2 [报告]
发表于 2011-03-14 08:41 |只看该作者
这是很低级的问题吗,查看数100+却没人回复。。。。。

论坛徽章:
0
3 [报告]
发表于 2011-03-14 09:37 |只看该作者
本帖最后由 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 值

论坛徽章:
0
4 [报告]
发表于 2011-03-14 12:36 |只看该作者
回复 3# iamkey9


    我试过了,是1啊,

论坛徽章:
0
5 [报告]
发表于 2011-03-14 14:05 |只看该作者
本帖最后由 iamkey9 于 2011-03-14 14:06 编辑
回复  iamkey9


    我试过了,是1啊,
lj2009jl 发表于 2011-03-14 12:36


问题是你写b时候的表达式,python中这种表达式是基于“引用”方式的,所以会有问题,看如下代码

>>> b = [[1]*3]*3
>>> b
[[1, 1, 1], [1, 1, 1], [1, 1, 1]]
>>> b[0][0] = 0
>>> b
[[0, 1, 1], [0, 1, 1], [0, 1, 1]]
>>>
====================
>>> b = [[1, 1, 1], [1, 1, 1], [1, 1, 1]]
>>> b[0][0] = 0
>>> b
[[0, 1, 1], [1, 1, 1], [1, 1, 1]]

你的函数改变了b本身,所以你的检测随之无效

论坛徽章:
0
6 [报告]
发表于 2011-03-15 08:40 |只看该作者
回复 5# iamkey9


    奥,是这样啊,谢谢,原来是我用错了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP