找到线性系统精确解的最快方法是什么,matlab



我正试图求解一个线性系统(a*x=B(,其中B是64位或更长的长度。我在Matlab中使用了linsolve函数来求解方程组。我也使用过(inv(A(*B(、A\B和ttimes(A,B(,它们也有同样的问题。

我面临两个问题:

  1. 如果(A和B(不是符号的,linslave函数不能找到精确的解
  2. 如果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

您会注意到a1a2是相同的,尽管我翻转了两个数字中的最低有效位。这是因为双精度浮点不能保持64位的精度。它只能容纳52人。64位表示中的其他12位用于存储符号位和指数(缩放数字(。

我已经构建了自己的bi2de,它将二进制矢量转换为实际数字。

我用vpa取代了sym,性能得到了增强。

sym(A(---->vpa(A(

相关内容

  • 没有找到相关文章

最新更新