วิธีแก้ปัญหาที่ชัดเจนอย่างรวดเร็วสำหรับ ,หมายเลขเงื่อนไขต่ำ


9

ฉันกำลังมองหาวิธีแก้ปัญหาเชิงเส้น 3x3 อย่างชัดเจน (กล้าพูดอย่างเหมาะสมหรือไม่) ,{3} Ax=AR3×3,R3

Matrixเป็นเรื่องปกติ แต่ใกล้กับ matrix matrix ที่มีจำนวนใกล้เคียงกับ 1 เนื่องจากเป็นเซ็นเซอร์วัดจริงที่มีความแม่นยำประมาณ 5 หลักฉันไม่คิดว่าจะสูญเสียตัวเลขหลายหลักเนื่องจากตัวเลข ปัญหาA

แน่นอนว่าไม่ใช่เรื่องยากที่จะคิดหาวิธีแก้ปัญหาที่ชัดเจนตามวิธีการต่าง ๆ แต่ถ้ามีบางสิ่งที่แสดงให้เห็นว่าเหมาะสมที่สุดในแง่ของการนับ FLOPS นั่นจะเป็นอุดมคติ (หลังจากนั้นปัญหาทั้งหมด จะเหมาะสมกับการลงทะเบียน FP!)

(ใช่กิจวัตรประจำวันนี้ถูกเรียกบ่อยครั้งฉันกำจัดผลไม้แขวนต่ำไปแล้วและนี่เป็นรายการต่อไปในรายการทำโปรไฟล์ของฉัน ... )


แต่ละใช้เพียงครั้งเดียวหรือมีหลายระบบเชิงเส้นที่มีเมทริกซ์เดียวกันหรือไม่ สิ่งนี้จะเปลี่ยนค่าใช้จ่าย A
Federico Poloni

ในตัวอย่างนี้ A ใช้เพียงครั้งเดียว
ดาเมียน

คำตอบ:


14

คุณไม่สามารถเอาชนะสูตรที่ชัดเจนได้ คุณสามารถเขียนสูตรสำหรับการแก้ปัญหาบนกระดาษ ให้คอมไพเลอร์ปรับให้เหมาะสมสำหรับคุณ วิธีอื่นใดเกือบจะหลีกเลี่ยงไม่ได้ที่จะมีข้อความสั่งหรือวนซ้ำ (เช่นสำหรับวิธีการวนซ้ำ) ที่จะทำให้โค้ดของคุณช้ากว่าโค้ดเส้นตรงใด ๆx=A1biffor


9

เนื่องจากเมทริกซ์อยู่ใกล้กับตัวตนมากขึ้นซีรี่ส์ของ Neumann ต่อไปนี้จึงจะมาบรรจบกันอย่างรวดเร็ว:

A-1=Σk=0(ผม-A)k

ขึ้นอยู่กับความถูกต้องที่จำเป็นแม้มันจะดีพอที่จะตัดทอนหลังจาก 2 เทอม:

A-1ผม+(ผม-A)=2ผม-A.

นี่อาจจะเร็วกว่าสูตรโดยตรงเล็กน้อย (ดังที่แนะนำในคำตอบของ Wolfgang Bangerth) แม้ว่าจะมีความแม่นยำน้อยกว่ามาก


คุณจะได้รับความแม่นยำมากขึ้นด้วย 3 คำ:

A-1ผม+(ผม-A)+(ผม-A)2=3ผม-3A+A2

แต่ถ้าคุณเขียนสูตรการป้อนข้อมูลสำหรับ (3ผม-3A+A2)คุณกำลังดูจำนวนการดำเนินการจุดลอยตัวที่เทียบเท่ากับเมทริกซ์ผกผันเมทริกซ์ 3x3 โดยตรง (คุณไม่ต้องทำการหาร แต่ช่วยได้เล็กน้อย)


หน่วยงานยังมีราคาแพงกว่ารองเท้าอื่น ๆ หรือไม่? ฉันคิดว่ามันเป็นของที่ระลึกในอดีต
Federico Poloni

หน่วยงานไม่ได้ส่งผลดีต่อสถาปัตยกรรมบางอย่าง (ARM เป็นตัวอย่างร่วมสมัย)
ดาเมียน

@FedericoPoloni ด้วย Cuda คุณสามารถดูปริมาณการเรียนการสอนได้ที่นี่สูงกว่าการคูณ / ส่วนเพิ่มหกเท่า
คิริลล์

@ ดาเมียนและคิริลล์ฉันเห็นแล้วขอบคุณสำหรับพอยน์เตอร์
Federico Poloni

5

FLOPS จะนับตามคำแนะนำด้านบน:

  • LU, ไม่มีการหมุนเหวี่ยง:

    • Mul = 11, Div / Recip = 6, เพิ่ม / Sub = 11, Total = 28; หรือ
    • Mul = 16, Div / Recip = 3, เพิ่ม / Sub = 11, Total = 30
  • การกำจัดแบบเกาส์ด้วยการเปลี่ยนตัวกลับไม่มีการหมุน:

    • Mul = 11, Div / Recip = 6, เพิ่ม / Sub = 11, Total = 28; หรือ
    • Mul = 16, Div / Recip = 3, เพิ่ม / Sub = 11, Total = 30
  • กฎของ Cramer ผ่านการขยายตัวของปัจจัย

    • Mul = 24, Div = 3, เพิ่ม / ย่อย = 15, ทั้งหมด = 42; หรือ
    • Mul = 27, Div = 1, เพิ่ม / ย่อย = 15, ทั้งหมด = 43
  • Explicit Inverse จากนั้นคูณ:

    • Mul = 30, Div = 3, เพิ่ม / ย่อย = 17, ทั้งหมด = 50; หรือ
    • Mul = 33, Div = 1, เพิ่ม / Sub = 17, Total = 51

การพิสูจน์แนวคิดของ MATLAB:

กฎ 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];

Explicit Inverse แล้ว Multiply:

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 ที่ชัดเจนและระบุรหัสสำหรับการตรวจสอบในกรณีที่ฉันพลาดบางสิ่งบางอย่าง
Damien

ใน LU หน่วยงาน 5 หน่วยสามารถแปลงเป็น 5 MUL ได้โดยเสียค่าใช้จ่ายในการดำเนินการซึ่งกันและกัน 2 ครั้ง (เช่น 1 / U11 และ 1 / U22) นั่นจะเป็นแบบเฉพาะเจาะจงว่ามีกำไรที่จะทำหรือไม่
ดาเมียน

2
สมมติว่าฉันไม่ได้นับผิดประมาณ A-1 โดย 2-Aจะต้องใช้การคูณ 12 การบวก / การลบ 9 ครั้งและไม่มีการหาร ใกล้เคียงA-1 โดย 3(-A)+A2จะต้องมี 21 การคูณและการบวก / การลบ 18 ครั้ง การคำนวณA-1ผ่านสูตรที่ชัดเจนนี้มี 33 การคูณการบวก / การลบ 17 ครั้งและการหาร 1 ครั้ง อย่างที่ฉันพูดตัวเลขของฉันอาจไม่ถูกต้องดังนั้นคุณอาจต้องการตรวจสอบอีกครั้ง
Geoff Oxberry

@GeoffOxberry ฉันจะตรวจสอบและรายงาน
ดาเมียน

4

อาจเป็นกฎของ Cramer หากคุณสามารถหลีกเลี่ยงการหมุนเหวี่ยงอาจจะแยกตัวประกอบ LU; มันคือเมทริกซ์ 3x3 ดังนั้นการปลดลูปด้วยตนเองจะง่าย มีอะไรอีกที่อาจเกี่ยวข้องกับการแตกแขนงและฉันสงสัยว่าวิธีย่อย Krylov จะมาบรรจบกันบ่อยครั้งพอใน 1 หรือ 2 ซ้ำเพื่อให้มันคุ้มค่า

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.