এর জন্য দ্রুত সুস্পষ্ট সমাধান


9

আমি একটি দ্রুত অনুসন্ধান করছি (আমি সর্বোত্তম বলার সাহস করব?) সুস্পষ্ট সমাধান 3x3 লিনিয়ার আসল সমস্যার, Ax=b, AR3×3,bR3

জরায়ু A সাধারণ, তবে শর্ত সংখ্যার সাথে পরিচয় ম্যাট্রিক্সের কাছাকাছি 1. কারণ কারণ b প্রকৃতপক্ষে প্রায় 5 টি সংখ্যার সাথে সেন্সর পরিমাপ হয়, সংখ্যাগত সমস্যার কারণে বেশ কয়েকটি সংখ্যা হারাতে আমার আপত্তি নেই।

অবশ্যই, যে কোনও পদ্ধতির উপর ভিত্তি করে একটি সুস্পষ্ট সমাধান নিয়ে আসা কঠিন নয়, তবে যদি এমন কোনও কিছু থাকে যা এফএলপিএস গণনার দিক থেকে অনুকূল বলে প্রমাণিত হয় তবে এটি আদর্শ হবে (সর্বোপরি পুরো সমস্যাটি সম্ভবত এফপি নিবন্ধগুলিতে ফিট হবে!)।

(হ্যাঁ, এই রুটিনটি প্রায়শই বলা হয় low আমি ইতিমধ্যে কম-ঝুলন্ত ফলগুলি থেকে মুক্তি পেয়েছি এবং এটি আমার প্রোফাইলের তালিকায় পরবর্তী ...)


প্রতিটি Aশুধুমাত্র একবার ব্যবহার করা হয়েছে, বা একই ম্যাট্রিক্সের সাথে একাধিক লিনিয়ার সিস্টেম রয়েছে? এটি ব্যয় পরিবর্তন করতে হবে।
ফেডেরিকো পোলোনি

এই উদাহরণে, এ একবার ব্যবহার করা হয়।
ড্যামিয়েন

উত্তর:


14

আপনি একটি সুস্পষ্ট সূত্রটি বীট করতে পারবেন না। আপনি সমাধানের সূত্রগুলি লিখতে পারেনx=A1bকাগজের টুকরোতে সংকলকটি আপনার জন্য জিনিসগুলি অনুকূল করতে দিন। অন্য যে কোনও পদ্ধতিতে অনিবার্যভাবে ifস্টেটমেন্ট বা forলুপ থাকবে (যেমন, পুনরাবৃত্ত পদ্ধতিগুলির জন্য) যা আপনার কোডকে কোনও সরল রেখার কোডের চেয়ে ধীর করে দেবে।


9

ম্যাট্রিক্স যেহেতু পরিচয়ের খুব কাছাকাছি, নীচের নিউমান সিরিজটি খুব দ্রুত রূপান্তরিত হবে:

A1=k=0(IA)k

নির্ভুলতার উপর নির্ভর করে এটি 2 টি শর্তের পরে কেটে ফেলাও যথেষ্ট ভাল হতে পারে:

A1I+(IA)=2IA.

এটি সরাসরি সূত্রের তুলনায় কিছুটা দ্রুত হতে পারে (ওল্ফগ্যাং ব্যাঙ্গারথের উত্তরে বলা হয়েছে) যদিও অনেক কম নির্ভুলতার সাথে।


আপনি 3 টি শর্তের সাথে আরও নির্ভুলতা পেতে পারেন:

A1I+(IA)+(IA)2=3I3A+A2

তবে আপনি যদি এন্ট্রি-বাই-এন্ট্রি সূত্রটি লিখে রাখেন (3I3A+A2)b, আপনি সরাসরি 3x3 ম্যাট্রিক্স বিপরীত সূত্র হিসাবে তুলনামূলক পরিমাণে ভাসমান পয়েন্ট অপারেশনগুলির দিকে তাকিয়ে আছেন (আপনাকে যদিও বিভাজন করতে হবে না, যা কিছুটা সাহায্য করে)।


বিভাগগুলি কি অন্য ফ্লপের চেয়ে বেশি ব্যয়বহুল? আমি ভেবেছিলাম এটি অতীতের একটি প্রত্যয়।
ফেডেরিকো পোলোনি

বিভাগগুলি কোনও একটি স্থাপত্যের পাইপলাইন ভাল করে না (এআরএম সমসাময়িক উদাহরণ)
ড্যামিয়েন

@ ফেডেরিকো পোলোনি চুদা সহ, আপনি এখানে নির্দেশিকা থ্রুপুট দেখতে পারেন , এটি বিভাগগুলির চেয়ে গুণ বা সংযোজনের চেয়ে ছয়গুণ বেশি।
কিরিল

@ দামিয়েন এবং কিরিল আমি দেখছি, পয়েন্টারগুলির জন্য ধন্যবাদ।
ফেডেরিকো পোলোনি

5

উপরের পরামর্শের ভিত্তিতে এফএলপিএস গণনা:

  • LU, কোন পাইভটিং নয়:

    • মুল = 11, ডিভ / রিসিপ = 6, অ্যাড / সাব = 11, মোট = 28; অথবা
    • মুল = 16, ডিভ / রিসিপ = 3, অ্যাড / সাব = 11, মোট = 30
  • ব্যাক-প্রতিস্থাপনের সাথে গাউসিয়ান নির্মূল, কোনও পাইভটিং নয়:

    • মুল = 11, ডিভ / রিসিপ = 6, অ্যাড / সাব = 11, মোট = 28; অথবা
    • মুল = 16, ডিভ / রিসিপ = 3, অ্যাড / সাব = 11, মোট = 30
  • কফ্যাক্টর সম্প্রসারণের মাধ্যমে ক্র্যামারের নিয়ম

    • মুল = 24, ডিভ = 3, অ্যাড / সাব = 15, মোট = 42; অথবা
    • মুল = 27, ডিভ = 1, অ্যাড / সাব = 15, মোট = 43
  • সুস্পষ্ট বিপরীতটি তখন গুণিত করুন:

    • মুল = 30, ডিভ = 3, অ্যাড / সাব = 17, মোট = 50; অথবা
    • মুল = 33, ডিভ = 1, অ্যাড / সাব = 17, মোট = 51

ম্যাটল্যাব প্রুফ অফ ধারণাগুলি:

কফ্যাক্টর সম্প্রসারণের মাধ্যমে ক্র্যামারের বিধি :

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

এলইউ (কোনও পাইভোটিং নেই) এবং পিছনে স্থান:

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

দ্রষ্টব্য: দয়া করে এই পোস্টে আপনার নিজস্ব পদ্ধতি এবং গণনা যোগ করতে নির্দ্বিধায়


আপনি দুটি পদ্ধতির সাথে সমাধান করতে সময়গুলি গণনা করেছিলেন?
নিকোগুয়ারো

না। উপরের কোডটি এখুনি কার্যকর করা হবে না। এর মুল বক্তব্যটি ছিল একটি স্পষ্ট FLOPS গণনা করা এবং আমার কোনও কিছু মিস হওয়ার ক্ষেত্রে পর্যালোচনার জন্য কোড সরবরাহ করা,
ড্যামিয়েন

এলইউতে 2 টি অতিরিক্ত রেসিপ্রোকাল অপারেশন (অর্থাত্ 1 / U11 এবং 1 / U22) ব্যয় করে 5 টি বিভাগকে 5 টি এমএলএসে রূপান্তর করা যেতে পারে। এটি সেখানে কোনও উপার্জন করতে হবে কিনা তা খিলান-নির্দিষ্ট হবে।
ড্যামিয়েন

2
ধরে নিচ্ছি আমার কাছে ভুল গণনা হয়নি, আনুমানিক A1b দ্বারা 2bAb12 গুণ, 9 যোগ / বিয়োগ, এবং কোনও বিভাজন প্রয়োজন। approximatingA1b দ্বারা 3(bAb)+A2b21 গুন এবং 18 সংযোজন / বিয়োগের প্রয়োজন হয়। গণকA1bএই সুস্পষ্ট সূত্রের মাধ্যমে 33 টি গুণ, 17 সংযোজন / বিয়োগফল এবং 1 বিভাগ বলে মনে হচ্ছে। আমি যেমন বলেছি, আমার নম্বরগুলি বন্ধ রয়েছে, তাই আপনি ডাবল চেক করতে চাইতে পারেন।
জেফ অক্সবেরি

@ জিফঅক্সবেরি, আমি এটি খতিয়ে দেখব এবং রিপোর্ট করব।
ডেমিয়েন

4

সম্ভবত ক্র্যামারের নিয়ম। যদি আপনি পাইভটিং এড়াতে পারেন, সম্ভবত এলইউ ফ্যাক্টেরাইজেশন; এটি একটি 3x3 ম্যাট্রিক্স, সুতরাং লুপগুলিকে ম্যানুয়ালি আনرول করা সহজ হবে। অন্য যে কোনও কিছুই সম্ভবত ব্রাঞ্চিংয়ের সাথে জড়িত থাকবে এবং আমি সন্দেহ করি যে ক্রিলোভ সাবস্পেস পদ্ধতিটি এটির জন্য উপযুক্ত হওয়ার জন্য প্রায়শই 1 বা 2 পুনরাবৃত্তিতে পর্যাপ্ত পরিমাণে রূপান্তরিত করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.