A programozás egyik alapvető és gyakran alkalmazott területe az adatok kezelése fájlokban. A Fortran nyelv, melyet gyakran használnak tudományos és mérnöki számítások során, lehetőséget ad arra, hogy adatokat olvassunk be fájlokból, módosítsuk őket, és új fájlokba írjuk ki azokat. Az alábbi példákban két fő műveletet mutatunk be: adatolvasás és rendezés, valamint adatok átalakítása és fájlok egyesítése.

Első példánkban egy egyszerű programot vizsgálunk, amely egy adatfájlt olvas be, és kétféle rendezett listát készít belőle. Az egyik a rangsorolt lista, ahol az egyes diákok pontszámaik alapján szerepelnek, míg a másik az ábécé sorrendbe rendezett lista.

A program először beolvassa a fájlt, amely tartalmazza a diákok nevét, azonosítóját és eredményét. Ezt követően két különböző rendezési algoritmus segítségével előállítja a rangsorolt és az ábécé sorrendbe rendezett listát, majd mindkét listát kiírja két különböző fájlba. A rangsorolás az alábbi logika szerint történik: először minden diákot a legmagasabb pontszám szerint rendezzük, majd azonos pontszám esetén az ábécé sorrendjében. A program ezen kívül az eredeti fájlba is kiírja az adatokat, hogy az eredmények áttekinthetők legyenek.

A programozási részletek között kiemelhető, hogy a fájlok kezelésére szolgáló alapvető Fortran utasításokat alkalmazunk, például az open, read, write parancsokat, amelyek lehetővé teszik az adatok fájlokba írását és fájlokból való olvasását. Az ilyen típusú fájlkezelés elengedhetetlen a tudományos számítások során, ahol az adatok hatékony tárolására és feldolgozására van szükség.

A második példa egy olyan programot mutat be, amely atomok koordinátáit tartalmazó fájlt készít, majd azokat különböző átalakításoknak vetette alá. A koordináták átalakítása során új értékeket számolunk ki a következő módon:

  • xt(i) = x(i) - y(i)

  • yt(i) = y(i) - z(i)

  • zt(i) = x(i) + y(i)

Miután az új koordináták kiszámításra kerültek, a program új fájlba írja ki őket, megőrizve az atomok azonosítóit is. Az ilyen típusú átalakítások gyakran előfordulnak különböző mérnöki és fizikai problémákban, ahol az eredeti adatok módosítására van szükség egy új számítás elvégzéséhez.

Végül a harmadik példa két fájl egyesítésére ad megoldást. A program két, előzőleg létrehozott fájlt, a coord.dat és tcoord.dat fájlokat olvassa be, majd azok tartalmát egyesíti egy új fájlba, a fincoord.dat fájlba. Ez a művelet akkor hasznos, ha különböző forrásokból származó adatokat kell egyesíteni egy közös fájlba, ami további feldolgozást vagy elemzést igényel.

Az adatok kezelésének és fájlokkal való munkavégzésének megértéséhez elengedhetetlen, hogy a programozó tisztában legyen a fájlokhoz való hozzáférés alapvető működésével, valamint a különböző típusú adatkezelési technikákkal. Mindez nemcsak a Fortran nyelv alkalmazásánál hasznos, hanem más programozási nyelvekben is fontos alapvető ismeret.

Az olvasott és írt adatok megjelenítése és ellenőrzése során kiemelten fontos, hogy megfelelő formátumot válasszunk. A Fortran nyelvben a format utasítás segítségével szabályozhatjuk az adatok formázását, hogy azok könnyen olvashatók legyenek, ami különösen fontos a tudományos és mérnöki alkalmazásokban.

A fájlok kezelése, mint például az adatok rendezése, átalakítása és egyesítése, minden programozó számára elengedhetetlen készség, különösen olyan területeken, ahol nagy mennyiségű adatot kell feldolgozni. A Fortran ezen lehetőségei lehetővé teszik a felhasználó számára, hogy hatékonyan végezzen bonyolult számításokat és kezeljen adatokat, miközben fenntartja a program átláthatóságát és működési sebességét.

Hogyan írjunk egyszerű programokat FORTRAN nyelven?

A FORTRAN nyelvben az első programok megírása egyszerű, ám alapvető lépéseket igényel. Ha interaktív módon, saját tanulásra szeretnénk programozni, a legjobb, ha rögtön nekiállunk az első programunk megírásának anélkül, hogy túlságosan elmélyednénk a nyelv részleteiben. Tegyük fel, hogy egy egyszerű szöveget, például a "HELLO! THIS IS MY FIRST PROGRAM" mondatot szeretnénk kiírni a képernyőre. Ehhez a következő programot kell megírnunk:

fortran
C THIS IS MY FIRST PROGRAM
WRITE(*,*)'HELLO! THIS IS MY FIRST PROGRAM' STOP END

A program működése a következő:

  1. Az első sorban a ‘C’ szimbólum kommentárt jelöl, ami csak a programozó és a felhasználó számára hasznos információt tartalmaz, de a program végrehajtása során semmilyen hatása nincs.

  2. A második sorban található WRITE(*,*) utasítás kiírja a szöveget a képernyőre. Az idézőjelek közé tett szöveg jelenik meg változtatás nélkül.

  3. A harmadik sorban található STOP utasítás leállítja a program végrehajtását.

  4. A negyedik sorban lévő END utasítás a program végét jelzi.

Miután lefordítottuk a programot a fc p1-hello.f parancs segítségével, a képernyőn az alábbi szöveget kell látnunk:

sql
HELLO! THIS IS MY FIRST PROGRAM

A második példa célja, hogy két egész számot összeadjon. Itt egy másik programot írtunk, amely összeadja a 15 és 17 értékeket:

fortran
C PROGRAM TO ADD TWO FIXED INTEGER NUMBERS
INTEGER A, B, SUM A=15 B=17 SUM=A+B WRITE(*,*) 'SUM OF INTEGERS 15 AND 17 IS=', SUM STOP END

A program működése a következő:

  • Az INTEGER A, B, SUM deklarációval három egész szám változót hozunk létre, amelyek tárolják az összeadott számokat és az eredményt.

  • Az A=15 és B=17 sorok az összeadandó értékeket rendelik hozzá a változókhoz.

  • A SUM=A+B sor végzi el az összeadást és tárolja az eredményt a SUM változóban.

  • Az WRITE(*,*) utasítás a képernyőre írja ki az összeadás eredményét.

A program kimenete:

vbnet
SUM OF INTEGERS 15 AND 17 IS= 32

A FORTRAN nem érzékeny a kis- és nagybetűk közötti különbségre, tehát az utasítások bármilyen kombinációval működnek, például WRITE, write, vagy wRiTe mind ugyanazt a hatást érik el.

A következő programot úgy módosíthatjuk, hogy a felhasználó bármilyen két számot megadhasson, amelyeket a program összead. Ehhez a READ utasítást kell használnunk, amely az adatokat beolvassa a billentyűzetről:

fortran
C PROGRAM TO FIND SUM OF ANY TWO INTEGER NUMBERS
C NUMBERS ARE TO BE INPUT FROM THE KEYBOARD INTEGER A, B, SUM WRITE(*,*) 'ENTER THE TWO INTEGER NUMBERS' READ(*,*) A, B SUM = A + B WRITE(*,*) 'SUM OF', A, B, ' IS=', SUM STOP END

A módosított program működése:

  1. Az ENTER THE TWO INTEGER NUMBERS üzenet megjelenik a képernyőn, hogy a felhasználó tudja, hogy két számot kell beírnia.

  2. A READ(*,*) A, B sor beolvassa a felhasználó által megadott két számot.

  3. A SUM = A + B sor végzi el az összeadást.

  4. A kimenetben az eredmény a következőképpen jelenik meg:

vbnet
ENTER THE TWO INTEGER NUMBERS 15 12
SUM OF 15 12 IS= 27

Ha valaki más számokat szeretne összeadni, egyszerűen új adatokat adhat meg a futtatás során.

A következő fontos dolog, amit figyelembe kell venni, az a különböző adat típusok használata. A FORTRAN különböző típusú adatokat különböző módon kezel. Ha például nem egész számokkal szeretnénk dolgozni, hanem valós számokkal, akkor a változókat REAL típusúvá kell deklarálnunk:

fortran
REAL A, B, SUM

Ezután a program valós számokkal dolgozik, például 123.456 és 12345.6789 összeadásával. A program futtatásakor az eredményt ugyanúgy a képernyőre írhatjuk.

A FORTRAN konstansok olyan értékek, amelyek nem változnak meg a program végrehajtása során. Különböző típusú numerikus konstansokat használhatunk, amelyeket a programban konkrét értékként használunk fel, például pi értékét vagy más fix számokat.

Hogyan oldjuk meg a lineáris egyenletrendszereket mátrix inverzióval és Gauss-Seidel módszerrel?

A lineáris egyenletrendszerek megoldása az egyik legfontosabb feladat a numerikus analízisben, különösen akkor, ha több változót tartalmazó rendszerekről van szó. Két elterjedt módszer a Gauss-Seidel iteratív módszer és a mátrixinverziós módszer. Az alábbiakban részletesen bemutatjuk ezen módszerek alkalmazását, különös figyelmet fordítva azok matematikai hátterére és gyakorlatbeli használatára.

A Gauss-Seidel módszer egy iteratív technika, amely a következő alapelven működik: a rendszer egyenleteinek megoldását fokozatosan közelítjük. Ehhez a mátrixokat úgy manipuláljuk, hogy a változók értékeit egy-egy iteráció során egyre pontosabban meghatározzuk. Azonban ez a módszer csak akkor alkalmazható, ha a mátrix szigorúan diagonálisan dominál. Ez azt jelenti, hogy minden sorban a főátlón lévő elemnek (aii) nagyobbnak kell lennie, mint a többi elem abszolút összegének. Ha ez a feltétel nem teljesül, akkor a módszer nem konvergál, és a megoldás nem található meg.

Egy példa, amely bemutatja, hogyan működik a Gauss-Seidel módszer, a következő háromváltozós rendszerrel foglalkozik:

2x1+x2+x3=52x_1 + x_2 + x_3 = 5

5x1+2x2+x3=155x_1 + 2x_2 + x_3 = 15
2x1+x2+4x3=82x_1 + x_2 + 4x_3 = 8

Az iterációk során az értékek konvergálnak a végleges megoldás felé, amely a következő: x1=1x_1 = 1, x2=2x_2 = 2, x3=1x_3 = 1. A módszer folyamatosan javítja az értékeket az egyes változókra, amíg el nem éri a kívánt pontosságot. Azonban, ha a feltétel nem teljesül, a sorok átrendezése segíthet abban, hogy a szigorú dominancia helyreálljon, és így a megoldás végül megtalálható legyen.

A másik módszer, amely szintén hasznos lehet a lineáris egyenletrendszerek megoldásában, a mátrixinverzió. A mátrixinverziós módszer a következő lépésekben valósítható meg:

  1. Az egyenletrendszert mátrix formában ábrázoljuk: Ax=BAx = B, ahol A a mátrix, x a változók vektora és B a jobb oldali vektor.

  2. Az egyenletet megszorozzuk a mátrix inverzével: A1Ax=A1BA^{ -1}Ax = A^{ -1}B, ami leegyszerűsödik: x=A1Bx = A^{ -1}B. A cél tehát az, hogy megtaláljuk A1A^{ -1}, a mátrix inverzét.

  3. Az A mátrix inverzét egy olyan eljárással találjuk meg, amely hasonló a Gauss-eliminációhoz, de itt az a cél, hogy a mátrixot átalakítsuk egy diagonális mátrixszá. Az átalakítás során egy egységmátrixot is alkalmazunk, amelyet ugyanazon műveletek során módosítunk, mint az A mátrixot, hogy végül az egységmátrixból az inverz mátrixot kapjuk.

Ez a módszer hasonló elveken alapul, mint a Gauss-elimináció, de a fő cél itt az, hogy közvetlenül meghatározzuk a változók értékeit az inverz mátrix és a jobb oldali vektor szorzataként.

A gyakorlati példákban a mátrixinverzió módszere az alábbi módon valósul meg egy háromváltozós rendszerre:

3x1+5x2+x3=93x_1 + 5x_2 + x_3 = 9
6x1+4x2+x3=66x_1 + 4x_2 + x_3 = 6
3x1+5x2+2x3=63x_1 + 5x_2 + 2x_3 = 6

A megoldás a mátrix inverzióval történik, ami az alábbi lépésekkel érhető el. Először kiszámítjuk az inverz mátrixot, majd az inverz és a jobb oldali vektor szorzataként meghatározzuk a keresett változók értékeit.

Fontos megjegyezni, hogy a mátrixinverzió alkalmazásakor szükséges a mátrix invertálhatóságának biztosítása, amely a mátrix determinánsának nem nulla értékétől függ. Ha a determináns nulla, akkor az A mátrix nem inverzálható, és a rendszer nem oldható meg ezen a módon.

A mátrixinverzió alkalmazása esetén a következő programkód segíthet a számításokban. A program először bekéri a mátrixot és a jobb oldali vektort, majd elvégzi a szükséges műveleteket az inverz mátrix kiszámításához. Az inverz mátrixot használva végül meghatározhatjuk a változók értékeit.

Ezek a módszerek a lineáris egyenletrendszerek megoldásának alapvető technikái, amelyek széleskörűen alkalmazhatók a mérnöki és tudományos számítások során. A megfelelő módszer kiválasztása mindig az adott probléma jellegétől és a rendszer mátrixának tulajdonságaitól függ.

A Gauss-Seidel módszer például iteratív jellegéből adódóan gyorsan alkalmazható, azonban nem minden esetben garantált, hogy a kívánt megoldást adja. Azokban az esetekben, amikor a mátrix nem teljesíti a szigorú dominanciát, érdemes a sorok átrendezésével biztosítani a megfelelő feltételeket.

Mátrixinverzió alkalmazása esetén a módszer biztosítja a pontos megoldást, amennyiben a mátrix invertálható. Azonban ennek a módszernek a hátránya, hogy a nagy rendszerek esetén számítási igénye magas lehet, ezért gyakran inkább a numerikus megoldások, mint például a Gauss-Seidel vagy más iteratív módszerek alkalmazása ajánlott.