CHEM-A2600 - Kemiantekniikan ohjelmointikurssi, Luento-opetus, 30.5.2022-28.8.2022
Kurssiasetusten perusteella kurssi on päättynyt 28.08.2022 Etsi kursseja: CHEM-A2600
Python-oppimateriaali (CHEM-A2600)
scipy.linalg (Lineaarialgebra)
Moduuli scipy.linalg sisältää suuren määrän lineaarialgebraan liittyviä työkaluja (esim. matriisioperaatiot, ominaisarvo-ongelmien ratkaiseminen). Kappaleessa NumPyn matemaattiset funktiot mainittiin aiemmin moduuli numpy.linalg, joka sisältää samoja työkaluja. SciPyn lineaarialgebramoduuli on huomattavasti NumPy-moduulia laajempi.
Tämän kurssin puitteissa tutustumme vain funktioon scipy.linalg.solve, jolla voi ratkaista lineaarisia yhtälöryhmiä.
Hieman teoriaa
Tutustutaan yhtälöryhmien ratkaisemiseen Wikipedian sisältämän esimerkin avulla.
Määritellään lineaarinen kolmen yhtälön yhtälöryhmä:
Yhtälöryhmässä on siis kolme (tuntematonta) muuttujaa x, y ja z. Ratkaistaan muuttujien arvot muuntamalla yhtälöryhmä matriisiyhtälöksi ja soveltamalla scipy.linalg.solve-funktiota.
Yhtälöryhmä, jossa on m kappaletta yhtälöitä ja n kappaletta muuttujia voidaan kirjoittaa yleisessä muodossa
missä x1, x2, ..., xn ovat yhtälöryhmän tuntemattomat muuttujat,
a11, a12, ..., amn ovat yhtälöryhmän kertoimet ja
b1, b2, ..., bm ovat yhtälöryhmän vakiotermit.
Yhtälöryhmän ylläoleva yleinen muoto voidaan kirjoittaa myös vektorimuodossa
missä kertoimia ja vakiotermejä kuvataan sarakevektoreilla. Tämä vektorimuoto taas voidaan kirjoittaa matriisiyhtälönä
missä
A on siis neliömatriisi, x ja b vektoreita. Nyt kun yhtälöryhmä on saatu matriisimuotoon, sen ratkaisemisessa voidaan hyödyntää lineaarialgebraa. Emme käsittele teoriaa tämän enempää vaan toteamme vain, että kun meillä on yhtälöryhmä matriisimuodossa Ax = b, voimme ratkaista sen scipy.linalg.solve-funktiolla näin helposti:
x = scipy.linalg.solve(A, b)
Esimerkki
Käytetään esimerkissä yllä esiteltyä yhtälöryhmää
Nyt siis muuttujat x, y ja z vastaavat yhtälöryhmän yleisen muodon muuttujia x1, x2 ja x3. Ratkaistaan tuntemattomat:
import numpy as np from scipy.linalg import solve # A on 3x3 neliömatriisi A = np.array([[ 3, 2, -1], [ 2, -2, 4], [-1, 1/2, -1]]) # b on kolmen alkion vektori b = np.array([1, -2, 0]) # Ratkaistaan tuntemattomat muuttujat x = solve(A, b) print(x)
Koodi tulostaa
[ 1. -2. -2.]
Eli
x1 = x = 1,
x2 = y = -2 ja
x3 = z = -2
Ratkaisu on täsmälleen sama kuin Wikipediassa: