के लिए तेजी से स्पष्ट समाधान


9

मैं एक तेज की तलाश कर रहा हूं (मैं इष्टतम कहता हूं?) 3x3 रैखिक वास्तविक समस्या का स्पष्ट समाधान। एक्स=, आर3×3,आर3

आव्यूह सामान्य है, लेकिन पहचान मैट्रिक्स के करीब एक शर्त संख्या 1 के साथ। क्योंकि वास्तव में सटीकता के लगभग 5 अंकों के साथ सेंसर माप हैं, मुझे संख्यात्मक मुद्दों के कारण कई अंकों को खोने का मन नहीं है।

बेशक, किसी भी संख्या के तरीकों के आधार पर एक स्पष्ट समाधान के साथ आना मुश्किल नहीं है, लेकिन अगर कोई ऐसी चीज है जिसे FLOPS काउंट के संदर्भ में इष्टतम दिखाया गया है, तो यह आदर्श होगा (आखिरकार, पूरी समस्या। एफपी रजिस्टर में फिट होने की संभावना होगी!)।

(हाँ, इस दिनचर्या को अक्सर कहा जाता है । मैंने पहले ही कम लटके फलों से छुटकारा पा लिया है और यह मेरी रूपरेखा सूची में है।)


प्रत्येक है केवल एक बार उपयोग किया जाता है, या एक ही मैट्रिक्स के साथ कई रैखिक प्रणालियां हैं? इससे लागत में बदलाव होगा।
फेडरिको पोलोनी

इस उदाहरण में, A का उपयोग केवल एक बार किया जाता है।
डेमियन

जवाबों:


14

आप एक स्पष्ट फॉर्मूला नहीं हरा सकते। आप समाधान के लिए सूत्र लिख सकते हैंएक्स=-1कागज के एक टुकड़े पर। कंपाइलर को आपके लिए चीजों का अनुकूलन करने दें। किसी भी अन्य विधि में लगभग अनिवार्य रूप से ifकथन या forलूप होंगे (जैसे, पुनरावृत्त विधियों के लिए) जो आपके कोड को किसी भी सीधी रेखा कोड की तुलना में धीमा बना देगा।


9

चूंकि मैट्रिक्स पहचान के बहुत करीब है, इसलिए निम्न न्यूमैन श्रृंखला बहुत तेजी से अभिसरण करेगी:

-1=Σ=0(मैं-)

आवश्यक सटीकता के आधार पर यह 2 शब्दों के बाद भी छोटा करने के लिए पर्याप्त हो सकता है:

-1मैं+(मैं-)=2मैं-

यह एक प्रत्यक्ष सूत्र की तुलना में थोड़ा तेज हो सकता है (जैसा कि वोल्फगैंग बंगर्थ के उत्तर में सुझाया गया है), हालांकि बहुत कम सटीकता के साथ।


आप 3 शब्दों के साथ अधिक सटीकता प्राप्त कर सकते हैं:

-1मैं+(मैं-)+(मैं-)2=3मैं-3+2

लेकिन अगर आप के लिए प्रवेश-दर-प्रविष्टि सूत्र लिखते हैं (3मैं-3+2), आप प्रत्यक्ष 3x3 मैट्रिक्स व्युत्क्रम सूत्र के रूप में फ्लोटिंग पॉइंट ऑपरेशन्स की तुलनीय मात्रा देख रहे हैं (आपको एक विभाजन नहीं करना है, जो थोड़ा मदद करता है)।


क्या विभाजन अभी भी अन्य फ्लॉप की तुलना में अधिक महंगे हैं? मुझे लगा कि यह अतीत का अवशेष है।
फेडरिको पोलोनी

डिवीजन अच्छी तरह से पाइपलाइन नहीं करते हैं कुछ आर्किटेक्चर (एआरएम समकालीन उदाहरण हैं)
डेमियन

@FedericoPoloni Cuda के साथ, आप यहां निर्देश थ्रूपुट देख सकते हैं , यह विभाजन के लिए गुणा / परिवर्धन के लिए छह गुना अधिक है।
किरील

@ डैमियन और किरिल मुझे दिखाई देते हैं, संकेत के लिए धन्यवाद।
फ़ेडरिको पोलोनी

5

ऊपर दिए गए सुझावों के आधार पर FLOPS काउंट:

  • LU, कोई धुरी नहीं:

    • मुल = 11, दिवि / प्रतिप = 6, जोड़ / उप = 11, कुल = 28; या
    • मुल = 16, दिवा / प्रतिप = 3, जोड़ / उप = 11, कुल = 30
  • बैक-प्रतिस्थापन के साथ गॉसियन उन्मूलन, कोई धुरी नहीं:

    • मुल = 11, दिवि / प्रतिप = 6, जोड़ / उप = 11, कुल = 28; या
    • मुल = 16, दिवा / प्रतिप = 3, जोड़ / उप = 11, कुल = 30
  • कोफ़ेक्टर विस्तार के माध्यम से क्रैमर का शासन

    • मुल = 24, दिवि = 3, जोड़ / उप = 15, कुल = 42; या
    • मुल = २ =, दीव = १, जोड़ / उप = १५, कुल = ४३
  • स्पष्ट व्युत्क्रम फिर गुणा करें:

    • मूल = 30, दिवि = 3, जोड़ें / उप = 17, कुल = 50; या
    • मुल = 33, दिवि = 1, जोड़ / उप = 17, कुल = 51

MATLAB सबूत की अवधारणाएं:

Cofactor विस्तार के माध्यम से Cramer का नियम :

function k = CramersRule(A, m)
%
% FLOPS:
%
% Multiplications:        24
% Subtractions/Additions: 15
% Divisions:               3
%
% Total:                  42

a = A(1,1);
b = A(1,2);
c = A(1,3);

d = A(2,1);
e = A(2,2);
f = A(2,3);

g = A(3,1);
h = A(3,2);
i = A(3,3);

x = m(1);
y = m(2);
z = m(3);

ei = e*i;
fh = f*h;

di = d*i;
fg = f*g;

dh = d*h;
eg = e*g;

ei_m_fh = ei - fh;
di_m_fg = di - fg;
dh_m_eg = dh - eg;

yi = y*i;
fz = f*z;

yh = y*h;
ez = e*z;

yi_m_fz = yi - fz;
yh_m_ez = yh - ez;

dz = d*z;
yg = y*g;

dz_m_yg = dz - yg;
ez_m_yh = ez - yh;


det_a = a*ei_m_fh - b*di_m_fg + c*dh_m_eg;
det_1 = x*ei_m_fh - b*yi_m_fz + c*yh_m_ez;
det_2 = a*yi_m_fz - x*di_m_fg + c*dz_m_yg;
det_3 = a*ez_m_yh - b*dz_m_yg + x*dh_m_eg;


p = det_1 / det_a;
q = det_2 / det_a;
r = det_3 / det_a;

k = [p;q;r];

LU (कोई धुरी नहीं) और बैक-प्रतिस्थापन:

function [x, y, L, U] = LUSolve(A, b)
% Total FLOPS count:     (w/ Mods)
%
% Multiplications:  11    16
% Divisions/Recip:   6     3
% Add/Subtractions: 11    11
% Total =           28    30
%

A11 = A(1,1);
A12 = A(1,2);
A13 = A(1,3);

A21 = A(2,1);
A22 = A(2,2);
A23 = A(2,3);

A31 = A(3,1);
A32 = A(3,2);
A33 = A(3,3);

b1 = b(1);
b2 = b(2);
b3 = b(3);

L11 = 1;
L22 = 1;
L33 = 1;

U11 = A11;
U12 = A12;
U13 = A13;

L21 = A21 / U11;
L31 = A31 / U11;

U22 = (A22 - L21*U12);
L32 = (A32 - L31*U12) / U22;

U23 = (A23 - L21*U13);

U33 = (A33 - L31*U13 - L32*U23);

y1 = b1;
y2 = b2 - L21*y1;
y3 = b3 - L31*y1 - L32*y2;

x3 = (y3                  ) / U33;
x2 = (y2 -          U23*x3) / U22;
x1 = (y1 - U12*x2 - U13*x3) / U11;

L = [ ...
    L11,   0,   0;
    L21, L22,   0;
    L31, L32, L33];

U = [ ...
    U11, U12, U13;
      0, U22, U23;
      0,   0, U33];

x = [x1;x2;x3];
y = [y1;y2;y3];

स्पष्ट उलटा तब गुणा करें:

function x = ExplicitInverseMultiply(A, m)
%
% FLOPS count:                  Alternative
%
% Multiplications:        30            33
% Divisions:               3             1
% Additions/Subtractions: 17            17
% Total:                  50            51


a = A(1,1);
b = A(1,2);
c = A(1,3);

d = A(2,1);
e = A(2,2);
f = A(2,3);

g = A(3,1);
h = A(3,2);
i = A(3,3);

ae = a*e;
af = a*f;
ah = a*h;
ai = a*i;

bd = b*d;
bf = b*f;
bg = b*g;
bi = b*i;

cd = c*d;
ce = c*e;
cg = c*g;
ch = c*h;

dh = d*h;
di = d*i;

eg = e*g;
ei = e*i;

fg = f*g;
fh = f*h;

dh_m_eg = (dh - eg);
ei_m_fh = (ei - fh);
fg_m_di = (fg - di);

A = ei_m_fh;
B = fg_m_di;
C = dh_m_eg;
D = (ch - bi);
E = (ai - cg);
F = (bg - ah);
G = (bf - ce);
H = (cd - af);
I = (ae - bd);

det_A = a*ei_m_fh + b*fg_m_di + c*dh_m_eg;

x1 =  (A*m(1) + D*m(2) + G*m(3)) / det_A;
x2 =  (B*m(1) + E*m(2) + H*m(3)) / det_A;
x3 =  (C*m(1) + F*m(2) + I*m(3)) / det_A;

x = [x1;x2;x3];

गाउस विलोपन:

function x = GaussianEliminationSolve(A, m)
%
% FLOPS Count:      Min   Alternate
%
% Multiplications:  11    16
% Divisions:         6     3
% Add/Subtractions: 11    11
% Total:            28    30
%

a = A(1,1);
b = A(1,2);
c = A(1,3);

d = A(2,1);
e = A(2,2);
f = A(2,3);

g = A(3,1);
h = A(3,2);
i = A(3,3);

b1 = m(1);
b2 = m(2);
b3 = m(3);

% Get to echelon form

op1 = d/a;

e_dash  = e  - op1*b;
f_dash  = f  - op1*c;
b2_dash = b2 - op1*b1;

op2 = g/a;

h_dash  = h  - op2*b;
i_dash  = i  - op2*c;
b3_dash = b3 - op2*b1; 

op3 = h_dash / e_dash;

i_dash2  = i_dash  - op3*f_dash;
b3_dash2 = b3_dash - op3*b2_dash;

% Back substitution

x3 = (b3_dash2                  ) / i_dash2;
x2 = (b2_dash        - f_dash*x3) / e_dash;
x1 = (b1      - b*x2 -      c*x3) / a;

x = [x1 ; x2 ; x3];

नोट: कृपया इस पोस्ट में अपनी स्वयं की विधियों और गिनती को जोड़ने के लिए स्वतंत्र महसूस करें।


क्या आपने दो तरीकों से हल करने में लगने वाले समय की गणना की?
nicoguaro

नहीं। ऊपर दिए गए कोड का निष्पादन जल्दी नहीं होगा। इसका मतलब यह था कि एक स्पष्ट FLOPS काउंट प्राप्त करना और समीक्षा के लिए कोड की आपूर्ति करना अगर मुझे कुछ याद आया, तो
डेमियन

LU में, 5 डिवीजनों को 2 अतिरिक्त पारस्परिक संचालन (यानी 1 / U11 और 1 / U22) की कीमत पर 5 MUL में परिवर्तित किया जा सकता है। यह आर्क-स्पेसिफिक होगा कि क्या वहाँ एक लाभ है।
डेमियन

2
यह मानते हुए कि मैंने गलत अनुमान नहीं लगाया है, अनुमान लगा रहा हूं -1 द्वारा 2-12 गुणा, 9 जोड़ / घटाव और कोई विभाजन की आवश्यकता है। अनुमान करने वाले-1 द्वारा 3(-)+221 गुणा और 18 जोड़ / घटाव की आवश्यकता है। गिना जा रहा है-1इस स्पष्ट फार्मूले के माध्यम से 33 गुणा, 17 जोड़ / घटाव और 1 विभाजन प्रतीत होता है। जैसा कि मैंने कहा, मेरे नंबर बंद हो सकते हैं, इसलिए आप दोहरी जांच करना चाहते हैं।
ज्योफ ऑक्सीबेरी

@GeoffOxberry, मैं इसे देखूंगा और रिपोर्ट करूंगा।
डेमियन

4

संभवत: क्रैमर का नियम। यदि आप धुरी से बच सकते हैं, तो शायद एलयू फैक्टराइजेशन; यह एक 3x3 मैट्रिक्स है, इसलिए मैन्युअल रूप से छोरों को अनियंत्रित करना आसान होगा। किसी भी चीज में शायद ब्रांचिंग शामिल होगी, और मुझे संदेह है कि एक क्रायलोव उप-विधि विधि अक्सर 1 या 2 पुनरावृत्तियों में पर्याप्त रूप से इसके लायक होने के लिए अभिसरण करेगी।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.