A többváltozós függvények és alprogramok alkalmazása az egyik alapvető eszköze a numerikus analízisnek. Az alábbiakban bemutatott példák segítségével részletesen megismerkedhetünk a többváltozós függvények kezelésével és a Fortran programozási nyelvben való implementálásukkal.

A függvények az alprogramok (subprogramok) alapvető építőelemei. A függvények olyan programrészletek, amelyek egy vagy több bemeneti értékből egy kimeneti értéket számolnak ki, és ezt visszaadják a főprogramnak. A többváltozós függvények esetén fontos figyelmet fordítani arra, hogy a változók megfelelő sorrendben és típusban legyenek kezelve. Fortran esetében ezt egyszerűen elérhetjük a függvények meghívásakor, ahol a bemeneti argumentumok sorrendje és típusa kulcsfontosságú.

Például, ha a következő képet vizsgáljuk:

f1(x, y) = x^2 + y^2 + 2xy^2
f2(x, y) = x^2 - y^2

Ezeket az alábbi módon definiálhatjuk egy Fortran programban:

markdown
f1(x, y) = x*x + y*y + 2*x*y**2 f2(x, y) = x*x - y*y

Ezután egy egyszerű bemeneti kérés történik a programban, ahol a felhasználó megadja az x és y értékeket:

lua
write(*,*) 'Input x,y'
read (*,*) x, y

Miután az értékeket megadtuk, különböző függvények kiszámítására kerül sor:

ini
pf1 = f1(x, y + 2) pf2 = f2(x + y, 5) pf3 = f1(4.53, x - y)

A következő kimeneti formátumban jelennek meg az eredmények:

lua
write(*,*) 'x,y,pf1,pf2,pf3,(pf1+pf2)/pf3'

A program eredménye a következőképpen jelenik meg:

1.20000005 1.5 43.0900002 -17.7099991 21.426302 1.18452549

Ez a példában bemutatott függvények egyszerű példái a többváltozós matematikai számításoknak, amelyeket könnyedén megvalósíthatunk Fortranban.

Ha több változós függvényt szeretnénk kezelni, mint például egy háromváltozós függvényt, akkor a következő példa bemutatja, hogyan kell ezt megtenni:

sql
SUMS(X, Y, Z) = SQRT(X + Y + Z)

A következő kódrészlet segítségével három változós függvényt számolhatunk ki:

markdown
READ(*,*) A, B, C, X, Y, Z AL = SUMS(A*A, B*B, C*C) BT = SUMS(7.*X, 8.*Y, -8.0) GM = 4.*X/SUMS(X*X, Y*Y, Z*Z)**3

A kimenet az alábbi értékeket adja:

css
VALUES OF A,B,C,X,Y,Z 9. 8. 7. 6. 5. 4
VALUES OF AL,BT,GM 13.9283886 8.60232544 0.0355201811

Ha a szükséges számításokhoz több sort kell írnunk, nem használhatunk egyszerű aritmetikai függvényt. Ilyenkor alprogramokat alkalmazunk, amelyek nagyobb számú műveletet végeznek el egyetlen függvényhívás során, és visszaadják az eredményt a főprogramnak. Az alprogramok az alábbi szintaxis szerint épülnek fel:

pgsql
FUNCTION NAME (arguments)
…statements… RETURN END

Az alprogramok segítségével a bonyolultabb számításokat is megoldhatjuk. A függvények meghívásakor fontos, hogy az argumentumok típusa és száma megegyezzen a függvény definíciójában szereplő paraméterekkel.

Vegyünk egy egyszerű példát a következő függvény használatával:

FC(x) = x^4

Ezt az alábbi módon hívhatjuk meg:

scss
write(*,*) fc(x), fc(y), fc(z), fc(x + y)

A következő kimenetet kapjuk:

markdown
16. 81. 256. 625.

Az alábbi módosított példában, ha az alprogramban kiírási műveletet végzünk, akkor hibát kapunk, mert az alprogramokban csak a számítások végezhetők el, kiírás nem:

lua
function fc(x)
fc = x**4 write(*,*) FC return end

Ebben az esetben a futás során hibát kapunk, amely a következőképpen jelenik meg:

mathematica
I/O recursion: I/O started while already doing I/O apparent state: unit 6 (unnamed)

Ez a hiba azt jelenti, hogy az alprogramban csak számításokat végezhetünk, de nem írhatunk ki adatokat.

Fontos, hogy a többváltozós függvények kezelésekor különös figyelmet fordítsunk a változók típusaira és azok sorrendjére. Az alprogramok használata lehetővé teszi a bonyolultabb matematikai műveletek végrehajtását, és segít abban, hogy a programunk strukturáltabb és hatékonyabb legyen. Az alprogramok és függvények megfelelő használata alapvető a numerikus analízisben és más tudományos számításokban.

Hogyan találjuk meg egy n-ed fokú polinómium összes gyökét?

A polinomok gyökeinek meghatározása fontos matematikai feladat, amely széleskörű alkalmazásokat talál a numerikus analízisben és a mérnöki tudományokban. A gyökök keresésének módjai között szerepel a valós és a komplex gyökök egyaránt. Az alábbiakban bemutatott program egy olyan eljárást ismertet, amely segítségével egy n-ed fokú polinómium összes gyökét meghatározhatjuk egyetlen futtatással. Ez az eljárás nemcsak a valós, hanem a komplex gyökök kiszámítására is alkalmas.

A gyökök meghatározásához a Bairstow-módszert alkalmazzuk, amely lehetővé teszi a polinomok faktorizálását. Ez a módszer iteratív módon keres egy kvadratikus faktort, majd azt felhasználva folytatja a gyökök keresését. A következő lépésekben a gyökök meghatározásához szükséges matematikai műveleteket és az ezekhez kapcsolódó programkódot ismertetjük.

A polinómium gyökének keresésének módja

Először is, a program kér egy kezdőértéket a polinómium fokának és a koefficiensének megadására. Miután a felhasználó megadja a szükséges adatokat, a program elvégzi a gyökök keresését a következő módon:

  1. Beviteli adatok: A felhasználó megadja a polinómium fokát (n) és a koefficiens értékeket. Ezt követően két kezdőértéket kell biztosítani a kvadratikus faktor számára (u0 és v0).

  2. Iteráció: A Bairstow-módszer segítségével az iterációs folyamat elindul. A kezdőértékek folyamatosan frissülnek, és az új értékeket felhasználva a program iteratív módon közelíti a gyököket.

  3. Két fő alprogram: Két kulcsfontosságú alprogram található a programban:

    • Bairstow: Ez az alprogram végzi a polinómium faktorizálását, keresve egy kvadratikus faktort.

    • Quadroot: Ez az alprogram felelős a kvadratikus polinómium gyökének meghatározásáért.

  4. A gyökök meghatározása: A fenti két alprogram segítségével az összes gyökeret meghatározhatjuk, mind a valós, mind a komplex gyököket.

  5. Folyamatok ismétlése: Miután egy kvadratikus faktort megtaláltunk, az új gyököket használjuk a következő iterációban. Ez addig folytatódik, amíg a polinom fokát el nem érjük 1 vagy 2-re, ekkor az utolsó gyököt kiszámítjuk.

A program működése

A program először beolvassa a polinómium fokát és koefficienseit, majd két kezdőértéket kér a kvadratikus faktorra. Az iteratív folyamat során a Bairstow-alprogram segítségével a program folyamatosan csökkenti a polinom fokát, míg végül meg nem találja az összes gyökeret.

A program a következő lépéseket hajtja végre:

  1. A bemeneti adatokat feldolgozza és beolvassa a koefficiens értékeket.

  2. A Bairstow-alprogramot használva keres egy kvadratikus faktort.

  3. Ha a fok 2 vagy 1 lesz, a kvadratikus egyenlet gyökeit meghatározza a Quadroot-alprogram segítségével.

A komplex gyökök esetén a program a gyökök valós és képzetes részeit is megadja.

A gyökök megjelenítése

A program végén a gyökök megjelennek a képernyőn. Ha a gyökök valósak, akkor azok egyszerűen kiíródnak. Ha komplexek, a program a valós és a képzetes részeket is külön-külön megjeleníti.

Az alábbi kimeneti példák mutatják be, hogyan működik a program:

Példa 1:

Polinom: f(x)=x3+x+10f(x) = x^3 + x + 10

  • Bemenet: 3 (fok), koefficiensek: 1, 0, 1, 10

  • Kezdőértékek: 2, 2

  • Kimenet: A komplex gyökök:

    • Gyök 1: 1+2i1 + 2i

    • Gyök 2: 12i1 - 2i

    • Végső gyök: -2

Példa 2:
Polinom: f(x)=x42x3+4x24x+4f(x) = x^4 - 2x^3 + 4x^2 - 4x + 4

  • Bemenet: 4 (fok), koefficiensek: 1, -2, 4, -4, 4

  • Kezdőértékek: 2, 2

  • Kimenet: Komplex gyökök:

    • Gyök 1: 1+i1 + i

    • Gyök 2: 1i1 - i

    • Második szintű gyökök:

    • Gyök 1: 0+1.41421354i0 + 1.41421354i

    • Gyök 2: 01.41421354i0 - 1.41421354i

Fontos megjegyzések

A program működése során fontos figyelembe venni, hogy az iteratív folyamatok során a gyökök pontos kiszámítása érdekében az egyes lépések pontossága kulcsfontosságú. A program a koefficiensértékek saturációját figyeli, hogy meghatározza, mikor kell leállítani az iterációt, de ezen kívül az iterációs hibák minimalizálása érdekében érdemes további finomításokat végezni a program működésén.

A komplex gyökök keresése különösen fontos, mivel sok polinom nemcsak valós, hanem komplex gyökökkel is rendelkezik. A program által használt Bairstow-módszer biztosítja, hogy minden gyöket megfelelően kezelni tudjunk, így nemcsak a matematikai, hanem a gyakorlati alkalmazásokban is hasznos eszközt ad a kezünkbe.

Hogyan találhatjuk meg a mátrix sajátértékeit és sajátvektorait?

A lineáris algebrában a sajátértékek és sajátvektorok meghatározása alapvető szerepet játszanak a mátrixokkal kapcsolatos problémák megoldásában. A sajátértékek és sajátvektorok megtalálása számos alkalmazásban, például gépi tanulásban, fizikai modellezésben és gazdasági elemzésekben is hasznos. Az alábbiakban bemutatott módszerek segítségével meghatározhatjuk egy adott mátrix sajátértékeit és sajátvektorait.

Az AX = λX egyenletet figyelembe véve, ahol A egy n x n-es mátrix és X a sajátvektor, λ pedig a sajátérték, többféle módszer létezik a sajátérték problémájának megoldására. A leggyakoribb technikák között szerepelnek az Erő módszer, a Fadeev-Leverrier módszer és a Jacobi-módszer. A következőkben az Erő módszert és a Fadeev-Leverrier módszert ismertetjük részletesen.

Erő Módszer

Először is vegyük figyelembe az Erő módszert, amelynek segítségével csak a legnagyobb sajátértéket lehet meghatározni egy iteratív folyamaton keresztül, egy tetszőleges kezdeti sajátvektor értéket alapul véve. Az Erő módszer lépései a következőképpen zajlanak:

  1. Egy vektort, Y-t számolunk ki a következő képlettel:

    Y=AXY = A \cdot X,
    ahol X a kezdeti, tetszőleges sajátvektor.

  2. Az Y vektor legnagyobb elemét, k-t meghatározzuk.
    k=max(Y)k = \max(Y).

  3. Minden egyes elemet elosztunk k-val, így új értéket kapunk az X vektorra:

    X=YkX = \frac{Y}{k}.

Ezeket a lépéseket addig ismételjük, amíg a vektorok közötti különbség elég kicsi nem lesz, ami azt jelzi, hogy elértük a konvergenciát. A végén az kk-nak kell adni a legnagyobb sajátértéket, míg az X az ehhez tartozó sajátvektor lesz. Azonban előfordulhat, hogy a konvergencia nagyon lassú egyes problémákban, amit figyelembe kell venni a számítások során.

Az Erő módszer előnye, hogy egyszerű és gyorsan alkalmazható, különösen akkor, ha csak a legnagyobb sajátértékre van szükség. Hátránya viszont, hogy nem biztosítja az összes sajátérték meghatározását, és nem garantálja, hogy a konvergencia gyors lesz, ha a mátrix sajátértékei közötti eltérések kicsik.

Fadeev-Leverrier Módszer

A teljes sajátértéksorozat meghatározása érdekében az egyik leghatékonyabb módszer a Fadeev-Leverrier módszer, amely a mátrix karakterisztikus polinomját használja fel. A sajátértékek meghatározásának kulcsa a karakterisztikus polinom megtalálása, amelyet az alábbi egyenlet segítségével állíthatunk elő:

det(AλI)=0,\text{det}(A - \lambda I) = 0,

ahol AA a mátrix, λ\lambda a sajátérték, és II az egységmátrix. Az egyenletet kibővítve kapjuk meg a karakterisztikus polinomot, amely az alábbi formában jelenik meg:

p0λnp1λn1p2λn2pn=0,p_0 \lambda^n - p_1 \lambda^{n-1} - p_2 \lambda^{n-2} - \dots - p_n = 0,

ahol p0=1p_0 = 1, és a többi együttható p1,p2,,pnp_1, p_2, \dots, p_n a Fadeev-Leverrier algoritmus segítségével számítható ki.

A Fadeev-Leverrier módszer lépései a következőképpen alakulnak:

  1. Kezdetben A1=AA_1 = A, majd kiszámoljuk az első együtthatót, p1=tr(A1)p_1 = \text{tr}(A_1), ahol a "tr" a mátrix nyomát (trace) jelöli.

  2. Ezután generálunk egy egységmátrixot, majd iteratívan kiszámoljuk az AiA_i mátrixokat, minden egyes lépésben alkalmazva a következő relációkat:

    Ai=Ai1pi1I,A_i = A_{i-1} - p_{i-1} \cdot I,

    és a következő együtthatókat:

    pi=tr(Ai)i.p_i = \frac{\text{tr}(A_i)}{i}.

Ezután minden egyes lépésben kiszámoljuk a karakterisztikus polinom új együtthatóit, amíg el nem érjük a kívánt fokot. Miután megkaptuk az összes együtthatót, a polinom gyökeit (azaz a sajátértékeket) különféle numerikus módszerekkel, például a Newton-Raphson módszerrel és szintetikus osztással találhatjuk meg.

Miért fontos ez a módszer?

A Fadeev-Leverrier módszer lehetővé teszi a mátrix összes sajátértékének meghatározását, ami különösen hasznos, ha több mint egy sajátértékre van szükség, és nemcsak a legnagyobbra. Azonban figyelembe kell venni, hogy a módszer érzékeny lehet a számítási hibákra, különösen akkor, ha a mátrix sajátértékei közötti különbségek kicsik.

Ezen kívül érdemes megjegyezni, hogy ha a mátrix nem szimmetrikus, a sajátértékek komplexek is lehetnek, amit szintén figyelembe kell venni a módszer alkalmazása során.

További fontos szempontok

Az Erő és a Fadeev-Leverrier módszerek mindegyike fontos eszközként szolgálhat a mátrixokkal kapcsolatos problémák megoldásában, de a választott módszer függ a probléma jellegétől. Az Erő módszer gyors, de korlátozott, míg a Fadeev-Leverrier módszer minden sajátértéket meghatároz, de bonyolultabb és érzékenyebb lehet a numerikus hibákra.

Fontos, hogy a numerikus módszerek alkalmazása során mindig figyeljünk a konvergenciára és a pontos számításokra. A mátrixokkal kapcsolatos problémák esetén a megfelelő módszer kiválasztása kulcsfontosságú lehet a sikeres megoldáshoz. A gyakorlatban előfordulhat, hogy egy kombinált megközelítés alkalmazása, például az Erő módszer gyors alkalmazása az első sajátérték meghatározásához, majd a Fadeev-Leverrier módszer használata a teljes spektrum kiszámításához, a leghatékonyabb megoldást eredményezi.

Hogyan használhatók a trigonometrikus és egyéb matematikai függvények Fortranban?

A trigonometrikus és hiperbolikus függvények alkalmazása elengedhetetlen a numerikus analízisben és a mérnöki számításokban. A következőkben a Fortran programozási nyelv segítségével vizsgáljuk meg, hogyan használhatók az ilyen típusú függvények, és milyen módszerekkel végezhetünk el egyszerű matematikai számításokat.

A trigonometrikus függvények, mint a szinusz (SIN), koszinusz (COS) és tangens (TAN), a leghasználatosabbak a különböző mérnöki és fizikai számítások során. Mivel a trigonometrikus függvények csak radiánban működnek, az egyik legfontosabb lépés az, hogy az adott szöget először radiánra kell konvertálnunk, ha az eredeti érték fokban van megadva.

A következő Fortran program segítségével például könnyedén kiszámíthatjuk a szinusz, koszinusz és tangens értékeket a 0°, 30°, 45° és 60° szögekre:

fortran
C PROGRAM TO FIND TRIGONOMETRIC FUNCTION VALUES REAL X1,X2,X3,X4,X1R,X2R,X3R,X4R X1=0. X2=30.0 X3=45.0 X4=60.0 PI=ATAN(1.0)*4. X1R=X1*PI/180. X2R=X2*PI/180. X3R=X3*PI/180. X4R=X4*PI/180. WRITE(*,*) 'THETA SINTH COSTH TANTH' WRITE(*,*) X1,SIN(X1R),COS(X1R),TAN(X1R) WRITE(*,*) X2,SIN(X2R),COS(X2R),TAN(X2R) WRITE(*,*) X3,SIN(X3R),COS(X3R),TAN(X3R) WRITE(*,*) X4,SIN(X4R),COS(X4R),TAN(X4R) STOP END

A fenti program működése során figyelmet kell fordítanunk arra, hogy az ATAN(1.0)*4 képlettel számoltuk ki a π értékét. Az átadott szögek (például 30°) fokban voltak megadva, így ezeket először radiánra kell konvertálnunk a trigonometrikus függvények számára, amelyek radiánban dolgoznak. Ha a szöget már radiánban adjuk meg, a konverzióra nincs szükség.

A program kimenete a következő értékeket adja vissza:

nginx
THETA SINTH COSTH TANTH 0.0 0.0 1.0 0.0 30.0 0.5 0.866025388 0.577350259 45.0 0.707106769 0.707106769 1.0 60.0 0.866025448 0.49999997 1.7320509

Fontos, hogy a programban a fokok és radiánok közötti átváltás kulcsfontosságú a helyes eredmények eléréséhez.

Egy másik érdekes alkalmazás a gyökök számítása. Fortranban a ** operátor segítségével könnyen kiszámíthatjuk egy szám n-edik gyökét. Ha például egy számot és egy gyököt szeretnénk kérni, a következő programot használhatjuk:

fortran
C PROGRAM TO FIND nth ROOT OF A REAL NUMBER
REAL A, CRN WRITE(*,*) 'Input the number' READ(*,*) A WRITE(*,*) 'Input which root to find (e.g. input 5 to find 5th root)' READ(*,*) N CRN=A**(1./n) WRITE(*,*) n,'th root of', A, ' is', CRN STOP END

Ez a program lehetővé teszi, hogy megadjuk egy számot és annak n-edik gyökét, és a program kiszámítja azt. Érdemes megjegyezni, hogy ha A**(1/n) formát használnánk, akkor az eredmény mindig 1 lenne, mivel az n egész szám esetén 1/n mindig nullát adna.

A Fortran egyik másik érdekes könyvtári funkciója a MOD, MAX és MIN függvények, amelyek lehetővé teszik a maradék számítását, valamint a legnagyobb és legkisebb szám kiválasztását egy sorozatból. Az alábbi program bemutatja, hogyan használhatjuk ezeket a funkciókat:

fortran
C program to use MOD, MAX and MIN functions x1=24 x2=36 WRITE(*,*) MOD(X1,X2), MOD(X2,X1) WRITE(*,*) MAX(23,14,5,-10,36) WRITE(*,*) MIN(23,14,5,-10,36) STOP END

Az output a következő lesz:

diff
24. 12.
36 36 -10

A MOD(X1, X2) a 24 mod 36 értékét adja vissza, amely 24, míg a MOD(X2, X1) a 12 értéket adja. Ezáltal képesek vagyunk a számok közötti maradékot kiszámítani.

A változók értékeinek inicializálásához használhatjuk a DATA utasítást is. A DATA utasítás segítségével egyszerűen beállíthatjuk a változók kezdeti értékeit, amelyeket később a program futása során használhatunk. Például az alábbi programban három változót inicializálunk:

fortran
C PROGRAM TO DEMONSTRATE THE USE OF DATA STATEMENT
INTEGER AGE REAL HEIGHT CHARACTER NAME*15 DATA AGE, HEIGHT, NAME/28, 6.1, 'Pran'/ WRITE(*,*) '**PROGRAM TO DEMONSTRATE THE USE OF DATA STATEMENT**' WRITE(*,*) 'Name:', NAME WRITE(*,*) 'Age:', AGE WRITE(*,*) 'Height=', HEIGHT, ' FEET' STOP END

Az alábbi kimenetet kapjuk:

makefile
**PROGRAM TO DEMONSTRATE THE USE OF DATA STATEMENT** Name: Pran Age: 28 Height= 6.0999999 FEET

Ez a program bemutatja a DATA utasítás alkalmazását, amely egyszerűsíti a változók kezdeti értékeinek megadását.

A Fortranban a vezérlési utasítások segítségével biztosíthatjuk, hogy a programunk megfelelően reagáljon a különböző feltételekre. A vezérlési utasítások (mint például az IF vagy GOTO) lehetővé teszik, hogy a program ne csak lineárisan fusson, hanem az adott feltételek alapján különböző áramlásokat kövessen.

A trigonometrikus, gyökök és matematikai műveletek megfelelő alkalmazása alapvető a tudományos és mérnöki számítások során. A Fortran egy rendkívül erőteljes nyelv, amely segít a komplex numerikus problémák gyors megoldásában, és különböző matematikai könyvtárak állnak rendelkezésre a felhasználók számára, hogy a lehető legprecízebben végezhessék el a szükséges számításokat.