Hoe functies te gebruiken in Fortran voor numerieke berekeningen: Een inleiding
In Fortran kunnen we functies gebruiken om specifieke berekeningen uit te voeren, wat essentieel is voor numerieke analyses. Functies kunnen één, twee of meerdere variabelen bevatten, afhankelijk van de complexiteit van de berekening die we willen uitvoeren. Dit hoofdstuk biedt een gedetailleerd overzicht van hoe functies werken in Fortran, hoe we ze kunnen toepassen, en wat er belangrijk is om te begrijpen bij het gebruik van verschillende soorten functies.
Een functie kan bijvoorbeeld gedefinieerd worden voor twee variabelen, zoals f1(x,y) = x^2 + y^2 + 2xy^2 en f2(x,y) = x^2 - y^2. In een Fortran-programma kunnen we deze functies eenvoudig aanroepen door de waarden van de variabelen in te voeren. Het volgende voorbeeld laat zien hoe we de waarden van deze functies kunnen berekenen:
fortran
write(*,*) 'Input x,y'
read (*,*) x, y
pf1 = f1(x, y + 2)
pf2 = f2(x + y, 5)
pf3 = f1(4.53, x - y)
write(*,*) 'x,y,pf1,pf2,pf3,(pf1+pf2)/pf3'
In dit voorbeeld lezen we de waarden van x en y in en berekenen we de functies f1 en f2 voor verschillende argumenten. We combineren ook de resultaten van de functies en tonen ze op het scherm. De uitvoer kan er als volgt uitzien:
Wanneer we werken met functies van meerdere variabelen, moeten we de volgorde van de argumenten correct aanroepen om verwarring te voorkomen. Dit is van toepassing wanneer we bijvoorbeeld met drie variabelen werken. Stel dat we een functie SUMS(x, y, z) hebben die de som van de variabelen berekent, dan kan deze als volgt worden aangeroepen:
fortran
AL = SUMS(A * A, B * B, C * C)
BT = SUMS(7.0 * X, 8.0 * Y, -8.0)
GM = 4.0 * X / SUMS(X * X, Y * Y, Z * Z)**3
De SUMS-functie wordt in dit geval gebruikt om de berekeningen voor verschillende sets van waarden uit te voeren. De waarde van de functie wordt vervolgens weergegeven in de uitvoer:
css
VALUES OF A,B,C,X,Y,Z
9. 8. 7. 6. 5. 4.
VALUES OF AL,BT,GM
13.92838868.602325440.0355201811
Functies kunnen complexer worden, afhankelijk van de vereiste berekeningen. Wanneer meer dan één statement nodig is om een functie te definiëren, gebruiken we een subprogramma. Een functionele subroutine is een onafhankelijk programma-eenheid die een enkel resultaat terugstuurt naar het hoofdprogramma. Hier is een eenvoudig voorbeeld van een subprogramma om de vierde macht van verschillende variabelen te berekenen:
fortran
function FC(x)
FC = x**4
return
end
In het hoofdprogramma kan de functie FC meerdere keren worden aangeroepen om de vierde macht van verschillende waarden te berekenen, zoals:
fortran
x = 2
y = 3
z = 4
write(*,*) fc(x), fc(y), fc(z), fc(x + y)
De uitvoer zou eruit zien als:
markdown
16. 81. 256. 625.
Het is belangrijk te begrijpen dat in een functionele subroutine geen uitvoercommando's zoals write mogen worden gebruikt. Dit kan leiden tot runtime-fouten, zoals I/O-recursie, die optreden wanneer I/O-commando's binnen een functie worden uitgevoerd, wat niet is toegestaan. Dit wordt duidelijk in een voorbeeld waarin een schrijfcommando onterecht in de functie wordt geplaatst.
Het gebruik van functies in Fortran is dus niet alleen een manier om berekeningen te structureren, maar vereist ook zorgvuldige aandacht voor de manier waarop de gegevens worden doorgegeven en teruggegeven naar het hoofdprogramma. Het is essentieel om te begrijpen hoe functies worden aangeroepen en welke restricties er zijn bij het gebruik van subprogramma’s. Door deze regels en structuren te volgen, kunnen we efficiënt gebruik maken van de kracht van Fortran voor numerieke berekeningen, wat van groot belang is voor wetenschappelijke en technische toepassingen.
Daarnaast moet de lezer zich realiseren dat, hoewel Fortran nog steeds populair is voor numerieke toepassingen, de taal verschillende beperkingen kent die relevant zijn bij het werken met moderne berekeningen en methoden. Het is essentieel om de efficiëntie van de functies en de mogelijkheid om met grote hoeveelheden gegevens om te gaan goed te begrijpen, evenals de noodzaak om te zorgen voor een foutloze interactie tussen functies en het hoofdprogramma.
Hoe de oplossingen van niet-lineaire vergelijkingen met twee variabelen te vinden: Newton-Raphson en Iteratieve Methode
Het oplossen van niet-lineaire vergelijkingen met twee variabelen is een belangrijk probleem in de numerieke wiskunde, vooral in toepassingen waarbij nauwkeurigheid van cruciaal belang is, zoals in de natuur- en ingenieurswetenschappen. Er zijn verschillende methoden die worden gebruikt om dit soort systemen van vergelijkingen op te lossen, en in dit hoofdstuk bespreken we twee belangrijke technieken: de Newton-Raphson methode en de iteratieve methode.
De Newton-Raphson methode voor twee variabelen wordt vaak gebruikt vanwege zijn snelheid en efficiëntie in het vinden van nauwkeurige oplossingen. Deze methode is gebaseerd op het uitbreiden van de gegeven functies in een eerste orde Taylor-reeks rondom een benaderde oplossing. In een typisch geval moeten de gedeeltelijke afgeleiden van de functies ten opzichte van beide variabelen worden berekend, zodat de correcte iteraties kunnen worden uitgevoerd.
Bijvoorbeeld, voor het systeem:
f(x,y)=4xcos(y)+ysin(x)=0
g(x,y)=x2sin(y)−3ycos(x)+2=0
moeten de volgende afgeleiden worden berekend:
∂x∂f,∂y∂f,∂x∂g,∂y∂g
De methodologie voor het toepassen van de Newton-Raphson methode is als volgt: we nemen een initiële benadering van de wortels, bijvoorbeeld x0 en y0, en berekenen de waarde van de functies en hun afgeleiden op deze punten. Vervolgens worden de correcties voor x en y (aangeduid als h en k) berekend door een systeem van lineaire vergelijkingen op te lossen, wat leidt tot nieuwe benaderingen voor de wortels x1 en y1.
Het proces wordt herhaald totdat de veranderingen in de waarden van x en y tussen twee opeenvolgende iteraties klein genoeg zijn, waardoor de oplossing als voldoende nauwkeurig wordt beschouwd. Het bovenstaande systeem van lineaire vergelijkingen kan efficiënt worden opgelost met behulp van de regels van Cramer, waarbij de definitie van de determinant D en de berekeningen van h en k worden uitgevoerd om de nieuwe waarden van x en y te berekenen.
Een belangrijk kenmerk van de Newton-Raphson methode is dat deze snel convergeert, mits de initiële benaderingen x0 en y0 relatief dicht bij de werkelijke oplossingen liggen. Bij onjuiste initiële waarden kan de methode echter falen om te convergeren of zelfs divergeren.
In de onderstaande code wordt het Newton-Raphson proces geïllustreerd:
cpp
f(x, y) = 4 * x * cos(y) + y * sin(x)
g(x, y) = x * x * sin(y) - 3 * y * cos(x) + 2
...
De code voert iteraties uit om de waarden van x en y te verbeteren totdat de opgegeven nauwkeurigheid is bereikt.
Daarnaast kan er een andere oplossing worden verkregen door een iteratieve methode te gebruiken. In dit geval, voor het systeem:
f(x,y)=x+3log10(x)−y2=0
g(x,y)=2x2−xy−5x+1=0
wordt de iteratieve formule afgeleid uit de oorspronkelijke vergelijkingen. De iteraties worden uitgevoerd totdat de verschillen tussen opeenvolgende iteraties kleiner worden dan een bepaalde drempelwaarde.
De iteratieve methode is vaak nuttig voor grotere systemen van niet-lineaire vergelijkingen, waarbij directe methoden zoals Newton-Raphson onpraktisch kunnen zijn. Hier zijn de iteratieve formules voor x en y gegeven:
y=x+3log10(x)
x=2x(y+5)−1
In dit geval wordt het proces voortgezet totdat beide variabelen geen significante verandering meer vertonen tussen opeenvolgende iteraties. Dit proces wordt gestopt zodra de vereiste nauwkeurigheid is bereikt.
Hoewel de Newton-Raphson methode vaak sneller convergeert, heeft de iteratieve methode het voordeel dat deze eenvoudiger te implementeren is en geen expliciete afgeleiden vereist, wat soms nuttig kan zijn voor complexe systemen. De keuze tussen de twee methoden hangt af van de specifieke eisen van het probleem, zoals de complexiteit van de vergelijkingen en de gewenste nauwkeurigheid.
Een bijkomend aspect dat belangrijk is voor de lezer om te begrijpen, is de aard van de oplossingen van niet-lineaire systemen. Niet-lineaire systemen kunnen meerdere oplossingen hebben, en de gekozen startwaarden kunnen de uitkomst van het iteratieproces aanzienlijk beïnvloeden. Daarom is het belangrijk om te overwegen welke startwaarden het beste zijn voor de convergentie naar de werkelijke oplossing en om te anticiperen op de mogelijkheid van meerdere wortels. In sommige gevallen is het zelfs nodig om verschillende sets van initiële gissingen te proberen om alle mogelijke oplossingen van het systeem te vinden.
Hoe kunnen we eigenwaarden en eigenvectoren van een matrix vinden door gebruik te maken van rotatiematrices?
Het vinden van eigenwaarden en eigenvectoren van een matrix is een fundamentele taak in lineaire algebra, vaak toegepast in verschillende wetenschappelijke en technische velden. Het proces kan een uitdaging zijn, vooral wanneer het gaat om grote matrices of matrices met complexe structuren. In deze context wordt een iteratief proces beschreven dat gebruik maakt van rotatiematrices om de matrix te diagonalizeren en daarmee de eigenwaarden en bijbehorende eigenvectoren te vinden.