hrefspace

 找回密码
 立即注册
搜索
热搜: PHP PS 程序设计
查看: 580|回复: 3

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

[复制链接]

585

主题

769

帖子

2007

积分

大司空

Rank: 5Rank: 5

积分
2007
发表于 2023-10-3 08:45:50 | 显示全部楼层 |阅读模式
提示:代码在最下方!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。就很奇怪!



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

方法2代码
  1. Q=[1/3 2/3 -2/3;2/3 1/3 2/3];b=[1 2 7];b=b';x=Q*bp=Q'*x
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

2

主题

181

帖子

41

积分

新手上路

Rank: 1

积分
41
发表于 2023-10-3 08:46:11 | 显示全部楼层
> factor(4503599627370496)
cpu time = 1 ms, real time = 7 ms.
%1 =
[2 52]

明显是计算时候产生了舍入误差
回复

使用道具 举报

0

主题

182

帖子

76

积分

关内侯

Rank: 2

积分
76
发表于 2023-10-3 08:46:46 | 显示全部楼层
确实产生了舍入误差。但是为什么两种算法误差不一样。其实是可以说清楚的。
回复

使用道具 举报

0

主题

163

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2023-10-3 08:46:59 | 显示全部楼层

可能问题出在inv上。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|hrefspace

GMT+8, 2024-11-22 08:58 , Processed in 0.058921 second(s), 23 queries .

Powered by hrefspace X3.4 Licensed

Copyright © 2022, hrefspace.

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