जैकोबी विधि (संशोधित) द्वारा एक मैट्रिक्स समीकरण हल करें


11

गणितीय पृष्ठभूमि

चलो वास्तविक संख्याओं के एन मैट्रिक्स द्वारा एक एन हो, एन वास्तविक संख्या के बा वेक्टर और एक्सए वेक्टर एन अज्ञात वास्तविक संख्या। एक मैट्रिक्स समीकरण एक्स = बी है।

जैकोबी की विधि निम्नानुसार है: ए = डी + आर को विघटित करें, जहां डी विकर्णों का मैट्रिक्स है, और आर शेष प्रविष्टियां हैं।

यदि आप एक प्रारंभिक अनुमान समाधान x0 बनाते हैं, तो एक बेहतर समाधान X1 = व्युत्क्रम (D) * (b - Rx) है जहां सभी गुणा मैट्रिक्स-वेक्टर गुणा और व्युत्क्रम हैं (D) मैट्रिक्स व्युत्क्रम है।


समस्या की विशिष्टता

  • इनपुट : आपका पूरा कार्यक्रम निम्नलिखित डेटा को इनपुट के रूप में स्वीकार करना चाहिए: मैट्रिक्स ए, वेक्टर बी, एक प्रारंभिक अनुमान x0, और एक 'त्रुटि' नंबर ई।
  • आउटपुट : कार्यक्रम को पुनरावृत्तियों की न्यूनतम संख्या को आउटपुट करना होगा जैसे कि नवीनतम समाधान वास्तविक समाधान से भिन्न होता है, अधिकांश ई द्वारा। इसका मतलब यह है कि पूर्ण परिमाण में वैक्टर के प्रत्येक घटक सबसे अधिक ई द्वारा भिन्न होते हैं। आपको पुनरावृत्तियों के लिए जैकोबी की विधि का उपयोग करना चाहिए।

डेटा कैसे इनपुट किया जाता है यह आपकी पसंद है ; यह कमांड लाइन पर आपका अपना सिंटैक्स हो सकता है, आप एक फ़ाइल से इनपुट ले सकते हैं, जो भी आप चुनते हैं।

डेटा कैसे आउटपुट किया जाता है यह आपकी पसंद है ; यह एक फ़ाइल के लिए लिखा जा सकता है, कमांड लाइन में प्रदर्शित किया जाता है, जिसे ASCII कला, कुछ भी लिखा जाता है, जब तक कि यह मानव द्वारा पठनीय हो।

आगे की जानकारी

आपको सही समाधान नहीं दिया जाता है: आप सही समाधान की गणना कैसे करते हैं, यह पूरी तरह आप पर निर्भर है। आप इसे उदाहरण के लिए क्रैमर के नियम द्वारा हल कर सकते हैं, या सीधे उलटा गणना कर सकते हैं। क्या मायने रखता है कि आपके पास पुनरावृत्तियों की तुलना करने में सक्षम होने के लिए एक सच्चा समाधान है।

परिशुद्धता एक मुद्दा है; तुलना के लिए कुछ लोगों के 'सटीक समाधान' अलग हो सकते हैं। इस कोड गोल्फ के उद्देश्यों के लिए सटीक समाधान 10 दशमलव स्थानों के लिए सही होना चाहिए।

बिल्कुल स्पष्ट होने के लिए, यदि आपके वर्तमान पुनरावृत्ति समाधान का एक घटक भी ई द्वारा सही समाधान में इसके संगत घटक से अधिक है, तो आपको पुनरावृति रखने की आवश्यकता है।

N की ऊपरी सीमा इस बात पर निर्भर करती है कि आप किस हार्डवेयर का उपयोग कर रहे हैं और प्रोग्राम को चलाने के लिए कितना समय देना चाहते हैं। इस कोड गोल्फ के प्रयोजनों के लिए, अधिकतम N = 50 मान लें।

पूर्व शर्त

जब आपका कार्यक्रम कहा जाता है, तो आप यह मानने के लिए स्वतंत्र हैं कि निम्नलिखित हर समय होता है:

  • एन> 1 और एन <51, यानी आपको कभी स्केलर समीकरण नहीं दिया जाएगा, हमेशा एक मैट्रिक्स समीकरण।
  • सभी इनपुट वास्तविक संख्या के क्षेत्र से अधिक हैं, और कभी भी जटिल नहीं होंगे।
  • मैट्रिक्स ए हमेशा ऐसा होता है कि विधि सही समाधान में परिवर्तित हो जाती है, जैसे कि आप हमेशा ई के नीचे या इसके बराबर त्रुटि को कम करने के लिए कई पुनरावृत्तियों को पा सकते हैं।
  • A कभी भी शून्य मैट्रिक्स या पहचान मैट्रिक्स नहीं है, अर्थात इसका एक समाधान है।

परीक्षण के मामलों

A = ((9, -2), (1, 3)), b = (3,4), x0 = (1,1), e = 0.04

सही समाधान है (0.586, 1.138)। पहला पुनरावृति X1 = (5/9, 1) देता है, सही समाधान से 0.04 से अधिक भिन्न, कम से कम एक घटक द्वारा। एक और पुनरावृत्ति लेते हुए, हम पाते हैं x2 = (0.555, 1.148) जो 0.04 से कम (0.586, 1.138) से भिन्न होता है। इस प्रकार आउटपुट है

2

A = ((2, 3), (1, 4)), b = (2, -1), x0 = (2.7, -0.7), e = 1.0

इस मामले में सही समाधान है (2.2, -0.8) और प्रारंभिक अनुमान x0 में पहले से ही e = 1.0 से कम त्रुटि है, इस प्रकार हम 0. आउटपुट करते हैं। यानी, जब भी आपको पुनरावृत्ति करने की आवश्यकता नहीं होती है, आप बस आउटपुट करते हैं

0

सबमिशन असेसमेंट

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


2
आपको वास्तव में इसके लिए अधिक प्रतिक्रिया प्राप्त करने के लिए इंतजार करना चाहिए, विशेष रूप से हाल ही में बंद पोस्ट को देखते हुए। पीपीसीजी चुनौतियां आम तौर पर विशिष्टताओं में सामान्य संरचना साझा करती हैं, जो आमतौर पर थकाऊ और अस्पष्ट होने के बजाय उन्हें समझने में आसान होती हैं। यथोचित चुनौतियों में से कुछ को देखने की कोशिश करें और प्रारूप की नकल करें।
यूरिल

@ युरील मुझे इसका एहसास है, लेकिन मुझे लगता है कि मैं अपने विनिर्देश में थकाऊ हो गया हूं, और प्रारूप, जबकि अधिकांश प्रश्नों के बिल्कुल फिटिंग नहीं है, रैखिक रूप से पढ़ा जा सकता है, और तदनुसार पाठक का मार्गदर्शन कर सकता है। प्रारूप को समस्या की सामग्री को भी ध्यान में रखना चाहिए।
user1997744

3
"सबसे छोटा सही पूर्ण कार्यक्रम " लगता है जैसे आप केवल कार्यक्रमों और कार्यों की अनुमति देते हैं। मैं "/ फंक्शन" जोड़ूंगा।
एडम

2
+1 स्वरूपण मेरे मस्तिष्क की किसी प्रश्न पर ध्यान केंद्रित करने की क्षमता को बनाता या तोड़ता है
स्टीफन

1
@ user1997744 युप, समझ में आता है। मेरा मानना ​​है कि डिफ़ॉल्ट यह है कि किसी भी अन्य कोड, जैसे अन्य फ़ंक्शन या अजगर आयात की अनुमति है, लेकिन यह भी बायटेकाउंट में शामिल है।
स्टीफन

जवाबों:


4

एपीएल (डायलॉग) , 78 68 65 49 बाइट्स

वास्तव में APL के लिए समस्या का प्रकार बनाया गया था।

-3 एग्री द आउटग्राफर को धन्यवाद । -11 ngn के लिए धन्यवाद ।

अनाम शिशु फ़ंक्शन। A को बाएं तर्क के रूप में और X को सही तर्क के रूप में लिया जाता है। प्रिंट परिणाम के रूप में लंबवत 1टैली अंकों के रूप में उपयोग करते हुए लंबवत STDOUT का परिणाम है 0। इसका मतलब है कि यहां तक ​​कि 0-परिणाम भी देखा जा सकता है, 1इससे पहले कोई एस नहीं है 0

{⎕←∨/e<|⍵-b⌹⊃A b e←⍺:⍺∇D+.×b-⍵+.×⍨A-⌹D←⌹A×=/¨⍳⍴A}

इसे ऑनलाइन आज़माएं!

पढ़ने के क्रम में स्पष्टीकरण

ध्यान दें कि कोड समस्या विनिर्देशन के समान कैसे पढ़ता है:

{... } दिए गए A, b, और e, और दिए गए x पर,
⎕← प्रिंट करें
∨/ कि क्या इस कथन में कोई सच्चाई है कि
e< e
|⍵- , x  , b, और के पहले x x से
b⌹ विभाजित मैट्रिक्स के निरपेक्ष मान से छोटा है
⊃A b eया नहीं e (यानी A)
←⍺ जो बायाँ तर्क है
: और यदि ऐसा है, तो  D मैट्रिक्स-बार  b माइनस  x
  ⍺∇ पर पुनरावृत्ति करें,  A  को D के व्युत्क्रम से गुणा करके मैट्रिक्स (शेष प्रविष्टियाँ)  जहाँ D वह है  जहाँ  आकृति के  लिए  समान निर्देशांक हैं । A का (यानी विकर्ण)
  D+.×
  b-
  ⍵+.×⍨
  A-
  ⌹D
  
  
  =/¨
  
  ⍴A

चरण-दर-चरण स्पष्टीकरण

निष्पादन का वास्तविक क्रम दाएँ-से-बाएँ:

{... } अनाम फ़ंक्शन जहां ए है और ⍵ x है:
A b c←⍺ ए, बी और ई में विभाजित बाएं तर्क को विभाजित करें  एक्स के  वर्तमान मूल्यों के बीच बी (एक्स का सही मूल्य देता है
 ) के
b⌹साथ पहला (ए) मैट्रिक्स डिवीजन चुनें
⍵-और उन
| पूर्ण मूल्यों को
e< स्वीकार्य। उनसे कम त्रुटि?
∨/ किसी के लिए सच है? (साहित्य या कमी)
⎕← प्रिंट कि बूलियन STDOUT करने के लिए
: और अगर ऐसा है:
  ⍴A एक के आकार
   कि आकार जहां प्रत्येक कोशिका का अपना निर्देशांक है की मैट्रिक्स
  =/¨ प्रत्येक कक्ष के लिए, ऊर्ध्वाधर और क्षैतिज निर्देशांक के बराबर है? (विकर्ण)
   A की कोशिकाओं को उस (अर्क विकर्ण)
   मैट्रिक्स व्युत्क्रम
  D← स्टोर के साथ D ( D iagonal के लिए) से गुणा करें
   व्युत्क्रम (सामान्य से वापस)
  A- एक
  ⍵+.×⍨ मैट्रिक्स से घटाना (डॉट उत्पाद के रूप में एक ही चीज, इसलिए .) एक्स के साथ
  b- कि
  D+.× डी के मैट्रिक्स उत्पाद से बी घटाएं और जो
  ⍺∇ इस फ़ंक्शन को दिए गए ए के साथ लागू करें और यह कि एक्स के नए मूल्य के रूप में।


आउटपुट सटीकता की सटीकता के लिए आवश्यक पुनरावृत्तियों की संख्या होनी चाहिए e
ज़र्गब

-1: यह कोई हल नहीं है। आपको x0 की आवश्यकता है क्योंकि पूरे बिंदु को यह जानना है कि किसी विशेष प्रारंभिक बिंदु से वांछित सटीकता के लिए कितने कदम लगते हैं।
बजे user1997744

@ user1997744 आह, मैंने समस्या को गलत समझा। माफ़ करना।
एडम

@ user1997744 बेहतर है?
16

1
@ user1997744 नहीं गणित आपरेशन, बस पढ़ने की क्षमता एकल , जहां वास्तव में 0 कुछ भी नहीं है
शाम 15'17

1

पायथन 3 , 132 बाइट्स

f=lambda A,b,x,e:e<l.norm(x-dot(l.inv(A),b))and 1+f(A,b,dot(l.inv(d(d(A))),b-dot(A-d(d(A)),x)),e)
from numpy import*
l=linalg
d=diag

इसे ऑनलाइन आज़माएं!

एक पुनरावर्ती समाधान का उपयोग करता है।


@ Adám मुझे यकीन नहीं है कि मैं काफी समझ पाया हूँ। मैंने इसकी व्याख्या fकोड ब्लॉक के भीतर नाम न होने के रूप में की थी, जिसे मैंने अब ठीक कर लिया है; हालाँकि, अगर यह पूरी तरह से एक अलग मुद्दा है, तब भी यह एक समस्या हो सकती है।
नॉटजागन

@ Adám यह जवाब मुझे लगता है कि वर्तमान में मेरे पास है, को नष्ट करने के लिए लगता है; यह सहायक कोड वाला एक कार्य है जो इसकी परिभाषा के बाद एक इकाई के रूप में काम करने में सक्षम है।
नॉटजागन

आह अच्छा। तो कोई बात नहीं। मैं अजगर को नहीं जानता, इसलिए मैं सिर्फ उत्सुक था। बहुत बढ़िया!
शाम

स्टॉपिंग मानदंड नहीं है "इसका मतलब है कि पूर्ण परिमाण में वैक्टर के प्रत्येक घटक सबसे अधिक ई द्वारा भिन्न होते हैं"? मूल रूप से अधिकतम-आदर्श, एल 2-आदर्श नहीं।
निकोनिरह

@NikoNyrh फिक्स्ड।
नॉटजागन

1

आर , 138 बाइट्स

function(A,x,b,e){R=A-(D=diag(diag(A)))
g=solve(A,b)
if(norm(t(x-g),"M")<e)T=0
while(norm((y=solve(D)%*%(b-R%*%x))-g,"M")>e){T=T+1;x=y}
T}

इसे ऑनलाइन आज़माएं!

बग को ठीक करने के लिए NikoNyrh को धन्यवाद

यह भी ध्यान देने योग्य है कि एक आर पैकेज है, Rlinsolveजिसमें एक lsolve.jacobiफ़ंक्शन होता है , x(समाधान) और iter(पुनरावृत्तियों की संख्या ) के साथ एक सूची लौटाता है , लेकिन मुझे यकीन नहीं है कि यह सही गणना करता है।


स्टॉपिंग मानदंड नहीं है "इसका मतलब है कि पूर्ण परिमाण में वैक्टर के प्रत्येक घटक सबसे अधिक ई द्वारा भिन्न होते हैं"? मूल रूप से अधिकतम-आदर्श, एल 2-आदर्श नहीं।
निकोनिरह

@NikoNyrh आप सही हैं! सौभाग्य से, normफ़ंक्शन मेरे लिए और साथ ही बिना किसी अतिरिक्त बाइट के प्रदान करता है।
Giuseppe

1

क्लोजर, 212 198 196 बाइट्स

#(let[E(range)I(iterate(fn[X](map(fn[r b d](/(- b(apply +(map * r X)))d))(map assoc % E(repeat 0))%2(map nth % E)))%3)](count(for[x I :while(not-every?(fn[e](<(- %4)e %4))(map -(nth I 1e9)x))]x)))

मैट्रिक्स लाइब्रेरी के बिना कार्यान्वित, यह सही उत्तर प्राप्त करने के लिए 1e9 बार प्रक्रिया को पुनरावृत्त करता है। यह बहुत ही गलत सूचनाओं पर काम नहीं करेगा लेकिन व्यवहार में ठीक काम करना चाहिए।

कम गोल्फ वाले, मैं के भावों से काफी खुश था Rऔर D:) पहला इनपुट %(A) एक वेक्टर होना चाहिए, एक सूची नहीं, ताकि assocउसका उपयोग किया जा सके।

(def f #(let[R(map assoc %(range)(repeat 0))
             D(map nth %(range))
             I(iterate(fn[X](map(fn[r x b d](/(- b(apply +(map * r x)))d))R(repeat X)%2 D))%3)]
          (->> I
               (take-while (fn[x](not-every?(fn[e](<(- %4)e %4))(map -(nth I 1e9)x))))
               count)))
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.