Разработка библиотечных средств
Ðàçðàáîòêà áèáëèîòå÷íûõ ñðåäñòâ
ðåøåíèÿ çàäà÷ ëèíåéíîé àëãåáðû.
ÎÁÚÅÊÒ ÈÑÑËÅÄÎÂÀÍÈß: êëàññîâûå òèïû – ÷èñëåííàÿ êâàäðàòíàÿ ìàòðèöà è îäíîìåðíûé äèíàìè÷åñêèé ìàññèâ ñ ïåðåìåííûìè ðàçìåðàìè.
ÌÅÒÎÄ ÈÑÑËÅÄÎÂÀÍÈß: ðàçðàáîòêà àëãîðèòìîâ è íàïèñàíèå êëàññîâ ôóíêöèé íà ÿçûêå Borland Ñ++.
 êóðñîâîì ïðîåêòå ðàçðàáîòàíû àëãîðèòìû äëÿ ðåøåíèÿ îñíîâíûõ çàäà÷ ëèíåéíîé àëãåáðû. Ïî ýòèì àëãîðèòìàì íà ÿçûêå Borland C++ íàïèñàíû äâà êëàññà ôóíêöèé, îðèåíòèðîâàííûõ íà îáúåêòû òèïà ÷èñëåííàÿ êâàäðàòíàÿ ìàòðèöà è îäíîìåðíûé ìàññèâ (âåêòîð).  êëàññû âêëþ÷åíû àðèôìåòè÷åñêèå îïåðàöèè, îïåðàöèè ââîäà-âûâîäà, ôóíêöèè âû÷èñëåíèÿ îïðåäåëèòåëÿ ìàòðèöû, äëèíû âåêòîðà, à òàêæå ðåøåíèÿ ñèñòåìû ëèíåéíûõ àëãåáðàè÷åñêèõ óðàâíåíèé. Äëÿ íàãëÿäíîñòè ïîëó÷åííûõ ðåçóëüòàòîâ ðàçðàáîòàíà äåìîíñòðàöèîííî-òåñòèðóþùàÿ ïðîãðàììà.
Ðåçóëüòàòû êóðñîâîãî ïðîåêòà ìîãóò áûòü èñïîëüçîâàíû íà ïðàêòèêå äëÿ ðåøåíèÿ ñèñòåì ëèíåéíûõ óðàâíåíèé è äðóãèõ çàäà÷ ëèíåéíîé àëãåáðû.
ÂÂÅÄÅÍÈÅ
Îáúåêòíî-îðèåíòèðîâàííîå ïðîãðàììèðîâàíèå – ýòî íîâûé ñïîñîá ïîäõîäà ê ïðîãðàììèðîâàíèþ. Òàêîå ïðîãðàììèðîâàíèå, âçÿâ ëó÷øèå ÷åðòû ñòðóêòóðíîãî ïðîãðàììèðîâàíèÿ, äîïîëíÿåò åãî íîâûìè èäåÿìè, êîòîðûå ïåðåâîäÿò â íîâîå êà÷åñòâî ïîäõîä ê ñîçäàíèþ ïðîãðàìì.
Íàèáîëåå âàæíîå ïîíÿòèå ÿçûêîâ îáúåêòíî-îðèåíòèðîâàííîãî ïðîãðàììèðîâàíèÿ – ýòî ïîíÿòèå îáúåêòà (object). Îáúåêò – ýòî ëîãè÷åñêàÿ åäèíèöà, êîòîðàÿ ñîäåðæèò äàííûå è ïðàâèëà (ìåòîäû) îáðàáîòêè ýòèõ äàííûõ.  ÿçûêå Ñ++ â êà÷åñòâå òàêèõ ïðàâèë îáðàáîòêè âûñòóïàþò ôóíêöèè, ò. å. îáúåêò â Borland C++ îáúåäèíÿåò â ñåáå äàííûå è ôóíêöèè, îáðàáàòûâàþùèå ýòè äàííûå.
Îäíèì èç ñàìûõ ãëàâíûõ ïîíÿòèé ÿçûêà Ñ++ ÿâëÿåòñÿ ïîíÿòèå êëàññà (class).  ÿçûêå Ñ++ äëÿ òîãî, ÷òîáû îïðåäåëèòü îáúåêò, íàäî ñíà÷àëà îïðåäåëèòü åãî ôîðìó ñ ïîìîùüþ êëþ÷åâîãî ñëîâà class [1].
Áëèæàéøåé àíàëîãèåé êëàññà ÿâëÿåòñÿ ñòðóêòóðà. Ïàìÿòü âûäåëÿåòñÿ îáúåêòó òîëüêî òîãäà, êîãäà êëàññ èñïîëüçóåòñÿ äëÿ åãî ñîçäàíèÿ. Ýòîò ïðîöåññ íàçûâàåòñÿ ñîçäàíèåì ýêçåìïëÿðà êëàññà (class instance).
Ëþáîé îáúåêò ÿçûêà Ñ++ èìååò îäèíàêîâûå àòðèáóòû è ôóíêöèîíàëüíîñòü ñ äðóãèìè îáúåêòàìè òîãî æå êëàññà. Çà ñîçäàíèå ñâîèõ êëàññîâ è ïîâåäåíèå îáúåêòîâ ýòèõ êëàññîâ ïîëíóþ îòâåòñòâåííîñòü íåñåò ñàì ïðîãðàììèñò. Ðàáîòàÿ â íåêîòîðîé ñðåäå, ïðîãðàììèñò ïîëó÷àåò äîñòóï ê îáøèðíûì áèáëèîòåêàì ñòàíäàðòíûõ êëàññîâ.
Îáû÷íî, îáúåêò íàõîäèòñÿ â íåêîòîðîì óíèêàëüíîì ñîñòîÿíèè, îïðåäåëÿåìîì òåêóùèìè çíà÷åíèÿìè åãî àòðèáóòîâ. Ôóíêöèîíàëüíîñòü îáúåêòíîãî êëàññà îïðåäåëÿåòñÿ âîçìîæíûìè îïåðàöèÿìè íàä ýêçåìïëÿðîì ýòîãî êëàññà.
Øàáëîíû, èëè ïàðàìåòðèçîâàííûå òèïû, ïîçâîëÿþò êîíñòðóèðîâàòü ñåìåéñòâî ñâÿçàííûõ ôóíêöèé èëè êëàññîâ. Îáîáùåííûé ñèíòàêñèñ îïðåäåëåíèÿ øàáëîíà èìååò âèä
template <ñïèñîê øàáëîííûõ òèïîâ> {îáúÿâëåíèå} ;
Ðàçëè÷àþò øàáëîíû ôóíêöèé è øàáëîíû êëàññîâ.
Øàáëîí êëàññîâ çàäàåò îáðàçåö îïðåäåëåíèé ñåìåéñòâà êëàññîâ. Íàä òèïèçèðîâàííûìè ýëåìåíòàìè ýòîãî êëàññà âûïîëíÿþòñÿ îäèíàêîâûå áàçîâûå îïåðàöèè âíå çàâèñèìîñòè îò êîíêðåòíîãî òèïà ýëåìåíòîâ [2].
Ââåäåíèå â îáúåêòíî-îðèåíòèðîâàííîå ïðîãðàììèðîâàíèå
Îáúåêòíî-îðèåíòèðîâàííîå ïðîãðàììèðîâàíèå ïðåäñòàâëÿåò ñîáîé ÷óòü áîëåå àâòîìàòèçèðîâàííûé ñïîñîá ïðîãðàììèðîâàíèÿ. Îáúåêòíî-îðèåíòèðîâàííûå ïðîãðàììû – ýòî íå ïðîñòî ïðîöåäóðíûå ïðîãðàììû, ïåðåâåäåííûå íà íîâûé ñèíòàêñèñ. Îíè äîëæíû ñòðîèòñÿ íà íîâîé ôèëîñîôèè ðàçðàáîòêè. Äëÿ íèõ òðåáóåòñÿ íîâàÿ ñòðàòåãèÿ ïðîãðàììèðîâàíèÿ, êîòîðóþ ÷àñòî áûâàåò òðóäíî îñâîèòü [3].
Îñíîâíàÿ èäåÿ ÎÎÏ: ïðîãðàììà ñîñòîèò èç ãðóïïû îáúåêòîâ, ÷àñòî ñâÿçàííûõ ìåæäó ñîáîé.  Ñ++ îáúåêòû îïèñûâàþòñÿ ïðè ïîìîùè íîâîãî òèïà äàííûõ class. Êëàññ âêëþ÷àåò â ñåáÿ íàáîð ïåðåìåííûõ (äàííûõ) è îïåðàöèé (ìåòîäîâ èëè ôóíêöèé-÷ëåíîâ), êîòîðûå äåéñòâóþò íà ýòè ïåðåìåííûå. Ïîëó÷åííûìè îáúåêòàìè ìîæíî óïðàâëÿòü ïðè ïîìîùè ñîîáùåíèé.
 ÎÎÏ îáúåêòû âêëþ÷àþò â ñåáÿ íå òîëüêî äàííûå (äàííûå-÷ëåíû), íî è ìåòîäû (ôóíêöèè-÷ëåíû) âîçäåéñòâèÿ íà ýòè äàííûå. Ýòè äâå ÷àñòè â ñî÷åòàíèè îáðàçóþò ôóíêöèîíàëüíóþ åäèíèöó ïðîãðàììû. Äðóãèìè ñëîâàìè, îáúåêòû ñîäåðæàò äàííûå è ìåòîäû ðàáîòû ñ ýòèìè äàííûìè. Íèæå ïðèâåäåíû òðè îñíîâíûõ ïðåèìóùåñòâà îáúåêòíî-îðèåíòèðîâàííûõ ïðîãðàìì ïî ñðàâíåíèþ ñ ýêâèâàëåíòíûìè ïðîãðàììàìè, ðàçðàáîòàííûìè ñâåðõó âíèç.
Ñîïðîâîæäåíèå ïðîãðàììû. Ïðîãðàììû ïðîùå ÷èòàòü è ïîíèìàòü, ÎÎÏ ïîçâîëÿåò óïðàâëÿòü ñëîæíîñòüþ ïðîãðàììû, îñòàâëÿÿ âèäèìûìè ïðîãðàììèñòó òîëüêî ñóùåñòâåííûå äåòàëè.
Ìîäèôèêàöèÿ ïðîãðàììû (äîáàâëåíèå èëè èñêëþ÷åíèå âîçìîæíîñòåé). Âû ìîæåòå ÷àñòî äåëàòü äîïîëíåíèÿ èëè èñêëþ÷åíèÿ â ïðîãðàììå, íàïðèìåð ïðè ðàáîòå ñ áàçîé äàííûõ, ïðîñòî äîáàâëÿÿ è èñêëþ÷àÿ îáúåêòû. Íîâûå îáúåêòû ìîãóò íàñëåäîâàòü âñå ñâîéñòâà áàçîâûõ îáúåêòîâ, íåîáõîäèìî òîëüêî äîáàâèòü èëè óáðàòü îòëè÷àþùèåñÿ ñâîéñòâà.
Ïîâòîðíîå èñïîëüçîâàíèå. Ìîæíî ñîõðàíèòü ãðàìîòíî ðàçðàáîòàííûé îáúåêò â íàáîðå ïîëåçíûõ ïðîãðàìì è çàòåì âñòàâèòü åãî â íîâóþ ïðîãðàììó ñ íåáîëüøèìè èçìåíåíèÿìè èëè áåç èçìåíåíèé.
ÎÎÏ ïîëíîñòüþ ïðèíàäëåæèò ê ìèðó Ñ++, ïîñêîëüêó â Ñ íåò îñíîâíîãî ÿäðà – àáñòðàêòíîãî òèïà äàííûõ class [5]. Ïîýòîìó ïåðåïèñàòü ïðîöåäóðíî-îðèåíòèðîâàííóþ ïðîãðàììó êàê îáúåêòíî-îðèåíòèðîâàííóþ ãîðàçäî ñëîæíåå, ÷åì ïðîñòî ïîäñòàâèòü âìåñòî îäíîãî êëþ÷åâîãî ñëîâà äðóãîå.
ÎÎÏ ïðåäñòàâëÿåò ñîáîé òåõíèêó ïðîãðàììèðîâàíèÿ, êîòîðàÿ ïîçâîëÿåò ðàññìàòðèâàòü îñíîâíûå èäåè êàê ìíîæåñòâî îáúåêòîâ. Èñïîëüçóÿ îáúåêòû, ìîæíî ïðåäñòàâèòü çàäà÷è, êîòîðûå íåîáõîäèìî âûïîëíèòü, èõ âçàèìîäåéñòâèå è ëþáûå çàäàííûå óñëîâèÿ, êîòîðûå äîëæíû áûòü ñîáëþäåíû. Ñòðóêòóðà äàííûõ ÷àñòî îáðàçóåò îñíîâû îáúåêòîâ; òàêèì îáðàçîì â Ñ èëè Ñ++ òèï struct ìîæåò îáðàçîâûâàòü ýëåìåíòàðíûé îáúåêò. Ñâÿçü ñ îáúåêòîì ìîæíî îðãàíèçîâàòü ïðè ïîìîùè ñîîáùåíèé. Èñïîëüçîâàíèå ñîîáùåíèé ïîõîæå íà âûçîâ ôóíêöèé â ïðîöåäóðíî-îðèåíòèðîâàííîé ïðîãðàììå. Êîãäà îáúåêò ïîëó÷àåò ñîîáùåíèå, âñòóïàþò â äåéñòâèå ìåòîäû, ñîäåðæàùèåñÿ â îáúåêòå. Ìåòîäû (èõ èíîãäà íàçûâàþò ôóíöèÿìè-÷ëåíàìè) àíàëîãè÷íû ôóíêöèÿì ïðîöåäóðíî-îðèåíòèðîâàííîãî ïðîãðàììèðîâàíèÿ. Òåì íå ìåíåå ìåòîä ÿâëÿåòñÿ ÷àñòüþ îáúåêòà, à íå ÷åì-òî îòäåëüíûì, êàê áûëî áû â ïðîöåäóðíîì àíàëîãå.
Îñíîâíûå òåðìèíû è ïîëîæåíèÿ ÎÎÏ
Èíêàïñóëÿöèÿ äàííûõ
Ýòîò òåðìèí âêëþ÷àåò â ñåáÿ ëîãè÷åñêîå ñâÿçûâàíèå äàííûõ ñ êîíêðåòíîé îïåðàöèåé. Îíà òàê æå îçíà÷àåò, ÷òî îíè ÿâëÿþòñÿ íå -ãëîáàëüíûìè äîñòóïíûìè âñåé ïðîãðàììå, à ëîêàëüíûìè – äîñòóïíûìè òîëüêî ìàëîé åå ÷àñòè. Èíêàïñóëÿöèÿ òàêæå àâòîìàòè÷åñêè ïîäðàçóìåâàåò çàùèòó äàííûõ. Èìåííî äëÿ ýòîãî ïðåäíàçíà÷åíà ñòðóêòóðà class â Ñ++.  êëàññå óïðàâëåíèå ôóíêöèîíàëüíûìè äåòàëÿìè îáúåêòà îñóùåñòâëÿåòñÿ ïðè ïîìîùè ñïåöèôèêàòîðîâ private, public, protected.
Èåðàðõèÿ êëàññîâ
 îáùåì ñëó÷àå ìîæíî ïðåäñòàâèòü ñåáå èåðàðõèþ êëàññîâ êàê ðîäîñëîâíóþ â ãåíåàëîãè÷åñêîì äðåâå, ãäå êëàññ Ñ++ ïðåäñòàâëÿåò ñîáîé øàáëîí äëÿ ñîçäàíèÿ êëàññîâ-ïîòîìêîâ. Îáúåêòû, ïîëó÷åííûå èç îïèñàíèÿ êëàññà, íàçûâàþò ýêçåìïëÿðàìè ýòîãî êëàññà. Ìîæíî ñîçäàòü èåðàðõèþ êëàññîâ ñ êëàññîì-ðîäèòåëåì è íåñêîëüêèìè êëàññàìè-ïîòîìêàìè. Îñíîâîé äëÿ ýòîãî ÿâëÿþòñÿ ïðîèçâîäíûå êëàññû.
Íàñëåäîâàíèå
Íàñëåäîâàíèå â ÎÎÏ ïîçâîëÿåò êëàññó ïîëó÷àòü ñîâéñòâà äðóãîãî êëàññà îáúåêòîâ. Ðîäèòåëüñêèé êëàññ ñëóæèò øàáëîíîì äëÿ ïðîèçâîäíîãî êëàññà; ýòîò øàáëîí ìîæíî ìåíÿòü ðàçëè÷íûìè ñïîñîáàìè. Íàñëåäîâàíèå ÿâëÿåòñÿ âàæíûì ïîëîæåíèåì, ïîñêîëüêó îíî ïîçâîëÿåò ïîâòîðíî èñïîëüçîâàòü îïðåäåëåíèå êëàññà áåç çíà÷èòåëüíûõ èçìåíåíèé â êîäå.
Ïîëèìîðôèçì
Ñòðîèòñÿ íà îïèñàíîé âûøå êîíöåïöèè íàñëåäîâàíèÿ. Ïðîãðàììà ïîñûëàåò îäíî è òîæå ñîîáùåíèå êàê îáúåêòó ðîäèòåëüñêîãî êëàññà, òàê è âñåì îáúåêòàì ïðîèçâîäíûõ êëàññîâ. È ðîäèòåëüñêèé êëàññ, è êëàññû-ïîòîìêè îòâåòÿò íà ñîîáùåíèå ñîîòâåòñòâóþùèì îáðàçîì. Ïîëèìîðôèçì äàåò âîçìîæíîñòü äîïîëíÿòü óæå ñóùåñòâóþùèå ÷àñòè ïðîãðàììû.
Âèðòóàëüíûå ôóíêöèè
Âèðòóàëüíûå ôóíêöèè îïðåäåëÿþòñÿ â ðîäèòåëüñêîì êëàññå, à â ïðîèçâîäíûõ êëàññàõ ïðîèñõîäèò äîîïðåäåëåíèå ýòèõ ôóíêöèé è äëÿ íèõ ñîçäàþòñÿ íîâûå ðåàëèçàöèè. Ïðè ðàáîòå ñ âèðòóàëüíûìè ôóíêöèÿìè ñîîáùåíèÿ ïåðåäàþòñÿ êàê óêàçàòåëè, êîòîðûå óêàçûâàþò íà îáúåêò âìåñòî ïðÿìîé ïåðåäà÷è îáúåêòó. Âèðòóàëüíûå ôóíêöèè èñïîëüçóþò òàáëèöó äëÿ àäðåñíîé èíôîðìàöèè. Ýòà òàáëèöà èíèöèàëèçèðóåòñÿ âî âðåìÿ âûïîëíåíèÿ ïðè ïîìîùè êîíñòðóêòîðà.
Êîíñòðóêòîð âûçûâàåòñÿ êàæäûé ðàç, êîãäà ñîçäàåòñÿ îáúåêò åãî êëàññà. Çàäà÷à êîíñòðóêòîðà â äàííîì ñëó÷àå ñîñòîèò â ñâÿçûâàíèè âèðòóàëüíîé ôóíêöèè ñ òàáëèöåé àäðåñíîé èíôîðìàöèè. Âî âðåìÿ êîìïèëÿöèè àäðåñ âèðòóàëüíîé ôóíêöèè íåèçâåñòåí; âìåñòî ýòîãî åé îòâîäèòñÿ ïîçèöèÿ â òàáëèöå àäðåñîâ. Ýòà ïîçèöèÿ áóäåò ñîäåðæàòü àäðåñ ôóíêöèè [5].
Ãëàâà 2. Çàäà÷è ëèíåéíîé àëãåáðû
2.1. Âû÷èñëåíèå îïðåäåëèòåëåé
Ïóñòü èìååì êâàäðàòíóþ ìàòðèöó ðàçìåðîì n´ n:
. (2.1.1)
Òðåáóåòñÿ âû÷èñëèòü îïðåäåëèòåëü ìàòðèöû det(A).
Ýêâèâàëåíòíûì ïðåîáðàçîâàíèåì ìàòðèöû íàçûâàþò ïðåîáðàçîâàíèÿ ìàòðèöû, íå èçìåíÿþùèå âåëè÷èíó îïðåäåëèòåëÿ ìàòðèöû. Ýêâèâàëåíòíûì ÿâëÿåòñÿ ñëåäóþùåå ïðåîáðàçîâàíèå: ëþáóþ ñòðîêó ìàòðèöû ìîæíî çàìå-íèòü ñóììîé èñõîäíîé ñòðîêè è ëþáîé äðóãîé, óìíîæåííîé íà ëþáîå ÷èñëî, íå ðàâíîå íóëþ.
Èñïîëüçóÿ òàêîãî ðîäà ïðåîáðàçîâàíèÿ ìîæíî ïîïûòàòüñÿ ïðèâåñòè èñ-õîäíóþ ìàòðèöó ê òðåóãîëüíîìó âèäó:
,
ïðè ýòîì det(A) = det(A¢ ).
Ôîðìóëà äëÿ ïåðåñ÷åòà ýëåìåíòîâ ìàòðèöû èìååò âèä:
, (2.1.2)
ãäåi- íîìåð ñòîëáöà, â êîòîðîì ýëåìåíòû, ëåæàùèå íèæå ãëàâíîé
äèàãîíàëè, ïðåâðàùàþòñÿ â íóëè;
j- íîìåð ýëåìåíòà â îáðàáàòûâàåìîì ñòîëáöå (ò.å. íîìåð ñòðîêè);
k- íîìåð ýëåìåíòà â òåêóùåé ñòðîêå.
Àëãîðèòì ïðèâåäåíèÿ ìàòðèöû ê òðåóãîëüíîìó âèäó âêëþ÷àåò â ñåáÿ 3 âëîæåííûõ öèêëà:
- âíåøíèé öèêë, i = 1 .. n-1 ;
- ñðåäíèé öèêë, j = i+1 .. n ;
- âíóòðåííèé öèêë, k = i+1 .. n .
Òåïåðü èñêîìûé îïðåäåëèòåëü âû÷èñëÿåòñÿ êàê ïðîèçâåäåíèå äèàãîíàëüíûõ ýëåìåíòîâ:
.
Îïèñàííûé âûøå àëãîðèòì äàåò ðåçóëüòàò íå âñåãäà. Åñëè ïðè âûïîëíåíèè i-òîãî øàãà âíåøíåãî öèêëà äèàãîíàëüíûé ýëåìåíò aii îêàçûâàåòñÿ ðàâíûì íóëþ, à ñðåäè ýëåìåíòîâ i-òîãî ñòîëáöà ñ íîìåðàìè îò i+1 äî n åñòü õîòÿ áû îäèí íå íóëåâîé, àëãîðèòì çàâåðøàåòñÿ áåçðåçóëüòàòíî (èç-çà íåâîçìîæíîñòè âû÷èñëåíèé ïî ôîðìóëå (2.1.2). Äëÿ òîãî, ÷òîáû ýòî íå ïðîèñõîäèëî, èñïîëüçóåòñÿ ïðèåì, êîòîðûé íàçûâàåòñÿ “âûáîð ãëàâíîãî ýëåìåíòà”.
Ïðè âûïîëíåíèè î÷åðåäíîãî øàãà öèêëà ïî i ïðåäâàðèòåëüíî âûïîëíÿþòñÿ ñëåäóþùèå îïåðàöèè:
1) íàõîäèòñÿ ìàêñèìàëüíûé ïî ìîäóëþ ýëåìåíò ñðåäè ýëåìåíòîâ i-òîãî ñòîëáöà îò aii äî ani ;
2) åñëè íàéäåííûé ýëåìåíò ali ðàâåí íóëþ, ïðîöåññ âû÷èñëåíèÿ çàâåðøàåòñÿ ñ âûäà÷åé ðåçóëüòàòà det(A) = 0 ;
3) åñëè l¹ i , òîãäà ñòðîêè èñõîäíîé ìàòðèöû ñ íîìåðàìè i,l ïîìåíÿòü ìåñòàìè.
Ïîñëå çàâåðøåíèÿ ïðåîáðàçîâàíèÿ ìàòðèöû, îïðåäåëèòåëü âû÷èñëÿåòñÿ ïî ôîðìóëå:
,
ãäå p – ÷èñëî âûïîëíåííûõ îïåðàöèé ïåðåìåíû ñòðîê ìåñòàìè.
2.2 Îáðàùåíèå ìàòðèö
Îáðàòíîé ê ìàòðèöå A íàçûâàåòñÿ ìàòðèöà A-1, îáëàäàþùàÿ ñâîéñòâîì:
A× A-1 = A-1× A = I ,
ãäå I – åäèíè÷íàÿ äèàãîíàëüíàÿ ìàòðèöà. Îïèøåì îäèí èç óíèâåðñàëüíûõ è ýôôåêòèâíûõ ìåòîäîâ ðàñ÷åòà îáðàòíîé ìàòðèöû (ìåòîä Æîðäàíà-Ãàóññà, â êíèãå [4-218] îïèñàí êàê “ìåòîä èñêëþ÷åíèé”).  [5-22] ïðèâåäåí áîëåå ýôôåêòèâíûé ïî ïàìÿòè àëãîðèòì îáðàùåíèÿ ìàòðèöû.
Ïóñòü èìååì ìàòðèöó A âèäà (2.1.1) è ïóñòü B – åäèíè÷íàÿ äèàãîíàëüíàÿ ìàòðèöà òàêîãî æå ðàçìåðà. Ñîçäàäèì ðàáî÷óþ ìàòðèöó R ðàçìåðîì N´ 2N ïðîñòî ïðèñîåäèíèâ ìàòðèöó B ñïðàâà ê ìàòðèöå A :
.
Íàä ñòðîêàìè òàêîé ðàñøèðåííîé ìàòðèöû áóäåì ïðîèçâîäèòü ïðåîáðàçîâàíèÿ, àíàëîãè÷íûå òåì, êîòîðûå áûëè îïèñàíû â ï.2.1. Ëåâóþ ÷àñòü ìàòðèöû R áóäåì íàçûâàòü ïîäìàòðèöåé A, ïðàâóþ – ïîäìàòðèöåé B. Âåñü ïðîöåññ ïðåîáðàçîâàíèÿ ìàòðèöû R ðàçîáüåì íà 3 ýòàïà.
1 ýòàï. Âûïîëíèì ïðåîáðàçîâàíèÿ ñòðîê ìàòðèöû òàê, ÷òîáû âñå ýëåìåíòû, ëåæàùèå íèæå äèàãîíàëüíûõ ýëåìåíòîâ ïîäìàòðèöû A, îáðàòèëèñü â íóëè. Ïðè ýòîì ìîæåò èñïîëüçîâàòüñÿ âûáîð ãëàâíîãî ýëåìåíòà.
2 ýòàï. Âûïîëíèì ïðåîáðàçîâàíèÿ òàê, ÷òîáû âñå ýëåìåíòû, ëåæàùèå âûøå äèàãîíàëüíûõ ýëåìåíòîâ ïîäìàòðèöû A, îáðàòèëèñü â íóëè. Ïðåîáðàçîâàíèÿ íàäî âûïîëíÿòü â îáðàòíîì ïîðÿäêå: ñî ñòîëáöà íîìåð n è äî ñòîëáöà íîìåð 2.
3 ýòàï. Êàæäóþ ñòðîêó ðàñøèðåííîé ìàòðèöû R ñ íîìåðîì i äåëèì íà äèàãîíàëüíûé ýëåìåíò aii .
Ïîñëå çàâåðøåíèÿ ïðîöåäóðû ïîäìàòðèöà A ïðåâðàùàåòñÿ â åäèíè÷íóþ äèàãîíàëüíóþ ìàòðèöó, à ïîäìàòðèöà B áóäåò ðàâíà èñêîìîé îáðàòíîé ìàòðèöå A-1 . Àëãîðèòì èìååò ïîðÿäîê O(n3).
2.3. Ìåòîäû ðåøåíèÿ ñèñòåì ëèíåéíûõ óðàâíåíèé
Çàäà÷à ïîèñêà ðåøåíèé ñèñòåìû ëèíåéíûõ óðàâíåíèé èìååò íå òîëüêî ñàìîñòîÿòåëüíîå çíà÷åíèå, íî ÷àñòî ÿâëÿåòñÿ ñîñòàâíîé ÷àñòüþ àëãîðèòìà ðåøåíèÿ ìíîãèõ íåëèíåéíûõ çàäà÷. Îñíîâíûå ìåòîäû ðåøåíèÿ ÑËÓ:
- ìåòîä Ãàóññà;
- ìåòîä îáðàùåíèÿ ìàòðèöû;
- èòåðàöèîííûå ìåòîäû.
2.4. Ìåòîä Ãàóññà
Ïóñòü èìååì ñèñòåìó ëèíåéíûõ óðàâíåíèé:
Ïðîñòîé ìåòîä Ãàóññà ñîñòîèò â ñëåäóþùåì.
Ñîñòàâèì ðàñøèðåííóþ ìàòðèöó, ïðèïèñàâ ê ìàòðèöå êîýôôèöèåíòîâ ÑËÓ äîïîëíèòåëüíûé ñòîëáåö – ïðàâûå ÷àñòè óðàâíåíèÿ:
.
Âûïîëíèì íàä ñòðîêàìè ðàñøèðåííîé ìàòðèöû ïðåîáðàçîâàíèÿ, àíàëîãè÷íûå òåì, êîòîðûå áûëè îïèñàíû â ï. 2.1:
,
,
è ïðèâåäåì åå ê òðåóãîëüíîìó âèäó:
.
Òåïåðü ìîæíî âû÷èñëèòü èñêîìûå âåëè÷èíû xi , íà÷èíàÿ ñ ïîñëåäíåãî, ò.å. âíà÷àëå íàõîäèòñÿ xn , çàòåì xn-1, xn-2, … , x1. Ôîðìóëà äëÿ âû÷èñëåíèé èìååò âèä:
.
Äëÿ ðàñøèðåíèÿ âîçìîæíîñòåé è ïîâûøåíèÿ óñòîé÷èâîñòè ïðèâåäåííîãî àëãîðèòìà èñïîëüçóåòñÿ âûáîð ãëàâíîãî ýëåìåíòà. Ïîðÿäîê ìåòîäà Ãàóññà ðàâåí O(n3).
2.5. Ìåòîä îáðàùåíèÿ ìàòðèöû
Ïðåäñòàâèì ñèñòåìó ëèíåéíûõ óðàâíåíèé â ìàòðè÷íîé ôîðìå:
.
Óìíîæèì ïîñëåäíåå ðàâåíñòâî ñëåâà íà A-1 :
.
Ó÷èòûâàÿ, ÷òî A-1× A = I , ôîðìàëüíî ïîëó÷àåì èñêîìîå ðåøåíèå:
Òàêèì îáðàçîì, ðåøåíèå ñèñòåìû âûïîëíÿåòñÿ â äâà ýòàïà:
1) âû÷èñëåíèå îáðàòíîé ìàòðèöû;
2) óìíîæåíèå îáðàòíîé ìàòðèöû íà âåêòîð ïðàâûõ ÷àñòåé ÑËÓ.
Íåñìîòðÿ íà òî, ÷òî ìåòîä îáðàùåíèÿ ìàòðèöû èìååò òàêîé æå ïîðÿäîê, êàê è ìåòîä Ãàóññà - O(n3), ïî îáúåìó âû÷èñëåíèé îí ïðîèãðûâàåò åìó â íåñêîëüêî ðàç. Îäíàêî, åñëè ÑËÓ íåîáõîäèìî ðåøàòü ìíîãîêðàòíî è ïðè ýòîì èçìåíÿåòñÿ ëèøü âåêòîð ïðàâûõ ÷àñòåé, ìåòîä îáðàùåíèÿ ìàòðèöû ñòàíîâèòñÿ âñå æå âûãîäíûì.
Ïðàêòè÷åñêàÿ ÷àñòü
Îïèñàíèå êëàññà Matrix äëÿ ðåøåíèÿ çàäà÷ ëèíåéíîé àëãåáðû
Êëàññ èìååò ïðèâàòíûå è îáùåäîñòóïíûå ÷ëåíû-äàííûå è ÷ëåíû-ôóíêöèè (ìåòîäû). Äëÿ õðàíåíèÿ êîìïîíåíòîâ ìàòðèöû èñïîëüçóåòñÿ îäíîìåðíûé äèíàìè÷åñêèé ìàññèâ ýëåìåíòîâ òèïà ïàðàìåòðà øàáëîíà. Äëÿ ñîçäàíèÿ îáúåêòà ïðåäóñìîòðåíû òðè êîíñòðóêòîðà: êîíñòðóêòîð ïî óìîë÷àíèþ, êîíñòðóêòîð ñ ïàðàìåòðàìè, êîíñòðóêòîð êîïèðîâàíèÿ è äåñòðóêòîð. Äëÿ âûïîëíåíèÿ ìíîæåñòâà ìàòðè÷íûõ îïåðàöèé ñîçäàíû ïåðåãðóæåííûå îïåðàöèè: ïðèñâàèâàíèÿ (=), ñëîæåíèÿ (+), âû÷èòàíèÿ (-), óìíîæåíèÿ(*) è ò.ï. Íà áàçå îïåðàòîðîâ ââîäà/âûâîäà Ñ++ ðàçðàáîòàíû ôóíêöèè ââîäà ìàòðèö èç ïîòîêà è âûâîäà èõ â ïîòîê, ïðåäóñìàòðèâàþùèå â ñëó÷àå ôàéëîâîãî ââîäà/âûâîäà êàê òåêñòîâóþ ôîðìó õðàíåíèÿ, òàê è áèíàðíóþ.
Äîñòóï ê ÷ëåíàì-äàííûì êëàññà – ÷èñëó ñòðîê è ñòîëáöîâ ìàòðèöû îñóùåñòâëÿåòñÿ ñ ïîìîùüþ ìåòîäîâ size_row( ) è size_col( ). Äëÿ äîñòóïà ê ýëåìåíòàì ìàòðèöû ñîçäàí ïåðåãðóæåííûé îïåðàòîð âûçîâà ôóíêöèè operator( ) (dim x, dim x), ãäå dim – ïåðåîïðåäåëåííûé òèï unsigned char. Âûçîâ ôóíêöèè èñïîëüçóåòñÿ êàê îïåðàòîð èíäåêñèðîâàíèÿ, ïðèíèìàþùèé äâà àðãóìåíòà. Àíàëîãè÷íî ñîçäàí îïåðàòîð âûçîâà ôóíêöèè ñ îäíèì àðãóìåíòîì operator( ) (dim x). Äëÿ äàííîãî êëàññà – ýòî î÷åíü âàæíûå ïåðåãðóæåííûå îïåðàòîðû, ò.ê. îíè èñïîëüçóþòñÿ âî âñåõ ôóíêöèÿõ è îïåðàòîðàõ, â êîòîðûõ ïðîèñõîäèò îáðàùåíèå ê ýëåìåíòàì ìàòðèöû.
Îïèñàíèå ôóíêöèé, êîíñòðóêòîðîâ è äåñòðóêòîðîâ êëàññà:
Êîíñòðóêòîð ïî óìîë÷àíèþ Matrix( ):
Êîíñòðóêòîð ïî óìîë÷àíèþ ñîçäàåò ìàòðèöó íóëåâîãî ðàçìåðà.  äàëüíåéøåì ðàçìåð ýòîé ìàòðèöû ìîæíî èçìåíèòü ñ ïîìîùüþ ôóíêöèè newsize(i, j).
Êîíñòðóêòîð ñ ïàðàìåòðàìè Matrix(dim, dim=1):
Ýòî îáû÷íûé êîíñòðóêòîð ñ ïàðàìåòðàìè, êîòîðûé ïðèíèìàåò â êà÷åñòâå ïàðàìåòðîâ ðàçìåðû ìàòðèöû è ñîçäàåò îäíîìåðíûé äèíàìè÷åñêèé ìàññèâ ðàçìåðîì m*n, ãäå m – ÷èñëî ñòðîê, à n – ÷èñëî ñòîëáöîâ ìàòðèöû. Ñ öåëüþ âîçìîæíîñòè èñïîëüçîâàòü åãî äëÿ ñîçäàíèÿ âåêòîðîâ, âòîðîé ïàðàìåòð êîíñòðóêòîðà çàäàí êàê óìàë÷èâàåìûé ñî çíà÷åíèåì 1. Äëÿ ïåðâîíà÷àëüíîé “èíèöèàëèçàöèè” ýëåìåíòîâ ìàòðèöû íóëÿìè èñïîëüçóåòñÿ ôóíêöèÿ setmem( ).
Êîíñòðóêòîð êîïèðîâàíèÿ Matrix(const Matrix &):
Êîíñòðóêòîð ïðèíèìàåò â êà÷åñòâå ïàðàìåòðà ññûëêó íà îáúåêò êëàññà (íà ñóùåñòâóþùóþ ìàòðèöó), îïðåäåëÿåò åå ðàçìåð, âûäåëÿåò äëÿ íåå ïàìÿòü è êîïèðóåò â ýòó ïàìÿòü ñîäåðæèìîå ìàòðèöû, ïðèíèìàåìîé ïî ññûëêå. Òàêèì îáðàçîì, ñîçäàåòñÿ òî÷íàÿ êîïèÿ ìàòðèöû ñ òåêóùèìè çíà÷åíèÿìè åå ýëåìåíòîâ.
Äåñòðóêòîð ~Matrix( ):
Äåñòðóêòîð âûñâîáîæäàåò ïàìÿòü, âûäåëåííóþ êîíñòðóêòîðàìè äëÿ ýëåìåíòîâ ìàòðèöû.
Ôóíêöèÿ îïåðàöèè ïðèñâàèâàíèÿ "=" Matrix& operator= (Matrix&):
Äàííàÿ ôóíêöèÿ ñðàâíèâàåò àäðåñ ïåðåäàâàåìîãî ïî ññûëêå îáúåêòà ñ àäðåñîì ñîáñòâåííîãî êëàññà, ÷òîáû íå ïðåäïðèíÿëàñü ïîïûòêà ïðèñâîèò îáúåêò ñàìîìó ñåáå. Ïîñëå ýòîãî ñîçäàåòñÿ íîâûé ìàññèâ ñ ÷èñëîì ýëåìåíòîâ, ðàâíûì ÷èñëó ýëåìåíòîâ ìàññèâà ïðèíèìàåìîãî ïî ññûëêå, è â ýòîò ìàññèâ çàíîñèòñÿ ñîäåðæèìîå ïðèíèìàåìîãî ìàññèâà. Âîçâðàùàåòñÿ ðàçûìåíîâàííûé óêàçàòåëü this (return *this;).
Ôóíêöèè îïåðàöèé ñóììèðîâàíèÿ, âû÷èòàíèÿ, óìíîæåíèÿ ìàòðèö è óìíîæåíèÿ ìàòðèöû íà ÷èñëî:
Ýòè ôóíêöèè ðåàëèçîâàíû êàê äðóæåñòâåííûå ôóíêöèè è àëãîðèòìû ýòèõ ôóíêöèé àíàëîãè÷íû ïî ñâîåìó ñîñòàâó. Îáùèé âèä ïðîòîòèïà ýòèõ ôóíêöèé: friend Matrix operator @(const Matrix&, const Matrix&). Ïðèìåíåíèå äðóæåñòâåííûõ ôóíêöèé â äàííîì ñëó÷àå öåëåñîîáðàçíî äëÿ òîãî, ÷òîáû èìåòü âîçìîæíîñòü ïåðåäàâàòü â îïåðàòîð ôóíêöèþ îáúåêòû â ëþáîé ïîñëåäîâàòåëüíîñòè.  ýòèõ îïåðàòîðàõ-ôóíêöèÿõ âíà÷àëå ñîçäàåòñÿ âðåìåííûé îáúåêò òèïà ìàòðèöà (ñ ïîìîùüþ êîíñòðóêòîðà êîïèðîâàíèÿ), â êîòîðûé êîïèðóåòñÿ ïåðâàÿ ìàòðèöà è êîòîðûé ïðè âûõîäå èç ôóíêöèè ÿâëÿåòñÿ âîçâðàùàåìûì îáúåêòîì. Çàòåì ýòà ìàòðèöà ñóììèðóåòñÿ (âû÷èòàåòñÿ, óìíîæàåòñÿ) ñ ìàòðèöåé, ñòîÿùåé ïîñëå çíàêà îïåðàòîðà ïî ñîîòâåòñòâóþùèì ïðàâèëàì ìàòðè÷íûõ îïåðàöèé. Ïðè ýòîì äëÿ äîñòóïà ê ýëåìåíòàì ìàòðèöû è èíäåêñèðîâàíèÿ èñïîëüçóþòñÿ ïåðåãðóæåííûå îïåðàòîðû âûçîâà ôóíêöèè operator( ) (dim x, dim x) è operator( ) (dim x).
Ôóíêöèÿ – îïåðàòîð Matrix operator^ (int):
Ýòîò îïåðàòîð-ôóíêöèÿ ðåàëèçîâàí êàê ÷ëåí êëàññà è ïðåäíàçíà÷åí äëÿ âîçâåäåíèÿ ìàòðèöû â ñòåïåíü.  ñëó÷àå, êîãäà çíà÷åíèå âõîäíîãî ïàðàìåòðà ðàâíî ìèíóñ åäèíèöå îñóùåñòâëÿåòñÿ âûçîâ ôóíêöèè âû÷èñëåíèÿ îáðàòíîé ìàòðèöû ìåòîäîì ïðåîáðàçîâàíèé Ãàóññà, äëÿ ÷åãî ðàçðàáîòàíà îòäåëüíàÿ ôóíêöèÿ Matrix & Gauss(dim, dim). Òàêèì îáðàçîì, èñïîëüçîâàíèå ýòîãî îïåðàòîðà ïîçâîëÿåò ðåøàòü ñèñòåìó ëèíåéíûõ àëãåáðàè÷åñêèõ óðàâíåíèé â ïðåäñòàâëåíèè X = (A^-1)*B, ãäå X è B –âåêòîðà íåèçâåñòíûõ è ïðàâûõ ÷àñòåé ñîîòâåòñòâåííî.
Ôóíêöèÿ – îïåðàòîð Matrix operator ! ( ):
Îïåðàòîð äëÿ îïðåäåëåíèÿ òðàíñïîíèðîâàííîé ìàòðèöû.
Ôóíêöèÿ – îïåðàòîð friend VARTYPE operator %(const Matrix&, const Matrix&):
Ôóíêöèÿ âû÷èñëåíèÿ ñêàëÿðíîãî ïðîèçâåäåíèÿ âåêòîðîâ.  íåé â íà÷àëå ïðîâåðÿåòñÿ, ÿâëÿþòñÿ ëè ïåðåäàâàåìûå îáúåêòû âåêòîðàìè, à çàòåì âû÷èñëÿåòñÿ ñêàëÿðíîå ïðîèçâåäåíèå.
Ôóíêöèè-÷ëåíû VARTYPE determ( ) è VARTYPE vmodule( ):
Ïåðâàÿ ôóíêöèÿ âû÷èñëÿåò îïðåäåëèòåëü ñîáñòâåííîãî îáúåêòà (ìàòðèöû). Ïðè ýòîì èñïîëüçóþòñÿ ôóíêöèÿ Matrix & Gauss(dim, dim). Ôóíêöèÿ VARTYPE vmodule( ) âû÷èñëÿåò äëèíó (ìîäóëü) âåêòîðà
Ôóíêöèÿ îïåðàöèè âûâîäà friend ostream& operator<<(ostream&, Matrix&):
Äàííàÿ ôóíêöèÿ íå ìîæåò áûòü ÷ëåíîì êëàññà, ïîýòîìó ÷òîáû èìåòü äîñòóï ê ïðèâàòíûì ýëåìåíòàì êëàññà, îíà îáúÿâëåíà "äðóæåñòâåííîé" ôóíêöèåé. Îíà èìååò äâà ïàðàìåòðà: ññûëêó íà ïîòîê, êîòîðûé íàõîäèòñÿ ñëåâà îò çíàêà îïåðàöèè <<, è ññûëêó íà îáúåêò, êîòîðûé íàõîäèòñÿ ñëåâà îò çíàêà îïåðàöèè, äàííûå ýòîãî îáúåêòà è áóäóò âûâîäèòüñÿ. Çàòåì ñëåäóåò ôîðìàòèðîâàííûé âûâîä â ïîòîê âñåõ ýëåìåíòîâ ìàññèâà è âîçâðàùàåòñÿ ïîòîê. Åñëè òðåáóåòñÿ âûâåñòè äàííûå â ôàéë, íóæíî îòêðûòü åãî ïðèñîåäèíåíèåì ê ïîòîêó ofstream.
Ôóíêöèÿ îïåðàöèè ââîäà friend istream& operator>>(istream&, Matrix&):
Òàê æå êàê è ïðåäûäóùàÿ, äàííàÿ ôóíêöèÿ íå ìîæåò áûòü ÷ëåíîì êëàññà, à ïîýòîìó äëÿ äîñòóïà ê ïðèâàòíûì ýëåìåíòàì êëàññà îáúÿâëåíà "äðóæåñòâåííîé" ôóíêöèåé êëàññà. Îíà òàê æå èìååò äâà ïàðàìåòðà: ññûëêó íà ïîòîê, êîòîðûé íàõîäèòñÿ ñëåâà îò çíàêà >>, è ññûëêó îáúåêò, êîòîðûé íàõîäèòñÿ ñëåâà îò çíàêà îïåðàöèè, â íåãî è áóäóò ââîäèòüñÿ äàííûå èç ïîòîêà. Çàòåì ñëåäóåò ââîä äàííûõ èç ïîòîêà â ýëåìåíòû ìàññèâà è âîçâðàùàåòñÿ ïîòîê. Äëÿ ââîäà äàííûõ èç ôàéëà, íóæíî îòêðûòü åãî ïðèñîåäèíåíèåì ê ïîòîêó ifstream.
Ôóíêöèè-÷ëåíû dim write(ofstream&) è dim read(ifstream&):
Ôóíêöèè ïðåäíàçíà÷åíû äëÿ âûâîäà â ôàéë è ââîäà èç ôàéëà ìàòðèö â èç äâîè÷íîì ïðåäñòàâëåíèè. Äëÿ ýòîãî íåîáõîäèìî ïåðåäàòü â íèõ ñîîòâåòñòâóþùóþ ññûëêó íà îòêðûòûé ôàéë.
Ôóíêöèÿ void ERROR_MATRIX(dim):
Ýòî ôóíêöèÿ-÷ëåí, êîòîðàÿ âûçûâàåòñÿ äëÿ ôèêñàöèè íåêîòîðûõ îøèáîê ïðè ñîçäàíèè ìàòðèö è ðàáîòå ñ íèìè, òàêèõ êàê îòñóòñòâèå ïàìÿòè, íåñîãëàñîâàííîñòü ðàçìåðîâ ìàòðèö ïðè îïåðàöèè óìíîæåíèÿ, ïîïûòêè âû÷èñëèòü îòðèöàòåëüíóþ ñòåïåíü ìàòðèöû è ò.ï.
Ëèñòèíã ìîäóëÿ ñ îïðåäåëåíèåì è ðåàëèçàöèåé êëàññà ìàòðèö
// ôàéë tmatr.cpp
#include
#include
#include
#include
typedef unsigned char dim;
template
typedef Matrix Vector;
private:
VARTYPE *matr; // óêàçàòåëü íà ìàññèâ ìàòðèöû
dim m,n;// ðàçìåðû ìàòðèöû
public:
// êîíñòðóêòîðû è äåñòðóêòîðû:
Matrix() { matr=(VARTYPE*)0; m=n=0; }
Matrix(dim,dim=1); // Îáû÷íûé êîíñòðóêòîð
Matrix(const Matrix
~Matrix() { delete [ ]matr; }
// äîñòóï ê ýëåìåíòàì ìàòðèöû
dim size_row() { return m; }// ÷èñëî ñòðîê
dim size_col() { return n; }// ÷èñëî ñòîëáöîâ
VARTYPE& operator() (dim x) const { return (*this)(x,0); }// ýëåìåíòó
// ïåðåãðóæåííûå îïåðàöèè è ôóíêöèè:
Matrix
Matrix
Matrix
Matrix
VARTYPE determ(); // îïðåäåëèòåëü ìàòðèöû
VARTYPE vmodul(); // ìîäóëü âåêòîðà
Matrix& Gauss(dim,dim); // ïðåîáðàçîâàíèå ïî Ãàóññó
// (äëÿ ïîëó÷. îáðàòíîé è åäèíè÷íîé ìàòðèöû)
// (äëÿ ïîëó÷. âåðõíåòðåóãîëüíîé ìàòðèöû)
Matrix minor(dim,dim); // âîçâðàùàåò óêàç. ìèíîð ìàòðèöû
Vector line(dim i) // âîçâðàùàåò âåêòîð-ñòðîêó ìàòðèöû
{ return extract(1,n,i,0); }
Vector column(dim j) // âîçâðàùàåò âåêòîð-ñòîëáåö ìàòðèöû
{ return extract(m,1,0,j); }
VARTYPE& operator() (dim,dim) const;// äîñòóï ê
Matrix
// áåçóñëîâíîå ïðèðàâíèâàíèå ìàòðèö
Matrix
Matrix
Matrix
void swap_line(dim, dim);//îáìåí ñòðîêàìè ìàòðèöû
void swap_column(dim, dim);// îáìåí ñòîëáöàìè ìàòðèöû
friend Matrix
friend Matrix
friend Matrix
friend Matrix operator*(const double&,const Matrix
friend Matrix operator*(const Matrix
friend ostream& operator<<(ostream&,Matrix
// ïîòîêîâûé âûâîä ìàòðèöû
friend int operator>>(istream&,Matrix
// ïîòîêîâûé ââîä ñóùåñòâ. ìàòðèöû
// 0 - áåç. îøèáîê, 1 - áûëà îøèáêà
dim read(ifstream&); // ôàéëîâîå ÷òåíèå è çàïèñü ìàòðèöû
dim write(ofstream&);// â åå âíóòðåííåì, äâîè÷íîì ïðåäñòàâëåíèè.
friend VARTYPE operator %(const Matrix
//Ôóíêöèÿ îøèáîê
void ERROR_MATRIX(dim) const;
};
// Ðåàëèçàöèÿ êëàññà ìàòðèö
template
Matrix
{
m=M;
n=N;
matr=new VARTYPE[m*n];
if(!matr) ERROR_MATRIX(1);
setmem(matr,sizeof(VARTYPE)*m*n,0);
}
template
Matrix
{
m=M_Obj.m;
n=M_Obj.n;
matr=new VARTYPE[m*n];
if(!matr) ERROR_MATRIX(1);
movmem(M_Obj.matr, matr, sizeof(VARTYPE)*m*n);
}
template
Matrix
{
m=M_Obj.m;
n=M_Obj.n;
matr=new VARTYPE[m*n];
if(!matr) ERROR_MATRIX(1);
movmem(M_Obj.matr,matr,sizeof(VARTYPE)*m*n);
return *this;
}
//Äèàãîíàëü?
template
Matrix
{
for(int i=0,j;i if(i==j) (*this)(i,j)=f; else (*this)(i,j)=0; return *this; } template Matrix { if (q>0) { for(Matrix M=*this; q>1; q--) M=M*(*this); return M; } if (q!=-1) ERROR_MATRIX(3); // âû÷èñëåíèå îáðàòíîé ìåòoäîì ïðåîáðàçîâàíèé Ãàóññà if (n!=m) ERROR_MATRIX(4); Matrix M(m,2*n); M.insert(*this); for(int i=0;i M(i,i+M.m)=1; for(i=0;i M.Gauss(i,i); return M.extract(M.m,M.m,0,M.m); } template Matrix { Matrix for(int i=0, j; i for(j=0; j A(j,i)=(*this)(i,j); return A; } template VARTYPE Matrix { if (n!=m) ERROR_MATRIX(4); if (n==1) return (*this)(0,0); for(int i=0; i if ((*this)(i,0)) { static Matrix M <<= *this; VARTYPE d=M(i,0)*(i%2?-1:1); return d*M.Gauss(i,0).minor(i,0).determ(); } return 0.0; } template VARTYPE Matrix { VARTYPE d=0; if (n!=1) ERROR_MATRIX(9); static Matrix M <<= *this; for(int i=0; i d=d+M(i,0)*M(i,0); return sqrt(d); } template Matrix { Matrix if (!A(M,N)) ERROR_MATRIX(5); for(int i=0,j;i for(j=0;j if (i!=M && j!=N) A(i,j)-=A(M,j)*A(i,N)/A(M,N); for(j=0;j if (j!=N) A(M,j)/=A(M,N); for(i=0;i A(i,N)=0; A(M,N)=1; return *this; } template Matrix {// ñòðîêè y è ñòîëáöà x Matrix for(int i=0,in=0,j,jn;i if (i!=M) { for(j=0,jn=0;j if (j!=N) A(in,jn++)=(*this)(i,j); in++; } return A; } template Matrix { if (M+A.m>m || N+A.n>n) ERROR_MATRIX(6); for(int i=0, j; i for(j=0; j (*this)(i+M,j+N)=A(i,j); return *this; } template Matrix { if (M+LM>m || N+LN>n) ERROR_MATRIX(7); Matrix for(int i=0, j; i for(j=0; j A(i,j)=(*this)(i+M,j+N); return A; } template VARTYPE& Matrix { return *(matr+n*M+N); } template Matrix { Matrix for(int i=0,j; i for(j=0; j C(i,j)+=B(i,j); return C; } template Matrix { Matrix for(int i=0, j; i for(j=0;j C(i,j)-=B(i,j); return C; } template Matrix { Matrix if (A.n!=B.m) { if(A.m==3 && A.n==1 && B.m==3 && B.n==1) { C(0)=A(1)*B(2)-A(2)*B(1); C(1)=A(2)*B(0)-A(0)*B(2); C(2)=A(0)*B(1)-A(1)*B(0); } else A.ERROR_MATRIX(2); } else { for(int i=0,j,k;i for(j=0;j for(k=0;k C(i,j)+=A(i,k)*B(k,j); } return C; } template Matrix { Matrix for(int i=0,j;i for(j=0;j B(i,j)*=f; return B; } template Matrix { Matrix for(int i=0,j;i for(j=0;j B(i,j)*=f; return B; } template Matrix { delete [] matr; m=M; n=N; if (N && M) { matr=new VARTYPE[m*n]; if (!matr) ERROR_MATRIX(1); setmem(matr,sizeof(VARTYPE)*m*n,0); } else { m=n=0; matr=(VARTYPE*)0; } return *this; } template ostream& operator<<(ostream &out,Matrix { for(int i=0,j;i { for(j=0;j out << A(i,j)<< " "; out< } return out; } template int operator>>(istream &inp,Matrix { for(int i=0,j;i for(j=0;j return 0; } template void Matrix { if (L1==L2) return; double b; for(int j=0;j { b=(*this)(L1,j); (*this)(L1,j)=(*this)(L2,j); (*this)(L2,j)=b; } } template void Matrix { if (C1==C2) return; double b; for(int i=0;i { b=(*this)(i,C1); (*this)(i,C1)=(*this)(i,C2); (*this)(i,C2)=b; } } template dim Matrix { (finp.get(m)).get(n); delete []matr; matr=new VARTYPE[m*n]; if(!matr) ERROR_MATRIX(1); setmem(matr,sizeof(VARTYPE)*m*n,0); finp.read((char *)matr,sizeof(VARTYPE)*m*n); return finp.fail(); } template dim Matrix { (fout.put(m)).put(n); (fout.write((char *)matr,sizeof(VARTYPE)*m*n))< } template VARTYPE operator%(const Matrix { if(A.n!=1 || B.n!=1) A.ERROR_MATRIX(9); if(A.m!=B.m) A.ERROR_MATRIX(0); VARTYPE scalarmul = 0; for(int i=0; i scalarmul = scalarmul+A(i)*B(i); return scalarmul; } template void Matrix { static char *message[] = { "Ìàòðèöû äîëæíû èìåòü îäèíàêîâóþ ðàçìåðíîñòü",//0 "Íå âûäåëåíà ïàìÿòü!",//1 "Ìàòðèöû íå ñîãëàñîâàíû äëÿ óìíîæåíèÿ",//2 "Ñòåïåíü äîëæíà áûòü áîëüøå íóëÿ èëè -1",//3 "Ìàòðèöà äîëæíà áûòü êâàäðàòíîé",//4 "Íóëåâîé âåäóùèé ýëåìåíò â ïðåîáðàçîâàíèè Ãàóññà",//5 "Âñòàâêà íåâîçìîæíà èç-çà ïåðåêðûòèÿ áàçîâîé ìàòðèöû",//6 "Èçâëåêàåìàÿ ìàòðèöà âûõîäèò çà ãðàíèöû áàçîâîé",//7 "Âûõîä çà ãðàíèöû. Ïîïûòêà äîñòóïà ê íåñóù. ýëåìåíòó",//8 "Ýòî íå âåêòîð!"};//9 cerr<<"ERROR: "<< message[E] << endl; exit(1); } Äåìîíñòðàòèâíî - òåñòèðóþùàÿ ïðîãðàììà: #include #include #include #include "tmatr.cpp" int main() { clrscr(); Matrix Matrix double d; A(0,0)=1.1; A(0,1)=2.2; A(0,2)=3.3; A(1,0)=2.4; A(1,1)=1.1; A(1,2)=4.4; A(2,0)=1.3; A(2,1)=2.1; A(2,2)=4.1; B(0,0)=2; B(0,1)=7; B(0,2)=2; B(1,0)=4; B(1,1)=8; B(1,2)=1; B(2,0)=6; B(2,1)=4; B(2,2)=1; V(0)=2.1; V(1)=3.31; V(2)=1.4; H(0)=1.1; H(1)=2.1; H(2)=3.1; //****************************** C=A+B; cout<<"A:n"< cout<<"B:n"< cout<<"C=A+B:n"< cout<<"Press any key...n"; getch(); clrscr(); //****************************** C=A-B; cout<<"A:n"< cout<<"B:n"< cout<<"C=A-B:n"< cout<<"Press any key...n"; getch(); clrscr(); //****************************** //****************************** X=V+H; cout<<"V:n"< cout<<"H:n"< cout<<"X=V+H:n"< cout<<"Press any key...n"; getch(); clrscr(); //****************************** X=V-H; cout<<"V:n"< cout<<"H:n"< cout<<"X=V-H:n"< cout<<"Press any key...n"; getch(); clrscr(); C=A*V; cout<<"A:n"< cout<<"V:n"< cout<<"C=A*V:n"< cout<<"Press any key...n"; getch(); clrscr(); //****************************** Matrix D(0,0)=1; D(0,1)=2; D(0,2)=3; D(1,0)=2; D(1,1)=5; D(1,2)=6; D(2,0)=7; D(2,1)=3; D(2,2)=9; ofstream fout("test.mtr"); if(!fout) { cout<<"file not openn"; return 1; } D.write(fout); fout.close(); ifstream fin("test.mtr"); if(!fin) { cout<<"file not openn"; return 1; } E.read(fin); // cout<<"D:n"; cout< cout<<"E:n"; cout< fin.close(); cout<<"Press any key...n"; getch(); clrscr(); //************************************ C=A^-1; cout<<"A:n"< cout<<"C=A^-1:n"< cout<<"Press any key...n"; getch(); clrscr(); //**************************** // A*X=V X=(A^-1)*V X=(A^-1)*V; cout<<"A^-1:n"<<(A^-1)< cout<<"V:n"< cout<<"X:n"< cout<<"Press any key...n"; getch(); clrscr(); //************************************ d=A.determ(); cout<<"determinant of A = "< d=V.vmodul(); cout<<"modul of V = "< cout<<"Press any key...n"; getch(); clrscr(); //************************************ V(0)=4; V(1)=3; V(2)=2; U(0)=1; U(1)=2; U(2)=3; d=V%U; cout<<"scalar product V*U= "<< d< cout<<"Press any key...n"; getch(); clrscr(); //************************************ C=!A;
Нравится материал? Поддержи автора!
Ещё документы из категории информатика:
Чтобы скачать документ, порекомендуйте, пожалуйста, его своим друзьям в любой соц. сети.
После чего кнопка «СКАЧАТЬ» станет доступной!
Кнопочки находятся чуть ниже. Спасибо!
Кнопки:
Скачать документ