声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 2959|回复: 15

[编程技巧] 行列式的值怎么了?

[复制链接]
发表于 2006-9-12 09:56 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
ans =

  1.0e+004 *

    0.4306    0.1683   -0.0117
   -4.0238    1.4665   -0.9384
    0.4306    0.1683   -0.0117

K>> a=10*ans

a =

  1.0e+005 *

    0.4306    0.1683   -0.0117
   -4.0238    1.4665   -0.9384
    0.4306    0.1683   -0.0117

K>> det(a)

ans =

     0

以上是对的,这毫无疑问。请继续看下面:
a=10.^5*f(VertexList(2,:),Num,second,Vnum,VertexList,subVertexList)
%f(VertexList(2,:),Num,second,Vnum,VertexList,subVertexList)是个内联函数,你大可不必管
a =

  1.0e+005 *

    0.4306    0.1683   -0.0117
   -4.0238    1.4665   -0.9384
    0.4306    0.1683   -0.0117

K>> det(a)

ans =

   -0.0238
为什么这个不等于0呢?望大家赐教。
回复
分享到:

使用道具 举报

发表于 2006-9-12 12:29 | 显示全部楼层
不会吧,应该是零啊,你的a的第一行与第三行是相同的,一看它的行列式的值就应该是0,
如果是数值误差,那用matlab计算的误差也没有这么大啊。
 楼主| 发表于 2006-9-12 13:08 | 显示全部楼层
原帖由 hunter_009 于 2006-9-12 12:29 发表
不会吧,应该是零啊,你的a的第一行与第三行是相同的,一看它的行列式的值就应该是0,
如果是数值误差,那用matlab计算的误差也没有这么大啊。

我完全同意你的看法
可是事实上在我的机器上得到的就是这个结果。而且是两种结果。我也解释不清楚。
发表于 2006-9-12 13:56 | 显示全部楼层
这说明后一种情况,行列式的第一行和第三行并不相同,只是显示出的前几位是一致的
而后面必定存在不同的项

你format long e后再看一下a的第一和第三行
 楼主| 发表于 2006-9-12 14:58 | 显示全部楼层
原帖由 happy 于 2006-9-12 13:56 发表
这说明后一种情况,行列式的第一行和第三行并不相同,只是显示出的前几位是一致的
而后面必定存在不同的项

你format long e后再看一下a的第一和第三行


情况是这样的:
第一行和第三行的表达式
是一样的,不管matlab的存储习惯如何
它们始终是一样的。
下面是改变显示方式后的情形:

K>>format long e

K>>f(VertexList(2,:),Num,second,Vnum,VertexList,subVertexList)

ans =

    4.306000000000000e-001    1.683000000000000e-001   -1.170000000000027e-002
   -4.023800000000000e+000    1.466500000000000e+000   -9.384000000000006e-001
    4.306000000000000e-001    1.683000000000000e-001   -1.170000000000027e-002

K>> 100000*ans

ans =

    4.306000000000001e+004    1.683000000000000e+004   -1.170000000000027e+003
   -4.023799999999999e+005    1.466500000000000e+005   -9.384000000000006e+004
    4.306000000000001e+004    1.683000000000000e+004   -1.170000000000027e+003
发表于 2006-9-12 16:25 | 显示全部楼层
原帖由 wjy21cn 于 2006-9-12 14:58 发表


情况是这样的:
第一行和第三行的表达式
是一样的,不管matlab的存储习惯如何
它们始终是一样的。
下面是改变显示方式后的情形:

K>>format long e

K>>f(VertexList(2,:),Num,second, ...


matlab运算的时候采用的是双精度的,显然你这里会出现截断误差,这就造成了行列式的结果不为零

评分

1

查看全部评分

 楼主| 发表于 2006-9-13 07:38 | 显示全部楼层
原帖由 happy 于 2006-9-12 16:25 发表


matlab运算的时候采用的是双精度的,显然你这里会出现截断误差,这就造成了行列式的结果不为零



那如何解决这种问题呢?
 楼主| 发表于 2006-9-13 08:00 | 显示全部楼层
另外一个问题,数据的显示格式和实际运算采用的是不是同一数值?我不知道说清楚没有。比如,输入命令
format short
a=2/3
a=0.6667
但是在对a进行四则运算时,a的取值是0.6667还是 0.66666666666667或者是  6.666666666666666e-001?
发表于 2006-9-13 09:06 | 显示全部楼层
原帖由 wjy21cn 于 2006-9-13 08:00 发表
另外一个问题,数据的显示格式和实际运算采用的是不是同一数值?我不知道说清楚没有。比如,输入命令
format short
a=2/3
a=0.6667
但是在对a进行四则运算时,a的取值是0.6667还是 0.66666666666667或者是  6 ...



应该是用format long e的显示结果来运算的
 楼主| 发表于 2006-9-13 12:30 | 显示全部楼层
原帖由 多情清秋 于 2006-9-13 09:06 发表



应该是用format long e的显示结果来运算的

多谢答复!
发表于 2006-9-13 12:53 | 显示全部楼层
 但是,即便是舍入误差(应该是舍入误差,与截断误差不一样,请查资料),如果是算法好的活,也不会的这么大的误差,不过我不知道matlab中det的具体算法,否则可以拿来评一下,算一下。
但我又想它应该与矩阵的范数有关,果如其然,它的范数达到1e+5,这说明处出的结果误差应该很大,清楼主用
      norm(a)   命令试一试。

评分

1

查看全部评分

发表于 2006-9-13 13:48 | 显示全部楼层
还是没看明白
 楼主| 发表于 2006-9-13 21:09 | 显示全部楼层
原帖由 hunter_009 于 2006-9-13 12:53 发表
 但是,即便是舍入误差(应该是舍入误差,与截断误差不一样,请查资料),如果是算法好的活,也不会的这么大的误差,不过我不知道matlab中det的具体算法,否则可以拿来评一下,算一下。
但我又想它应该与矩阵的 ...


矩阵范数是用来衡量、估计由于舍入误差等因素造成的数值解和理论解的误差。毫无疑问,一个0.0238,一个是0,这两者之间的误差是相当的大。我试过norm(a),确实很大。

现在问题是如何解决这种情况?
发表于 2006-9-14 17:45 | 显示全部楼层
det(a/norm(a))*norm(a)

评分

1

查看全部评分

 楼主| 发表于 2006-9-16 09:52 | 显示全部楼层
果然好方法。thanks。
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-25 13:11 , Processed in 0.085834 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表