In numerieke berekeningen speelt het werken met matrices een cruciale rol, vooral bij het oplossen van lineaire algebraïsche problemen. Matrices worden vaak gebruikt voor het representeren van gegevens, het uitvoeren van lineaire transformaties en het oplossen van systemen van lineaire vergelijkingen. In dit hoofdstuk zullen we enkele basisbewerkingen met matrices behandelen, zoals transponeren, vermenigvuldigen en het genereren van identiteitsmatrices, evenals de implementatie van deze bewerkingen in Fortran.

Het transponeren van een matrix is een eenvoudige maar fundamentele bewerking waarbij de rijen van de matrix worden omgezet in kolommen. Dit proces wordt gebruikt in veel toepassingen, zoals het oplossen van lineaire systemen en het aanpassen van gegevens. In het onderstaande programma wordt de transpositie van een matrix geïmplementeerd:

fortran
PROGRAM TransposeMatrix INTEGER A(10,10), B(10,10) WRITE(*,*)'ENTER THE NO.OF ROWS(M) & COLUMNS(N)' READ(*,*)M,N WRITE(*,*)'ENTER THE MATRIX(ROW WISE)' DO I=1,M READ(*,*)(A(I,J),J=1,N) END DO WRITE(*,*)'THE MATRIX IS' DO I=1,M WRITE(*,*)(A(I,J),J=1,N) END DO DO I=1,N DO J=1,M B(I,J)=A(J,I) ! Interchanging rows and columns END DO END DO WRITE(*,*)'THE TRANSPOSE MATRIX IS' DO I=1,N WRITE(*,*)(B(I,J),J=1,M) ! Displaying the transposed matrix END DO STOP END

Bij de uitvoering van dit programma wordt een matrix ingevoerd door de gebruiker, en vervolgens wordt de getransponeerde versie van de matrix afgedrukt. Deze bewerking is fundamenteel in vele wetenschappelijke en technische toepassingen, van computergraphics tot de implementatie van algoritmen in kunstmatige intelligentie.

Een andere veelgebruikte bewerking met matrices is matrixvermenigvuldiging. Bij matrixvermenigvuldiging moeten we ervoor zorgen dat het aantal kolommen in de eerste matrix gelijk is aan het aantal rijen in de tweede matrix. Het resultaat van de vermenigvuldiging is een nieuwe matrix waarvan de dimensies afhangen van de invoermatrices.

Stel dat matrix A een dimensie heeft van m × n en matrix B een dimensie van n × l. Het resultaat van A × B is een matrix C met dimensies m × l. Om de elementen van de matrix C te berekenen, gebruiken we de volgende formule:

cij=k=1naikbkjc_{ij} = \sum_{k=1}^{n} a_{ik} \cdot b_{kj}

Dit betekent dat elk element van de matrix C wordt berekend door de overeenkomstige rij van A te vermenigvuldigen met de overeenkomstige kolom van B en de producten op te tellen. Het volgende Fortran-programma implementeert deze vermenigvuldiging:

fortran
PROGRAM MatrixMultiplication INTEGER A(10,10), B(10,10), C(10,10) WRITE(*,*)'ENTER ROW & COLUMN NOS OF THE 1ST MATRIX' READ(*,*)N1,M1 WRITE(*,*)'ENTER ROW & COLUMN NOS OF THE 2ND MATRIX' READ(*,*)N2,M2 WRITE(*,*)'ENTER THE 1ST MATRIX' DO I=1,N1 READ(*,*)(A(I,J),J=1,M1) END DO WRITE(*,*)'ENTER THE 2ND MATRIX' DO I=1,N2 READ(*,*)(B(I,J),J=1,M2) END DO WRITE(*,*)'THE PRODUCT IS' DO I=1,N1 DO J=1,M2 C(I,J)=0 DO K=1,M1 C(I,J) = C(I,J) + A(I,K) * B(K,J) END DO END DO END DO DO I=1,N1 WRITE(*,*)(C(I,J),J=1,M2) END DO STOP END

In dit programma voert de gebruiker de dimensies en elementen van twee matrices in. Vervolgens wordt het resultaat van de matrixvermenigvuldiging afgedrukt. Het is belangrijk te begrijpen dat de vermenigvuldiging van matrices computationally intensief kan zijn, vooral voor grote matrices. Efficiëntie wordt dan ook vaak een belangrijke factor bij het ontwerpen van algoritmen voor matrixverwerking.

Naast transponeren en vermenigvuldigen van matrices is het ook vaak nodig om een identiteitsmatrix te genereren. Dit is een vierkante matrix waarvan de diagonale elementen gelijk zijn aan 1, en alle andere elementen gelijk zijn aan 0. De identiteitsmatrix speelt een belangrijke rol bij het oplossen van lineaire systemen en het berekenen van de inverse van een matrix. Hieronder volgt een eenvoudig Fortran-programma om een identiteitsmatrix te genereren:

fortran
PROGRAM IdentityMatrix INTEGER A(3,3) DO I=1,3 DO J=1,3 A(I,J) = 0 END DO A(I,I) = 1 END DO WRITE(*,*)'An identity matrix' DO I=1,3 WRITE(*,*) (A(I,J),J=1,3) END DO STOP END

Dit programma stelt de gebruiker in staat om een 3x3 identiteitsmatrix te genereren door eerst alle elementen op 0 te zetten en vervolgens de diagonale elementen naar 1 te veranderen. De identiteitsmatrix is van groot belang in het kader van het oplossen van lineaire systemen, omdat de vermenigvuldiging van een matrix met de identiteitsmatrix de matrix zelf oplevert.

Wanneer we werken met numerieke berekeningen, kunnen er kleine rekenfouten optreden, vooral bij het werken met matrices die zijn verkregen uit numerieke methoden. Bij het controleren of een matrix de identiteitsmatrix is, moet men rekening houden met rekenfouten. Dit kan bijvoorbeeld door een kleine tolerantiewaarde in te stellen, zodat getallen die heel dicht bij 1 of 0 liggen, maar niet exact, nog steeds als respectievelijk 1 of 0 worden beschouwd.

De limieten van matrixdimensies in Fortran hangen af van de compiler en de beschikbare geheugenruimte. Hoewel Fortran in staat is om zeer grote matrices te verwerken, wordt het belangrijk om de limieten van de hardware te begrijpen. Het programma kan maximaal 7 dimensies verwerken, maar bij het werken met grote matrices kunnen de prestaties en de verwerkingstijd een beperking vormen.

Wat verder van belang is bij het werken met matrices in Fortran, is dat de manier waarop gegevens worden ingevoerd belangrijk kan zijn voor de efficiëntie van de bewerkingen. Het is bijvoorbeeld essentieel te begrijpen hoe matrices op het geheugen van de computer worden opgeslagen, bijvoorbeeld row-major of column-major order. Dit heeft invloed op de snelheid van toegang en manipulatie van de matrixelementen.

Een ander punt is dat het gebruik van geoptimaliseerde bibliotheken, zoals LAPACK voor lineaire algebra-bewerkingen, kan leiden tot aanzienlijke prestatiesverbeteringen bij het werken met grote matrices. Dit maakt het mogelijk om geavanceerdere bewerkingen, zoals de berekening van eigenwaarden of de oplossing van grote lineaire systemen, efficiënter uit te voeren.

Hoe kunnen complexe wortels van een polynoom worden gevonden met behulp van de Bairstow-methode?

De Bairstow-methode is een krachtige techniek voor het vinden van complexe wortels van een polynoom. In het bijzonder is deze methode handig voor polynomen van hogere graad, waarbij de wortels niet gemakkelijk direct kunnen worden berekend. De methode maakt gebruik van een iteratief proces, waarbij de polynoom wordt gefactoriseerd in een product van quadratische factoren, zodat de wortels systematisch kunnen worden bepaald.

Bij het toepassen van de Bairstow-methode wordt de oorspronkelijke polynoom p(x)p(x) gerepresenteerd als het product van een quadratische factor (x2uxv)(x^2 - ux - v) en een andere polynoom q(x)q(x) van lagere graad. Het doel is om de parameters uu en vv van deze quadratische factor te berekenen, zodat de factorisatie correct is.

Het proces begint met het invoeren van de coëfficiënten van de polynoom en twee initiële schattingen voor de waarden van uu en vv. Deze schattingen worden iteratief bijgesteld op basis van de relaties tussen de coëfficiënten van de polynoom en de bijbehorende quotientenpolynomen. Gedurende elke iteratie worden de waarden van uu en vv gecorrigeerd door middel van de Newton-Raphson-methode, totdat ze convergeren naar de juiste waarden.

De iteratie gaat als volgt: eerst worden de coëfficiënten van het quotientenpolynoom q(x)q(x) berekend, op basis van de oorspronkelijke coëfficiënten van de polynoom en de waarden van uu en vv. Vervolgens worden de coëfficiënten van de afgeleiden van dit quotientenpolynoom bib_i en cic_i gebruikt om de correcties Δu\Delta u en Δv\Delta v te berekenen. Na elke iteratie worden de waarden van uu en vv aangepast en gecontroleerd of ze voldoende zijn geconvergeerd. Dit iteratieve proces wordt herhaald totdat de waarden van uu en vv niet langer significant veranderen, wat betekent dat de juiste waarden voor de wortels zijn gevonden.

Na het vinden van de waarden van uu en vv, kunnen de wortels van de quadratische factor x2uxvx^2 - ux - v eenvoudig worden berekend. Als de discriminant van deze factor negatief is, geeft dit aan dat de wortels complex zijn en het resultaat kan worden weergegeven in de vorm x=u2±idisc2x = \frac{u}{2} \pm \frac{i \sqrt{ -\text{disc}}}{2}, waar disc=u2+4v\text{disc} = u^2 + 4v.

De iteratie stopt wanneer de resterende polynoom van lagere graad q(x)q(x) zelf een kwadratische of lineaire vorm bereikt, waarna de overige wortels kunnen worden berekend. Dit proces is effectief voor het vinden van zowel reële als complexe wortels van hogere-graad polynomen.

Naast de basisstappen die in het bovenstaande proces zijn beschreven, is het belangrijk te begrijpen dat de Bairstow-methode afhankelijk is van de keuze van de initiële schattingen voor uu en vv. Onjuiste schattingen kunnen leiden tot trage convergentie of zelfs falen in de oplossing. Daarom is het belangrijk om een goede startgissing te hebben, bij voorkeur dicht bij de werkelijke wortels van de polynoom. Bovendien kan het iteratieve proces, hoewel zeer effectief, gevoelig zijn voor numerieke stabiliteit, vooral voor polynomen met hoge graden of specifieke coëfficiëntwaarden.

Het is ook van belang te weten dat de Bairstow-methode niet altijd geschikt is voor alle typen polynomen. Bij polynomen die meerdere gelijke wortels hebben, kan de methode onstabiel worden, en er kunnen alternatieve technieken zoals de Laguerre-methode nodig zijn om een betrouwbaardere oplossing te verkrijgen. In dergelijke gevallen kan het gebruik van grafische hulpmiddelen of andere numerieke technieken de kans op succes vergroten.

Het iteratieve karakter van de Bairstow-methode maakt het niet alleen krachtig, maar ook flexibel, aangezien de methode geschikt is voor gebruik in computerprogramma’s en kan worden geautomatiseerd om polynoomwortels snel en efficiënt te berekenen. Door de integratie van de Newton-Raphson-methode voor het oplossen van niet-lineaire vergelijkingen, kan de methode met een relatief klein aantal iteraties nauwkeurige resultaten leveren, wat essentieel is voor toepassingen in numerieke wiskunde en engineering.