找回密码
 欢迎注册
查看: 6936|回复: 3

[提问] double的数据,进行数值计算的误差为什么不同?

[复制链接]
发表于 2021-10-18 15:23:07 | 显示全部楼层 |阅读模式

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

您需要 登录 才可以下载或查看,没有账号?欢迎注册

×
提示:代码在最下方!matlab2015b  cpui7-6700  win10 64位家庭版

A矩阵
1 1
2 -1
-2 4

b向量
1
2
7

现在要求Ax=b的近似解
第一种方法x=(\(A^{T }\)A)\(^{-1}\)\(A^{T}\)b
求出x1=
1
2

第二种方法对A进行QR分解得到Q=
1/3  2/3
2/3  1/3
-2/3  2/3
Qx=b
x=Q'b
x2=
-3
6

两种方法得到的近似解x虽然不同,但是得到的近似值(b在A空间的投影=b在Q空间的投影)应该一样!

但是实际在matlab中计算Ax1=
ans =


       3      
       1/4503599627370496
       6      



Qx2=
ans =


       3      
       0      
       6     



以下是各变量在内存中的数值和数据类型。其中y是对应的上文中的x2 , x对应上文中的x1  ,不必在意A和Q本身是宽矩阵还是窄矩阵,在matlab中运算时都进行了适当的转置。要不然投影计算结果也不会仅仅是细微的误差。


计算之前使用了format rat命令,我以为这样可以提高计算精度。但是没想到是这样的结果。很想知道产生误差的原因,为什么Ax1 计算结果的第二项会得到 1/4503599627370496  而不是0,但是第二种方法就可以得到0。我看数据类型都是double
说起来Q矩阵里面存的还都是小数,直觉上计算误差应该更大一些。为什么?

说起来A‘x1的第二项进行的就是1*2+2*(-1)这样的运算。我在matlab中直接计算也可以得到0。就很奇怪!

2.jpg

下方代码中用的变量于截图中的变量名不同。但是可以复现出同样的误差。!
方法1代码
  1. A=[1 2 -2; 1 -1 4];
  2.   b=[1 2 7];
  3.   b=b'
  4. A=A';
  5. B=inv(A'*A);
  6. x=B*A'*b
  7. p=A*x
复制代码


方法2代码
  1. Q=[1/3 2/3 -2/3;2/3 1/3 2/3];
  2. b=[1 2 7];
  3. b=b';
  4. x=Q*b
  5. p=Q'*x
复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2021-10-19 14:50:41 | 显示全部楼层
> factor(4503599627370496)
cpu time = 1 ms, real time = 7 ms.
%1 =
[2 52]

明显是计算时候产生了舍入误差
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2021-10-19 19:42:51 | 显示全部楼层
.·.·. 发表于 2021-10-19 14:50
> factor(4503599627370496)
cpu time = 1 ms, real time = 7 ms.
%1 =

确实产生了舍入误差。但是为什么两种算法误差不一样。其实是可以说清楚的。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2021-10-22 10:42:23 | 显示全部楼层
1.jpg
可能问题出在inv上。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-4-23 18:00 , Processed in 0.046688 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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