Я пытаюсь решить линейную систему (A * x = B), где B - это 64-битная длина или больше. Я использовал функцию Линсольва в Matlab для решения системы уравнений. Я использовал (inv (A) * B), A \ B и ttimes (A, B), и они страдают от тех же проблем.
Я столкнулся с двумя проблемами:
- Функция Линслова не может найти точное решение, если (A и B) не являются символами c.
- Если A и B являются символами c, 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 является решением сумболи c A и B.
Только X2 дает нам точное решение
Exact solution = 2350911785583947776
Computed using x1= 2350911785583965184
Computed using x2= 2350911785583947776
Время, необходимое в секундах:
x1 time = 0.0007
x2 time = 6.7242