Handboek · hoofdstuk 5Vectoren en matrices
Richtingen in de ruimte en veel vergelijkingen tegelijk: het rekenwerk achter krachten, netwerken en constructies
Krachten, snelheden en zonnestralen hebben een richting in drie dimensies: je rekent ermee als vectoren. Met het scalair product vind je een hoek, een projectie of een arbeid; met het vectorproduct een normaal, een oppervlakte of een moment. Een matrix bundelt veel getallen tot één object: een transformatie die een figuur draait of rekt, of een stelsel met tientallen onbekenden. Je lost zulke stelsels op met de methode van Gauss, met de hand en in Python, en je gebruikt ze voor Kirchhoff-netwerken en vakwerken. Voor Habitat reken je het 12,8 V-net van de klimaatmodule door als één matrixvergelijking.

- Je kan vectoren in 2D en 3D noteren, optellen, met een getal vermenigvuldigen, hun lengte en eenheidsvector berekenen, en krachten in de ruimte ontbinden en samenstellen.
- Je kan het scalair product berekenen en gebruiken voor hoeken, projecties, loodrechte stand, arbeid en de invalshoek van zonlicht, en de formule |a||b| cos θ afleiden.
- Je kan het vectorproduct berekenen en gebruiken voor een normaal, een oppervlakte en een moment r × F, met de juiste draaizin.
- Je kan een matrix interpreteren als lineaire transformatie (rotatie, schaal, afschuiving), haar determinant als oppervlaktefactor lezen, en matrices vermenigvuldigen en inverteren.
- Je kan een stelsel lineaire vergelijkingen als matrixvergelijking schrijven en oplossen met de methode van Gauss, met de hand, in eigen code en met numpy.
- Je kan het conditiegetal van een stelsel interpreteren en slecht geconditioneerde situaties herkennen, zoals een ijking met twee dicht bij elkaar liggende punten.
- Je kan een elektrisch netwerk opstellen en oplossen met de knooppuntenmethode (G v = i), en de uitkomst toetsen met Kirchhoff en een vermogensbalans.
- Je kan het evenwicht van een vakwerk als stelsel opstellen, oplossen en interpreteren (trek, druk, reacties), en een voedingsnet van Habitat doorrekenen en beoordelen.
Rekenstokjes, planetoïden en de snelste computers
Ruim tweeduizend jaar geleden werd in China een handboek samengesteld met 246 rekenproblemen uit de praktijk: landmeten, belastingen, graan, bouwwerken. Jiuzhang suanshu, De negen hoofdstukken over de rekenkunst, kreeg zijn vorm rond het begin van onze jaartelling; Liu Hui schreef er in 263 een commentaar bij. Het achtste hoofdstuk heet fangcheng, 'rechthoekige schikking'. Het eerste probleem: drie bundels graan van de beste soort, twee van de middelste en één van de slechtste leveren samen 39 dou (een inhoudsmaat); twee, drie en één leveren 34 dou; één, twee en drie leveren 26 dou. Hoeveel levert één bundel van elke soort? De rekenaars legden de getallen met bamboestokjes in kolommen op een rekenbord en trokken veelvouden van kolommen van elkaar af tot er één onbekende overbleef: de eliminatie die je in dit hoofdstuk leert. Onderweg verschenen negatieve getallen, en het boek gaf er gewoon rekenregels voor.
In Europa kreeg de methode de naam van Carl Friedrich Gauss. Op 1 januari 1801 ontdekte Giuseppe Piazzi in Palermo Ceres, vandaag een dwergplaneet, maar na enkele weken verdween ze in het licht van de zon. De 24-jarige Gauss berekende uit de weinige waarnemingen haar baan, en op 31 december 1801 vond Franz Xaver von Zach Ceres terug, dicht bij de plaats die Gauss voorspeld had. Om een baan zo goed mogelijk aan veel metingen aan te passen, gebruikte Gauss de methode van de kleinste kwadraten (hoofdstuk 41; Adrien-Marie Legendre publiceerde ze in 1805, Gauss in 1809), en de stelsels die daaruit volgen, loste hij systematisch op door eliminatie.
Het woord matrix (Latijn: 'dat waaruit iets voortkomt') gebruikte James Joseph Sylvester in 1850 voor een rechthoekige tabel getallen; in 1858 legde Arthur Cayley vast hoe je matrices vermenigvuldigt en inverteert. Het woord vector komt van William Rowan Hamilton, die op 16 oktober 1843 tijdens een wandeling langs een kanaal in Dublin zijn quaternionen bedacht en de formule in een brug kraste. De notatie met scalair product en vectorproduct die ingenieurs vandaag gebruiken, is van Josiah Willard Gibbs en Oliver Heaviside, rond 1880.
En de snelste computers ter wereld? Sinds 1993 verschijnt twee keer per jaar de TOP500-lijst van supercomputers. De rangschikking steunt op één test: hoe snel een machine een enorm stelsel lineaire vergelijkingen oplost met de methode van Gauss.
Een net van kabels, een vakwerk van staven, een model met honderd parameters: telkens staan er veel onbekenden in veel vergelijkingen tegelijk. Vectoren beschrijven krachten en richtingen in de ruimte; matrices bundelen stelsels en transformaties tot één object waarmee een computer rekent. Het brein van het station lost zo zijn voedingsnet op, berekent de stand van de zon op elk paneel en fit zijn modellen (hoofdstuk 36 en 41).

Wat je al weet: vectoren, nu in drie dimensies
| wat je al kan | wat nu komt |
|---|---|
| een vector heeft grootte en richting; kop-staart optellen, ontbinden in componenten (hoofdstuk 6 van I) | vectoren als rijtjes getallen, in 2D en 3D; rekenen per component |
| arbeid met de kracht langs de weg (hoofdstuk 9 van I) | bij elke hoek: het scalair product |
| moment met de loodrechte arm (hoofdstuk 10 van I) | , ook in 3D: het vectorproduct |
| de hoek van de zon op een paneel (hoofdstuk 6 van I) | de invalshoek voor elke stand van de zon, met één scalair product |
een stelsel van drie vergelijkingen met np.linalg.solve (hoofdstuk 21 van I) | wat een matrix is, en hoe Gauss het stelsel oplost |
Kies drie loodrechte assen: naar het oosten, naar het noorden, omhoog. Dat is een rechtshandig assenstelsel: duim, wijsvinger en middelvinger van je rechterhand wijzen langs , en . Een vector noteer je met zijn componenten, , of als met de eenheidsvectoren langs de assen. Optellen en met een getal vermenigvuldigen gaat per component, precies zoals je in hoofdstuk 6 van I krachten optelde door hun componenten op te tellen.
Voorbeeld: heeft lengte en eenheidsvector . De drie componenten van een eenheidsvector zijn de cosinussen van de hoeken met de assen: maakt een hoek van met de verticaal.
Drie tuidraden aan een weermast
De weermast van het station (6,0 m, met windmeter en zonnestralingsmeter) wordt rechtgehouden door drie tuidraden naar ankers op 3,0 m van de voet, onder 120° van elkaar: naar het noorden, het oostzuidoosten en het westzuidwesten. Elke draad staat op 400 N. Bereken de kracht van elke draad op de top als vector, de hoek van de draden met de grond en de totale kracht op de mast.
- top m, ankers op 3,0 m onder 0°, 120° en 240° (vanaf het noorden, met de klok mee)
- spanning 400 N per draad
- , , en hun som
- de hoek met de grond
- 1Ankers: , , .
- 2Richting van draad 1: , lengte , eenheidsvector .
- 3Kracht: N. Zo ook N en N.
- 4Som: N. De horizontale componenten heffen elkaar op (de mast staat recht); de verticale tellen op tot 1073 N naar beneden.
- 5Hoek met de grond: . Controle: de verticale component van één draad is .
Het scalair product
Twee vectoren geven samen een getal (een scalair): vermenigvuldig de componenten twee aan twee en tel op.
Waarom de cosinus? Neem de driehoek met zijden , en . De cosinusregel zegt . Werk je het linkerlid per component uit, dan krijg je . Vergelijk: de som van de producten ís .
Wat je ermee doet.
- Een hoek: , in 3D net zo eenvoudig als in 2D.
- Loodrecht: . Een snelle test, zonder hoeken.
- Projectie: is het stuk van langs ; de projectievector is .
- Arbeid en vermogen: alleen de component van de kracht langs de verplaatsing doet arbeid: , (hoofdstuk 9 van I).
- Zonlicht op een vlak: per m² vangt een vlak met normaal de instraling , met de richting naar de zon.
Arbeid als scalair product: de batterijkar op de oprit
De batterijkar van 80 kg (hoofdstuk 8 van I) moet de oprit naar de module op: 6,40 m horizontaal en 0,40 m hoog (6,25 %). Je trekt aan een touw onder 30° met de horizontaal. De rolweerstand is 2,5 % van de normaalkracht. Bereken de touwkracht voor een constante snelheid en de arbeid van elke kracht als scalair product. Controleer met de energie.
- m, ,
- touw onder 30° met de horizontaal
- , , en hun som
- 1Hellingshoek ; het touw maakt met de oprit.
- 2Evenwicht langs de oprit: , want het touw tilt de kar een beetje op. Dus .
- 3Touw: N, dus .
- 4Zwaartekracht: N, . De normaalkracht staat loodrecht op : , geen arbeid.
- 5Rolweerstand: , de weerstand is tegen de beweging in, over : .
Het vectorproduct
In drie dimensies kan je twee vectoren ook tot een nieuwe vector vermenigvuldigen:
Eigenschappen.
- staat loodrecht op en op : reken maar na dat .
- Zijn lengte is de oppervlakte van het parallellogram op en (basis , hoogte ). De helft is de oppervlakte van de driehoek.
- Zijn richting volgt de rechterhandregel: krul de vingers van naar , de duim wijst langs . Zo is .
- De volgorde telt: . En : evenwijdige vectoren spannen geen oppervlakte op.
In het vlak () blijft alleen de -component over, : positief als tegen de klok in van ligt. In de figuur: en geven : recht omhoog, met als lengte de oppervlakte 4,5.
Het moment als vectorproduct: wind op het zonnepaneel
In hoofdstuk 10 van I zocht je de armen van de wind en het gewicht op de steun van het zonnepaneel (60°, 1,00 m in de hellingsrichting, onderrand 0,20 m boven het dak). Bereken nu de momenten om de voorste voet met : (a) van de wind, 495 N loodrecht op het paneel in het midden C, bij storm uit het noorden; (b) van het gewicht van paneel en steun, 25 kg in C.
- horizontaal naar het zuiden, omhoog, uit het blad
- C ligt 0,25 m achter de voet en hoog
- en en hun draaizin
- 1Arm: m.
- 2Wind: loodrecht op het paneel, naar het zuiden en omhoog: N.
- 3: alleen de -component is niet nul: .
- 4Negatief: met de klok mee in de figuur. De wind wil de steun voorover over de voorste voet kantelen.
- 5Gewicht: N, : tegen de klok in, het houdt de steun op zijn plaats.
De zon op het paneel: normaal, oppervlakte en invalshoek
Het zonnepaneel is 1,65 m breed (oost-west) en 1,00 m lang in de hellingsrichting, onder 60° op het zuiden. Bereken met een vectorproduct de normaal en de oppervlakte, en met een scalair product de invalshoek van het zonlicht op 21 juni om 12:00 en om 15:00 zonnetijd. Hoeveel W/m² vangt het paneel als de directe straling loodrecht op de stralen 900 W/m² is (rekenwaarde)?
- oost, noord, omhoog; breedtegraad 50,8°, declinatie op 21 juni 23,44°
- zonnestand om 15:00: hoogte , azimut (vanaf het noorden, met de klok mee)
- , oppervlakte, om 12:00 en 15:00, instraling
- 1Randen: langs de onderrand , de helling op .
- 2. Lengte 1,65: de oppervlakte in m². Normaal : naar het zuiden en omhoog, 60° uit de verticaal.
- 3Middag: de zon staat in het zuiden op : . , .
- 415:00: . , .
- 5Instraling op het paneel: : om 12:00 758 W/m², om 15:00 519 W/m².
Matrices: tabellen die vectoren transformeren
Een matrix is een rechthoekige tabel getallen. Een -matrix maal een vector geeft een nieuwe vector: elke component is het scalair product van een rij met de vector.
Zo'n transformatie is lineair: en . Rechten blijven recht, de oorsprong blijft liggen, een rooster van parallellogrammen wordt een rooster van parallellogrammen. Drie bouwstenen:
Matrixvermenigvuldiging: transformaties na elkaar
Eerst toepassen en dan is ook een lineaire transformatie: . Het product bereken je rij maal kolom:
Drie gevolgen:
- De volgorde telt. In het algemeen is . In de figuur liggen beide huisjes na de draaiing op hun zij, maar links (eerst draaien, dan in de -richting uitrekken) is het huisje twee keer zo hoog geworden, van vloer tot nok, en rechts (eerst uitrekken, dan draaien) twee keer zo breed, langs de vloer. De matrix die je het laatst toepast, staat links.
- De eenheidsmatrix (enen op de diagonaal) verandert niets: . De inverse maakt ongedaan: . Voor een -matrix is
- Determinanten vermenigvuldigen: , logisch: oppervlaktefactoren na elkaar vermenigvuldigen.
Een mooie toepassing: twee keer draaien is één keer draaien over de som, . Werk je het product links uit, dan staan daar de somformules voor en (opdracht 5.16).
Van robot naar wereld: coördinaten omrekenen
Het inspectierobotje (hoofdstuk 33 van I) staat in de kweekruimte op m, met zijn neus onder 30° met de -as van de ruimte. Zijn ultrasone sensor ziet een obstakel 0,50 m recht vooruit en 0,10 m naar links (robotassen: vooruit, naar links). Waar ligt het obstakel in de ruimte? Het robotje rijdt daarna 0,30 m vooruit en draait 45° naar links. Geef zijn nieuwe stand als één matrix, en waar het obstakel dan voor het robotje ligt.
- m,
- obstakel in robotcoördinaten m
- het obstakel in wereldcoördinaten
- de nieuwe stand
- het obstakel voor het robotje na de beweging
- 1Een vector in de robotassen draai je over 30° naar de wereldassen en je telt de plaats van de robot erbij: .
- 2, dus m.
- 3Met homogene coördinaten (een derde component 1) wordt rotatie plus verschuiving één matrix: , en .
- 4Bewegen is vermenigvuldigen: . Nieuwe plaats m, neus onder 75°.
- 5Terug naar het robotje: m: 0,21 m vooruit en 0,07 m naar rechts.
Stelsels als matrixvergelijking; de methode van Gauss
Een stelsel van lineaire vergelijkingen met onbekenden is één matrixvergelijking : rij van bevat de coëfficiënten van vergelijking . De methode van Gauss lost ze op in twee fasen.
1. Heen: elimineren. Drie bewerkingen veranderen de oplossingen niet: twee rijen verwisselen, een rij met een getal (niet nul) vermenigvuldigen, en een veelvoud van een rij bij een andere optellen. Gebruik ze om onder de diagonaal nullen te maken, kolom na kolom. Het diagonaalelement waarmee je werkt, heet de spil. Is de spil nul, verwissel dan rijen; in een computer kies je altijd het grootste element in de kolom als spil (rijverwisseling), anders kunnen afrondingsfouten ontploffen (opdracht 5.12).
2. Terug: invullen. De laatste rij heeft nog één onbekende; vul die in de rij erboven in, enzovoort.
Drie mogelijke uitkomsten. Blijft er op de diagonaal nergens een nul, dan is er precies één oplossing (). Krijg je een rij met , dan is er geen oplossing; een rij geeft er oneindig veel. Meetkundig, bij drie onbekenden: drie vlakken die elkaar in één punt snijden, die geen gemeenschappelijk punt hebben, of die een hele rechte gemeen hebben.
Gauss met de hand: de mazen van een brug
Een brugschakeling zoals in hoofdstuk 21 van I, met ronde waarden: , , , en op 10 V. Stel de vergelijkingen op voor de drie maasstromen (een stroom die rond een venster loopt, met de klok mee), los ze op met Gauss, bereken de stroom door en controleer met de potentialen van M en N.
- in kΩ, stromen in mA, spanning in V
- maas 1: bron, , ; maas 2: , , ; maas 3: , ,
- , ,
- de stroom door
- 1Maaswet per venster. Een weerstand die twee mazen delen, draagt het verschil van hun maasstromen. Maas 1: . Maas 2: . Maas 3: . Als aangevulde matrix: .
- 2Elimineer : geeft ; geeft .
- 3Elimineer : geeft .
- 4Terug: ; ; .
- 5Door loopt van M naar N. Controle met potentialen: , , en .
Gauss in Python, en numpy
Met de hand stop je bij drie of vier onbekenden. Een eigen functie gauss(A, b) doet precies wat je op het vorige blad deed, met rijverwisseling, en telt de vermenigvuldigingen en delingen. Ze lost de twee bruggen op en vergelijkt daarna met np.linalg.solve op willekeurige stelsels van 10 tot 160 onbekenden.
# gauss.py - een stelsel oplossen met de methode van Gauss (met rijverwisseling), en vergelijken met numpyimport numpy as np def gauss(A, b): """Lost A x = b op. Geeft x en het aantal vermenigvuldigingen en delingen terug.""" A, b = np.array(A, float), np.array(b, float) n = len(b) bewerkingen = 0 for k in range(n - 1): # heen: nullen onder de diagonaal p = k + np.argmax(abs(A[k:, k])) # grootste spil in kolom k if A[p, k] == 0: raise ValueError("de matrix is singulier") A[[k, p]], b[[k, p]] = A[[p, k]], b[[p, k]] # rijen verwisselen for i in range(k + 1, n): m = A[i, k] / A[k, k] A[i, k:] -= m * A[k, k:] b[i] -= m * b[k] bewerkingen += (n - k) + 2 x = np.zeros(n) for i in range(n - 1, -1, -1): # terug: van onder naar boven invullen x[i] = (b[i] - A[i, i + 1:] @ x[i + 1:]) / A[i, i] bewerkingen += n - i return x, bewerkingen x, ops = gauss([[3, -1, -2], [-1, 4, -1], [-2, -1, 4]], [10, 0, 0])print("brug met ronde waarden (mA):", np.round(x, 4), " maal 7:", np.round(7 * x, 6)) R1, R2, R3, R4, R5 = 1.0, 2.2, 1.5, 2.2, 1.0 # de brug van hoofdstuk 21 van Intermediate (kΩ)M = [[R1 + R2, -R1, -R2], [-R1, R1 + R3 + R5, -R5], [-R2, -R5, R2 + R4 + R5]]I, _ = gauss(M, [10, 0, 0])print(f"brug van hoofdstuk 21: stroom door R5 = {I[2] - I[1]:.4f} mA") rng = np.random.default_rng(5) # hoe groeit het werk met het aantal onbekenden?for n in (10, 20, 40, 80, 160): A, b = rng.normal(size=(n, n)), rng.normal(size=n) x, ops = gauss(A, b) verschil = np.max(np.abs(x - np.linalg.solve(A, b))) print(f"n = {n:3d}: {ops:8d} bewerkingen = {ops / n**3:.3f} n³, verschil met numpy {verschil:.0e}")Uitvoer:
brug met ronde waarden (mA): [7.1429 2.8571 4.2857] maal 7: [50. 20. 30.] brug van hoofdstuk 21: stroom door R5 = 0.3602 mA n = 10: 475 bewerkingen = 0.475 n³, verschil met numpy 2e-13 n = 20: 3250 bewerkingen = 0.406 n³, verschil met numpy 4e-15 n = 40: 23700 bewerkingen = 0.370 n³, verschil met numpy 2e-14 n = 80: 180200 bewerkingen = 0.352 n³, verschil met numpy 6e-14 n = 160: 1403600 bewerkingen = 0.343 n³, verschil met numpy 2e-13
De brug met ronde waarden geeft de zevenden van de handberekening. De brug van hoofdstuk 21 van I: 0,3602 mA door , zoals in opdracht 21.14 daar (met de knooppuntenmethode, een -stelsel: zie opdracht 5.10). Het aantal bewerkingen groeit met en de verhouding nadert : twee keer zoveel onbekenden is acht keer zoveel werk. De verschillen met numpy zijn afrondingsfouten van de orde .
Gebruik np.linalg.solve(A, b): dat is Gauss met rijverwisseling (een LU-ontbinding), in geoptimaliseerde code. Bereken nooit np.linalg.inv(A) @ b: dat is trager en minder nauwkeurig. Voor grote matrices met vooral nullen bestaat scipy.sparse.linalg.spsolve.
Conditie: als kleine fouten grote gevolgen hebben
Niet elk stelsel is even betrouwbaar. Neem en : twee bijna evenwijdige rechten, met snijpunt . Verander het rechterlid met 0,05 %:
import numpy as np
A = np.array([[1.0, 1.0], [1.0, 1.001]])
for b in ([2.0, 2.001], [2.0, 2.002]):
print("b =", b, " x =", np.linalg.solve(A, b).round(3))
print(f"conditiegetal: {np.linalg.cond(A):.0f}")b = [2.0, 2.001] x = [1. 1.] b = [2.0, 2.002] x = [0. 2.] conditiegetal: 4002
Een verandering van 0,001 in de gegevens verplaatst de oplossing van naar . Het conditiegetal meet die gevoeligheid: de relatieve fout in kan tot keer de relatieve fout in zijn. Vuistregel: je verliest ongeveer juiste cijfers. Hier is : van de drie cijfers in de gegevens blijft niets over. Het net van de module verderop heeft : geen probleem.
Een ijking. Een TMP36 op de 10-bits ADC van de meetkas geeft . Je ijkt met twee referentiepunten: door en , een stelsel van twee vergelijkingen. Met ijswater (0 °C) en 40 °C is . Met 20,0 en 20,5 °C liggen de punten maar één ADC-stap uit elkaar en is : een halve stap afrondingsfout laat de helling alle kanten op gaan (figuur), en bij 40 °C zit je er tot twintig graden naast.
np.linalg.solve geeft ook voor een slecht geconditioneerd stelsel een antwoord, met zestien cijfers. Controleer np.linalg.cond(A), en bekijk de oorzaak: meestal zijn twee vergelijkingen (twee ijkpunten, twee sensoren) bijna hetzelfde. De remedie is betere gegevens, geen betere rekenmachine: ijkpunten ver uit elkaar, over het hele meetbereik (hoofdstuk 3 van I).
De knooppuntenmethode: Kirchhoff als matrix
In hoofdstuk 21 van I schreef je voor elk netwerk knooppunt- en maasvergelijkingen met takstromen. Voor een computer is er een systematischere weg, met minder onbekenden: de knooppuntenmethode.
- Kies een referentieknoop (de massa, 0 V). De onbekenden zijn de potentialen van de andere knopen.
- De stroom door een weerstand tussen knoop en is : de wet van Ohm.
- Knooppuntwet in elke knoop: wat er via de weerstanden uitstroomt, is gelijk aan wat er door bronnen wordt ingespoten en door verbruikers wordt weggenomen.
Zo bouw je op door elke weerstand één keer te stempelen (figuur). Het resultaat is altijd symmetrisch (), met een grote diagonaal en veel nullen: goed geconditioneerd en snel op te lossen. Zo werkt ook het simulatieprogramma SPICE, sinds 1973 van de universiteit van Berkeley, dat elke chipontwerper gebruikt.
De brug van hoofdstuk 21 van I heeft maar twee onbekende knopen, M en N (T ligt vast op 10 V, B op 0): een -stelsel in plaats van drie maasvergelijkingen. Met de waarden van daar: en (opdracht 5.10).
Habitat: het 12,8 V-net van de klimaatmodule
De klimaatmodule draait op 12,8 V (hoofdstuk 20 en 21 van I). Twee batterijen hangen aan een verdeelrail V in de technische kast; zoals in hoofdstuk 21 van I staat A op 13,30 V met 20 mΩ (inwendige weerstand en kabel) en B op 13,10 V met 25 mΩ. Van de rail vertrekken kabels met een plus- en een minader naar de verbruikers. De groeilampen (2 × 95 W) hangen aan een lamprail van 1,2 m die van twee kanten gevoed wordt: een ring. Nieuwe waarden voor het dossier:
| kabel | lengte | doorsnede (2 aders) | heen en terug | |
|---|---|---|---|---|
| V–L1 | 4,0 m | 6,0 mm² | 22,9 mΩ | 43,6 S |
| L1–L2 | 1,2 m | 6,0 mm² | 6,9 mΩ | 145,3 S |
| L2–V | 5,0 m | 6,0 mm² | 28,7 mΩ | 34,9 S |
| V–P | 3,0 m | 1,5 mm² | 68,8 mΩ | 14,5 S |
| V–D | 6,0 m | 2,5 mm² | 82,6 mΩ | 12,1 S |
Verbruikers (als vaste stromen): lampen 2 × 7,42 A, pomp 1,00 A, dakmotor 1,84 A (tijdens een beweging, hoofdstuk 26 van I), en in de kast de 5 V-omvormer en de ventilatoren samen 0,62 A. Ontwerpregel: hoogstens 3 % spanningsval (0,38 V) in de kabel naar een verbruiker.
# netwerk.py - het 12,8 V-net van de klimaatmodule met de knooppuntenmethodeimport numpy as np RHO = 0.0172 # koper, Ω·mm²/m def kabel(lengte, doorsnede): """Weerstand van een kabel met plus- en minader (heen en terug), in Ω.""" return 2 * RHO * lengte / doorsnede knopen = ["V", "L1", "L2", "P", "D"] # verdeelrail, lampen 1 en 2, pomp, dakmotortakken = [("V", "L1", kabel(4.0, 6)), ("L1", "L2", kabel(1.2, 6)), ("L2", "V", kabel(5.0, 6)), ("V", "P", kabel(3.0, 1.5)), ("V", "D", kabel(6.0, 2.5))]bronnen = [("V", 13.30, 0.020), ("V", 13.10, 0.025)] # batterij A en B: U (V), R met kabel (Ω)lasten = {"L1": 7.42, "L2": 7.42, "P": 1.00, "D": 1.84, "V": 0.62} # stroom per verbruiker (A) def los_op(takken): k = {naam: i for i, naam in enumerate(knopen)} G = np.zeros((len(knopen), len(knopen))) i = np.zeros(len(knopen)) for a, b, R in takken: # elke weerstand stempelt vier plaatsen G[k[a], k[a]] += 1 / R G[k[b], k[b]] += 1 / R G[k[a], k[b]] -= 1 / R G[k[b], k[a]] -= 1 / R for a, U, R in bronnen: # bron met weerstand: 1/R op de diagonaal, U/R rechts G[k[a], k[a]] += 1 / R i[k[a]] += U / R for a, I in lasten.items(): # een verbruiker trekt stroom uit zijn knoop i[k[a]] -= I return np.linalg.solve(G, i) v = los_op(takken)for naam, V in zip(knopen, v): print(f"knoop {naam:2s}: {V:7.3f} V")for a, b, R in takken: I = (v[knopen.index(a)] - v[knopen.index(b)]) / R print(f"kabel {a:2s}-{b:2s}: {I:6.2f} A, val {abs(I) * R:.3f} V = {abs(I) * R / 12.8 * 100:.1f} % van 12,8 V")IA, IB = [(U - v[knopen.index(a)]) / R for a, U, R in bronnen]print(f"batterijen: {IA:.2f} A + {IB:.2f} A = {IA + IB:.2f} A; verbruikers samen {sum(lasten.values()):.2f} A") v2 = los_op([t for t in takken if t[:2] != ("L2", "V")]) # de ringkabel L2-V breektprint(f"zonder ring: L1 {v2[1]:.3f} V, L2 {v2[2]:.3f} V (val tot L2: {(v2[0] - v2[2]) / 12.8 * 100:.1f} %)")Uitvoer:
knoop V : 13.008 V knoop L1: 12.821 V knoop L2: 12.816 V knoop P : 12.939 V knoop D : 12.856 V kabel V -L1: 8.15 A, val 0.187 V = 1.5 % van 12,8 V kabel L1-L2: 0.73 A, val 0.005 V = 0.0 % van 12,8 V kabel L2-V : -6.69 A, val 0.192 V = 1.5 % van 12,8 V kabel V -P : 1.00 A, val 0.069 V = 0.5 % van 12,8 V kabel V -D : 1.84 A, val 0.152 V = 1.2 % van 12,8 V batterijen: 14.61 A + 3.69 A = 18.30 A; verbruikers samen 18.30 A zonder ring: L1 12.667 V, L2 12.616 V (val tot L2: 3.1 %)
De batterijen leveren samen evenveel als de verbruikers vragen (knooppuntwet); de vollere batterij A levert het meest. De lampen krijgen stroom langs twee wegen: 8,15 A via de korte kabel en 6,69 A via de lange; door de lamprail zelf loopt maar 0,73 A. De grootste spanningsval, naar L2, is 0,192 V (1,5 %). Breekt de ringkabel, dan loopt alles over één kabel en valt er 0,391 V (3,1 %) tot L2: net boven de grens. De kabels verliezen samen 3,2 W (zonder ring 5,8 W).
Blokkeert de dakmotor (10 A, hoofdstuk 26 van I), dan valt er over zijn kabel van 2,5 mm² 0,83 V: de motor krijgt nog 12,09 V, en ook de rail zakt naar 12,92 V. Met 4 mm² wordt de val 0,52 V. De zekering (5 A traag) moet de motor dan wel snel genoeg afschakelen.

Habitat: de matrix van het voedingsnet ontleed
Dit is het stelsel dat netwerk.py oplost: de conductantiematrix (siemens) maal de potentialen, gelijk aan de ingespoten stromen (ampère). De oplossing: , , , , .
- 1De diagonaal van de rail
195,1 S: alles wat aan V hangt. De batterijen (1/0,020 + 1/0,025 = 90 S) wegen het zwaarst, daarna de vier kabels (105,1 S).
- 2Een kabel tussen twee knopen
−43,6 S = −1/R van de kabel V–L1 (22,9 mΩ). Dezelfde waarde staat gespiegeld op plaats (L1, V): G is symmetrisch.
- 3De lamprail
−145,3 S: de korte, dikke lamprail tussen L1 en L2 (1,2 m, 6 mm²) is de sterkste verbinding van het net.
- 4Geen verbinding: nul
Pomp en dakmotor hangen niet rechtstreeks aan elkaar. Grote netten bestaan bijna volledig uit zulke nullen: de matrix is ijl.
- 5Een uiteinde
De dakmotor hangt alleen aan zijn eigen kabel: diagonaal en buitendiagonaal zijn even groot (12,1 S). Zijn rij zegt: (v_D − v_V)/R = −1,84 A.
- 6De bronnen
13,30/0,020 + 13,10/0,025 − 0,62 = 1188,38 A: de batterijen als stroombronnen, min de elektronica in de kast. De andere knopen hebben alleen hun verbruik (negatief).
Vakwerken: evenwicht per knoop als stelsel
Een vakwerk bestaat uit rechte staven die in knopen scharnierend verbonden zijn, met de lasten alleen in de knopen. Dan draagt elke staaf alleen een kracht langs zichzelf: trek (positief) of druk (negatief). In elke knoop moet de som van de krachten nul zijn: in het vlak twee vergelijkingen per knoop.
Met knopen, staven en reacties heb je vergelijkingen en onbekenden. Is en , dan is het vakwerk statisch bepaald: evenwicht alleen legt alle krachten vast. Is singulier, dan kan het vakwerk vervormen zonder dat een staaf rekt (een mechanisme, zoals een vierkant zonder diagonaal). Heeft het meer staven dan nodig, dan zijn er meer onbekenden dan vergelijkingen, en beslist de stijfheid van de staven (hoofdstuk 12). De technieken om een vakwerk knoop per knoop of met een snede met de hand op te lossen, zijn voor hoofdstuk 13.
De steun van het zonnepaneel (hoofdstuk 10 van I) als vakwerk: vier knopen (voeten A en B, onderrand C, bovenrand D), vijf staven (voorpaal, paneelregel, achterpaal, grondregel en een diagonaal van B naar C), een scharnier in A en een rol in B. Acht vergelijkingen, onbekenden, en : statisch bepaald.

De steun van het zonnepaneel als vakwerk
Bereken de staafkrachten en de reacties van de steun bij (a) alleen het gewicht (25 kg, verdeeld over C en D), (b) alleen de wind (495 N loodrecht op het paneel, de helft in C en de helft in D) en (c) beide samen. Welke staven moeten druk kunnen dragen? Vergelijk de reactie in B met de ballast van hoofdstuk 10 van I.
- knopen A (0; 0), B (−0,50; 0), C (0; 0,20), D (−0,50; 1,066) m, naar het zuiden
- per knoop: gewicht N, wind N
- staafkrachten en reacties in drie lastgevallen
- 1Eenheidsvectoren (van de eerste naar de tweede knoop): AC , CD , BD , AB , BC . Ze vormen de kolommen van de -matrix .
- 2In numpy (dezelfde opbouw als de knooppuntenmethode):
import numpy as np knopen = {"A": (0.0, 0.0), "B": (-0.50, 0.0), "C": (0.0, 0.20), "D": (-0.50, 1.066)} # x naar het zuiden, y omhoog (m) staven = [("A", "C"), ("C", "D"), ("B", "D"), ("A", "B"), ("B", "C")] reacties = [("A", (1, 0)), ("A", (0, 1)), ("B", (0, 1))] # scharnier in A, rol in B rij = {k: 2 * i for i, k in enumerate(["A", "B", "C", "D"])} # rij 2i: evenwicht in x, rij 2i+1: in y A = np.zeros((8, 8)) for j, (p, q) in enumerate(staven): # kolom j: de eenheidsvector van staaf j e = np.subtract(knopen[q], knopen[p]) e = e / np.linalg.norm(e) A[rij[p]:rij[p] + 2, j] += e # een trekkracht trekt p naar q ... A[rij[q]:rij[q] + 2, j] -= e # ... en q naar p for j, (k, r) in enumerate(reacties): A[rij[k]:rij[k] + 2, 5 + j] += r wind = 495 / 2 * np.array([np.cos(np.radians(30)), np.sin(np.radians(30))]) # per knoop (N) gewicht = np.array([0.0, -25 * 9.81 / 2]) F = np.zeros(8) for k in ("C", "D"): F[rij[k]:rij[k] + 2] = wind + gewicht s = np.linalg.solve(A, -F) for (p, q), kracht in zip(staven, s[:5]): print(f"staaf {p}{q}: {kracht:7.1f} N {'trek' if kracht > 0 else 'druk'}") print(f"reacties: Ax = {s[5]:.1f} N, Ay = {s[6]:.1f} N, By = {s[7]:.1f} N")staaf AC: -541.6 N druk staaf CD: -428.7 N druk staaf BD: 372.4 N trek staaf AB: -428.7 N druk staaf BC: 461.7 N trek reacties: Ax = -428.7 N, Ay = 541.6 N, By = -543.8 N
- 3Alle drie de lastgevallen:
staaf lengte (m) gewicht (N) wind (N) samen (N) AC 0,200 −122,6 −419,0 −541,6 CD 1,000 0,0 −428,7 −428,7 BD 1,066 −122,6 495,0 372,4 AB 0,500 0,0 −428,7 −428,7 BC 0,539 0,0 461,7 461,7 reactie A (x) 0,0 −428,7 −428,7 reactie A (y) 122,6 419,0 541,6 reactie B (y) 122,6 −666,5 −543,8 - 4Onder het gewicht alleen dragen de palen alles (elk 122,6 N druk); de schuine staven doen niets. Onder de wind werkt het hele vakwerk: paneelregel, grondregel en voorpaal op druk, achterpaal en diagonaal op trek.
- 5Reactie in B bij storm: , negatief: de achterste voet moet met 544 N omlaag gehouden worden, dus ongeveer 55 kg ballast zonder veiligheidsmarge. Hoofdstuk 10 van I vond met een kantelveiligheid van 1,5: 877 N (89 kg). En : de voorste voet moet 429 N wrijving leveren, ook zoals daar.
Vectoren en matrices: formules en werkwijze
Controleer elke berekening: een vectorproduct staat loodrecht op beide factoren, een rotatie bewaart lengtes, een oplossing van vul je in (), een netwerk voldoet aan de vermogensbalans, een vakwerk aan het globale evenwicht.
| symbool | betekenis | eenheid |
|---|---|---|
| hoek tussen de vectoren | ° |
| symbool | betekenis | eenheid |
|---|---|---|
| arbeid | J | |
| moment | N·m |
| symbool | betekenis | eenheid |
|---|---|---|
| knopen, staven, reacties | – |
| stap | Gauss-eliminatie |
|---|---|
| 1 | schrijf de aangevulde matrix |
| 2 | kolom : kies de grootste spil (rijverwisseling), maak nullen onder de spil met |
| 3 | herhaal tot een driehoeksmatrix; een rij : geen oplossing; : oneindig veel |
| 4 | vul van onder naar boven in; controleer door in te vullen |
| 5 | kijk naar het conditiegetal: cijfers gaan verloren |
Waar vectoren en matrices vandaan komen en waar ze heen gaan
Vectoren zijn de taal van krachten en bewegingen (K), velden en stromen (L, E) en richtingen in de ruimte (de zon, een robot). Matrices zijn de taal van alles wat uit veel gekoppelde lineaire vergelijkingen bestaat: netwerken, constructies, modellen met veel parameters, data (A). Een computer rekent bijna uitsluitend met matrices.
Vectoren optellen en ontbinden, de hoek van de zon op het paneel.
Arbeid als kracht maal weg; hier als scalair product bij elke hoek.
Moment en evenwicht, de steun van het zonnepaneel: hier als r × F en als vakwerk.
Knooppunt- en maaswet, de brug, het eerste stelsel met numpy.
Stelsels van differentiaalvergelijkingen: de toestand als vector, impliciete Euler vraagt een matrixstelsel.
Plaats, snelheid en versnelling als vectoren.
Impulsmoment en moment als vectorproducten.
De knooppunten- en snedemethode, en het idee van de eindige-elementenmethode.
De Lorentzkracht q v × B en het veld van een stroomdraad.
LU-ontbinding, stabiliteit en ijle matrices.
De kleinste kwadraten van Gauss: normaalvergelijkingen en conditie.
Een laag van een neuraal netwerk is een matrix maal een vector.
In het kort
- Een vector in 3D is een rijtje componenten ; je rekent per component. Lengte , eenheidsvector .
- Scalair product : hoeken, projecties, loodrechte stand, arbeid , zon op een vlak .
- Vectorproduct : loodrecht op beide, lengte = oppervlakte van het parallellogram, richting volgens de rechterhand; moment .
- Een matrix is een lineaire transformatie; haar kolommen zijn de beelden van de basisvectoren. is de oppervlaktefactor. : eerst , dan ; .
- Gauss: elimineren tot een driehoeksvorm (met rijverwisseling), dan terug invullen; ongeveer bewerkingen. In Python: np.linalg.solve.
- Het conditiegetal meet hoe gevoelig een stelsel is: je verliest ongeveer cijfers. Oorzaak is meestal twee bijna gelijke vergelijkingen.
- Knooppuntenmethode: , symmetrisch en ijl; vakwerk: met de eenheidsvectoren van de staven als kolommen.
Wat je nu kent
- vector
- Een grootheid met grootte en richting, genoteerd als rijtje componenten, bv. .
- eenheidsvector
- Een vector met lengte 1: . Hij geeft alleen een richting.
- scalair product
- : een getal; nul als de vectoren loodrecht staan.
- vectorproduct
- : een vector loodrecht op en (rechterhandregel), met grootte , de oppervlakte van hun parallellogram.
- moment (vector)
- : de draaiwerking van een kracht om een punt; de richting is de draai-as, het teken de draaizin.
- matrix
- Een rechthoekige tabel getallen; als transformatie stuurt ze elke vector naar een nieuwe vector, lineair.
- determinant
- Voor een 2 × 2-matrix : de factor waarmee oppervlakten veranderen (negatief: gespiegeld). Nul betekent: niet omkeerbaar.
- inverse matrix
- met ; bestaat alleen als .
- methode van Gauss
- Een stelsel oplossen door rijen te combineren tot een driehoeksvorm (eliminatie) en dan van onder naar boven in te vullen.
- conditiegetal
- Maat voor hoe gevoelig de oplossing van een stelsel is voor kleine fouten in de gegevens; groot betekent slecht geconditioneerd.
- knooppuntenmethode
- Kirchhoffs knooppuntwet voor elke knoop, met de potentialen als onbekenden: .
- vakwerk
- Een constructie van rechte staven, in knopen scharnierend verbonden, die alleen trek of druk dragen.