我正试图求解一个线性系统(a*x=B(,其中B是64位或更长的长度。我在Matlab中使用了linsolve函数来求解方程组。我也使用过(inv(A(*B(、A\B和ttimes(A,B(,它们也有同样的问题。
我面临两个问题:
- 如果(A和B(不是符号的,linslave函数不能找到精确的解
- 如果A和B是象征性的,linsolve设法找到确切的解决方案,但这需要太多时间
有什么方法可以快速找到确切的解决方案吗。
time=[]
i=50
a=magic(i);
% B is a rendom numbers where each number is 64 bit length
B=double(bi2de(randi([0 1],i,64)));
%%****************************************
% to make sure th matrix is not **ill-conditioned***
C = 1; % desired condition number
[u s v] = svd(a);
s = diag(s); % s is vector
% ===== linear stretch of existing s
s = s(1)*( 1-((C-1)/C)*(s(1)-s)/(s(1)-s(end)));
% =====
s = diag(s); % back to matrix
A = u*s*v';
%%****************************************
tic
x1=linsolve(A,B);
time(1,1)=toc;
%-------------------------------------
% convert A and B into symbolic
Aa=sym(A); Bb=sym(B);
tic
x2=linsolve(Aa,Bb);
time(1,2)=toc;
%-------------------------------------
% Show the accuracy of the first B(1), exact vs computed
Exact=sym(double(B(1)))
Computed=[ A(1,:)*x1 Aa(1,:)*x2]
time
x1和x2是两个解。x2是总和A和B的解。
只有X2给了我们准确的解决方案
Exact solution = 2350911785583947776
Computed using x1= 2350911785583965184
Computed using x2= 2350911785583947776
所需时间(秒(:
x1 time = 0.0007
x2 time = 6.7242
这不是你的问题的答案,它证明了为什么你的"精确"解是不精确的:intputB
是近似的。在MATLAB中试试这个:
a = randi([0 1],1,64);
a(1) = 0;
a1 = bi2de(a);
a(1) = 1;
a2 = bi2de(a);
a1-a2
您会注意到a1
和a2
是相同的,尽管我翻转了两个数字中的最低有效位。这是因为双精度浮点不能保持64位的精度。它只能容纳52人。64位表示中的其他12位用于存储符号位和指数(缩放数字(。
我已经构建了自己的bi2de,它将二进制矢量转换为实际数字。
我用vpa取代了sym,性能得到了增强。
sym(A(---->vpa(A(