wjy21cn 发表于 2006-9-12 09:56

行列式的值怎么了?

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呢?望大家赐教。

hunter_009 发表于 2006-9-12 12:29

不会吧,应该是零啊,你的a的第一行与第三行是相同的,一看它的行列式的值就应该是0,
如果是数值误差,那用matlab计算的误差也没有这么大啊。

wjy21cn 发表于 2006-9-12 13:08

原帖由 hunter_009 于 2006-9-12 12:29 发表
不会吧,应该是零啊,你的a的第一行与第三行是相同的,一看它的行列式的值就应该是0,
如果是数值误差,那用matlab计算的误差也没有这么大啊。
我完全同意你的看法
可是事实上在我的机器上得到的就是这个结果。而且是两种结果。我也解释不清楚。

happy 发表于 2006-9-12 13:56

这说明后一种情况,行列式的第一行和第三行并不相同,只是显示出的前几位是一致的
而后面必定存在不同的项

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

wjy21cn 发表于 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

happy 发表于 2006-9-12 16:25

原帖由 wjy21cn 于 2006-9-12 14:58 发表


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

K>>format long e

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

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

wjy21cn 发表于 2006-9-13 07:38

原帖由 happy 于 2006-9-12 16:25 发表


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


那如何解决这种问题呢?

wjy21cn 发表于 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的显示结果来运算的

wjy21cn 发表于 2006-9-13 12:30

原帖由 多情清秋 于 2006-9-13 09:06 发表



应该是用format long e的显示结果来运算的
多谢答复!

hunter_009 发表于 2006-9-13 12:53

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

liuriming5 发表于 2006-9-13 13:48

还是没看明白

wjy21cn 发表于 2006-9-13 21:09

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

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

现在问题是如何解决这种情况?

happy 发表于 2006-9-14 17:45

det(a/norm(a))*norm(a)

wjy21cn 发表于 2006-9-16 09:52

果然好方法。thanks。
页: [1] 2
查看完整版本: 行列式的值怎么了?