行列式的值怎么了?
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呢?望大家赐教。 不会吧,应该是零啊,你的a的第一行与第三行是相同的,一看它的行列式的值就应该是0,
如果是数值误差,那用matlab计算的误差也没有这么大啊。 原帖由 hunter_009 于 2006-9-12 12:29 发表
不会吧,应该是零啊,你的a的第一行与第三行是相同的,一看它的行列式的值就应该是0,
如果是数值误差,那用matlab计算的误差也没有这么大啊。
我完全同意你的看法
可是事实上在我的机器上得到的就是这个结果。而且是两种结果。我也解释不清楚。 这说明后一种情况,行列式的第一行和第三行并不相同,只是显示出的前几位是一致的
而后面必定存在不同的项
你format long e后再看一下a的第一和第三行 原帖由 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 原帖由 wjy21cn 于 2006-9-12 14:58 发表
情况是这样的:
第一行和第三行的表达式
是一样的,不管matlab的存储习惯如何
它们始终是一样的。
下面是改变显示方式后的情形:
K>>format long e
K>>f(VertexList(2,:),Num,second, ...
matlab运算的时候采用的是双精度的,显然你这里会出现截断误差,这就造成了行列式的结果不为零 原帖由 happy 于 2006-9-12 16:25 发表
matlab运算的时候采用的是双精度的,显然你这里会出现截断误差,这就造成了行列式的结果不为零
那如何解决这种问题呢? 另外一个问题,数据的显示格式和实际运算采用的是不是同一数值?我不知道说清楚没有。比如,输入命令
format short
a=2/3
a=0.6667
但是在对a进行四则运算时,a的取值是0.6667还是 0.66666666666667或者是6.666666666666666e-001? 原帖由 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 09:06 发表
应该是用format long e的显示结果来运算的
多谢答复! 但是,即便是舍入误差(应该是舍入误差,与截断误差不一样,请查资料),如果是算法好的活,也不会的这么大的误差,不过我不知道matlab中det的具体算法,否则可以拿来评一下,算一下。
但我又想它应该与矩阵的范数有关,果如其然,它的范数达到1e+5,这说明处出的结果误差应该很大,清楼主用
norm(a) 命令试一试。 还是没看明白 原帖由 hunter_009 于 2006-9-13 12:53 发表
但是,即便是舍入误差(应该是舍入误差,与截断误差不一样,请查资料),如果是算法好的活,也不会的这么大的误差,不过我不知道matlab中det的具体算法,否则可以拿来评一下,算一下。
但我又想它应该与矩阵的 ...
矩阵范数是用来衡量、估计由于舍入误差等因素造成的数值解和理论解的误差。毫无疑问,一个0.0238,一个是0,这两者之间的误差是相当的大。我试过norm(a),确实很大。
现在问题是如何解决这种情况? det(a/norm(a))*norm(a) 果然好方法。thanks。
页:
[1]
2