Vektorok
A fizika numerikus módszerei I.
mf1n1a06- mf1n2a06
Csabai István

Octave: alapokAz octave mint számológép:

Válasz elrejtése




octave:##> 2+2
ans = 4octave:##> 2+2;octave:##>+ - / * ()Hatványozás: ^ (Magyar billentyőzeten: Alt Gr 3)

Program futás megszalítása: Ctrl-CKilépés: quit
Help lapozás, kilépés: space, qFüggvények:

exp(1)
ans = 2.7183
1.2 * sin(40*pi/180 + log(2.4^2))
ans = 0.76618

Függvények

Konstansok
 Foglalt változónevek: utasítások, függvények
 Konstansok:

Imaginárius egység: i , j
octave:1> j*j
ans = -1
 Π : pi e ,természetes logaritmus alapja: eSkalár változók (számok)






Változók definiálása:
octave:##> deg = pi/180
deg =0.017453
Változók használata:
octave:##> 1.2 * sin(40*deg + log(2.4^2))
ans =0.76618
Elızı eredmény felhasználása:
octave:28> x = 2 * ans
x = 1.5324
Nem kell deklarálni a változókat mint pl. C++ -ban, minden
változó „double”
 Pl. C nyelven így nézne ki:
 double deg, pi;
pi = 3.1414;
deg = pi / 180.0;

A változók felülírhatóak
Vigyázat! A konstansok felülírhatóak:octave:13> ee = 2.7183
octave:14> log(e)ans = 1octave:15> e=132.6
e = 132.60
octave:16> log(e)ans = 4.8873

Sıt a függvények is felülírhatóak!!
octave:17> sin(pi)ans = 1.2246e-16
octave:18> sin=12.5
sin = 12.500
octave:19> sin(pi)error: expecting integer index, found 3.141593
error: Array::Array (const Array&, const
dim_vector&): dimension mismatchVáltozók törlése octave:22>

clear sinoctave:23> sin(pi)ans = 1.2246e-16
octave:24> log(e)ans = 4.8873
octave:25> clear alloctave:26> log(e)ans = 1
 Lehetıleg ne írjuk felül a clear utasítást!

Vektorok és mátrixok az
octave-ban Az octave a változókat

mátrixnak tekinti(adattípusok) Skalár értékek: 1x1 mátrix
 Vektorok: 1xN (vagy Nx1) mátrix
 Vektorok, mátrixok: más értelembenhasználjuk mint fizikában
1 és több indexes tömbök
 adattáblák


Fizikai vektorok és vektorterekVektorok• A vektorokkalmőveletek végezhetıek•A vektorok koordináta
rendszerbenábrázolhatóak számhármasokként

Vektor Fizika: 2 dimenziós, 3 dimenziós vektor
 Programok: 1 soros/oszlopos mátrix (tömb)
 N dimenziós vektor: adatsor

Vekotorok az octave-banSorvektor:octave:##> a=[1 4 5]
a = 1 4 5octave:##> b=[2,1,0]b = 2 1 0
 Oszlopvektor:octave:##> c=[4;7;10]
c =4710
 A vektorokon végzett mőveletekben jelent majd
különbséget!


Transzponálás
 Oszlop és sorvektor átalakítás,transzponálás: ’octave:50> a=[1 4 5]
a = 1 4 5octave:51> b=a’b =145

Vektorok: folytatás
 Kiegészítésoctave:##> a=[1 4 5]
a = 1 4 5octave:##> d=[a 6]d = 1 4 5 6
 Automatikus számolásoctave:##> e=2:6
e = 2 3 4 5 6octave:##> e=2:0.3:4
e = 2.0000 2.3000 2.6000 2.9000 3.2000 3.5000 3.8000

Speciális vektorok

octave:37> zeros(1,5)
ans = 0 0 0 0 0octave:38> ones(1,5)
ans = 1 1 1 1 1
octave:39> linspace(1,10,5)
ans = 1.0000
3.25005.50007.7500 10.0000
octave:40> logspace(1,9,5)
ans = 101000
10000010000000 1000000000

A vektor elemeioctave:##> a=[1:2:6 -1 0]
a = 1 3 5 -1 0
octave:##> a(3)ans = 5octave:##> a(3:5)
ans =5 -1 0
octave:##> a(1:2:5)
ans =
1 5 0
octave:45> p=[1:2:5]
p = 1 3 5octave:46> a(p)ans = 1 5 0Mőveletek vektorokkal
Szorzás skalárral
octave:##> a * 2
ans = 2 6 10 -2 0
 Elemenkénti mőveletek: .+, .-, .*, ./octave:##> b=[1 2 3 4 5];octave:##> a.*b
ans = 1 6 15 -4 0
octave:##> b .^ 2
ans = 1 4 9 16 25
octave:##> 2 .^ bans = 2 4 8 16 32
Mőveletek vektorokkal
 Függvények is hatnak elemenként

octave:##> angles=[0:pi/3:2*pi]
angles = 0 1.0472 2.0944 3.1416
4.1888 5.2360 6.2832
octave:##> y=sin(angles)
y = 0 0.8660 0.8660 0.0000 0.8660 -0.8660 -0.0000

Vektor mint adatsor
 Ábrázolásoctave:##> plot(angles,y)Vektor mint adatsor
octave:##> angles=linspace(0,2*pi,100);octave:##> y=sin(angles);octave:##> plot(angles, y);Számábrázolás


Tízes számrendszer:12.25 = 1 × 101 + 2 × 100 + 2 × 10−1 + 5 × 10−2

A digitális számítógép áramkörei két állapotúak:
van feszültség – nincs feszültség
10






8 bit = 1 byte : kettes számrendszerben 0-255 egész szám ábrázolható



0 0 0 0 1 0 0 1
76

5

4

3

2

1

= 0×27+0×26+0×25+0×24+1×23 +0×22+0×21+1×20 = 8+1 = 90



1 biten jelölhetjük az elıjelet, pl. 4 byte = 32 bit egész számok:-2147483648 ≤ x ≤ 2147483647
Egy lehetıség törtek ábrázolására: fixpontos ábrázolás

1 1 0 1 0 1 0 0 =1×23+1×22+0×21+1×20+0×2-1 +1×2-2+0×2-3+0×2-4=8+4+1+1/4=13.25

32

10-1-2-3-4

Lebegıpontos számok

Fixpontos számok hátrányaNem ábrázolhatók egyszerre nagyon nagy és nagyon kicsi számok pontosan
Bankároknak jó – tudósoknak nem„Tudományos” számábrázolás zsebszámológépen+ 0.299792458 E+09elıjel

mantissza

kitevı/karakterisztikaSzámítógép lebegıpontos számokelıjel(-1)s × f × 2e-b
mantissza
karakterisztika

32 bit esetén pl.:sef

3130-23

22-0

IEEE 754 szabvány
 32 bit: egyszerő pontosság: float

 64 bit: dupla pontosság: double(-1)s × f × 2e-b

Példa: 64 bit, b=1023, s:1,e:11,f:23 bit
0 01111111111 0000 (+még 48db 0) = +1 × 21023-1023 × 1.02 = 1.0
1 01111111111 0000 (+még 48db 0) = +1 × 21023-1023 × 1.02 = -1.0
0 01111111111 1000 (+még 48db 0) = +1 × 21023-1023 × 1.12 = 1.5
0 10000000000 0000 (+még 48db 0) = +1 × 21024-1023 × 1.02 = 2.0
0 10000000001 1010 (+még 48db 0) = +1 × 21025-1023 × 1.10102 = 6.5
Normalizált számok: akkor nem veszítünk értékes biteket, ha a mantissza teljesen „ki van töltve”
azaz a legnagyobb helyiértéken 1 áll: ezért vegyük ezt fix 1-nek, nem is kell eltárolni, csak amaradék számjegyeket
Nem normalizált (subnormal) számok: a legkisebb normalizált számoknál kisebb értékeketábrázolnak, egyre kisebb számokra egyre kisebb relatív pontossággal, hisz a nagyobb
helyiértékeken is lehet 0Egyszerő példa: 8 bit, b=1, s:1, e:3, f:4 bit
A legnagyobb szám:
0 111 1111 = +1 × 27-1 × 1.11112 = 64 × 1.9375 = 124.0(-1)s × f × 2e-b

A legkisebb normált pozitív szám:
0 001 0000 = +1 × 21-1 × 1.02 = 1 × 1.0 = 1.0
A legnagyobb nem normált szám:
0 000 1111 = +1 × 20 × 0.11112 = 0.9375
A legkisebb pozitív nem normált szám:
0 000 0001 = +1 × 20 × 0.00012 = 0.0625

Egyszerő példa, jobb felbontás: 8 bit, b=3, s:1, e:3, f:4 bit
A legnagyobb szám:
0 111 1111 = +1 × 27-3 × 1.11112 = 16 × 1.9375 = 31
A legkisebb normált pozitív szám:
0 001 0000 = +1 × 21-3 × 1.02 = 0.25 × 1.0 = 0.25
A legnagyobb nem normált szám:
0 000 1111 = +1 × 2-2 × 0.11112 = 0.234375
A legkisebb pozitív nem normált szám:
0 000 0001 = +1 × 2-2 × 0.00012 = 0.015625(-1)s × f × 2e-b

Lebegıpontos számok Csak véges értékek ábrázolhatóak

32 bit (float): 1.4×10−45 ≤ x ≤ 3.4×1038
64 bit (double): 4.9×10−324 ≤ x ≤ 1.8×10308
túlcsordulás, alulcsordulás

 Csak véges számú szám ábrázolható






véges a „felbontás”
32 bit: 6-7 tizedes jegy
64 bit: 15-16 tizedes jegy
kerekítési hiba

Gépi pontosság:
1c+εm = 1coctave:##> 1+1e-16
ans = 1(jelölés: gép által ábrázolt 1 ≡1c)float: εm =1.19209e-07
double: εm = 2.2204e-16

Számábrázolás: octave
A véges ábrázolás miatti kerekítési hiba
octave:##> 1 - 0.2 - 0.2 - 0.2 - 0.2 - 0.2
ans = 5.5511e-17

Túlcsordulás:octave:##> 1e308+1e308
ans = Inf

Végtelen: inf
0/0: nanSzámábrázolási pontosság: eps
octave:##> epseps = 2.2204e-16

Legnagyobb, és legkisebb szám amit a gép ábrázolni tud:octave:##> realmin, realmax
realmin = 2.2251e-308
realmax = 1.7977e+308

Hibák felerısödése: kivonás

Véges számábrázolás miatt:
xc = x(1 + ε x )Különbség hibája:
a = b − c ⇒ ac ≅ bc − cc ≅ b(1 + ε b ) − c(1 + ε c )acbc≅ 1+ εb − εcaaa
 Probléma, ha azonos nagyságrendő számokat vonunk ki,a relatív hibája nagy lesz :acbb≡ 1 + ε a ≅ 1 + (ε b − ε c ) ≅ 1 + max(| ε b |, | ε c |)aaabb ≈ c ⇒ nagy, tehát a relatív hiba nagy.
 MivelaKülönbségi hiba: példa
2ax + bx + c = 0
Hamegoldó-képlet:b 2 >> 4ac ⇒ b 2 − 4ac ≈ b

x1, 2 =− b ± b 2 − 4ac
2avagyis az elsı gyök pontatlan!

2Szorozzuk meg a számlálót és nevezıt − b m b − 4ac -vel!

x'1, 2 =− 2cb ± b 2 − 4acmatematikailag ekvivalens megoldó-képlet.

Ekkor, a fenti helyzetben az elsı gyök pontos lesz, viszont a második pontatlan.
Használjuk tehát az elı gyökhöz a 2. képletet, a második gyökhöz pedig az elsıt!
Megj.:
1. Ugyanezt a képletet kapjuk, ha 1/x-re írunk fel 2-od fokú egyenletet.
2. Programban használható praktikus változat:

3. További példa numerikus hiba stabilizálására

octave:##> a=1; b=1; c=1e-12;
octave:##> x1=(-b+sqrt(b*b-4*a*c))/2*ax1 = -9.99977878279878e-13
octave:##> x2=(-b-sqrt(b*b-4*a*c))/2*ax2 = -0.999999999999000
octave:##> xx1=-2*c/(b+sqrt(b*b-4*a*c))
xx1 = -1.00000000000100e-12
octave:##> xx2=-2*c/(b-sqrt(b*b-4*a*c))xx2 = -1.00002212220950
octave:##> a*x1*x1+b*x1+c
ans = 2.21217211215324e-17
octave:##> a*x2*x2+b*x2+c
ans = 2.21217201214839e-17
octave:##> a*xx1*xx1+b*xx1+c
ans = 0octave:##> a*xx2*xx2+b*xx2+c
ans = 2.21226998947887e-05

octave:##> a=1; b=100; c=1e-12;
octave:##> x1=(-b+sqrt(b*b-4*a*c))/2*ax1 = -7.10542735760100e-15
octave:##> x2=(-b-sqrt(b*b-4*a*c))/2*ax2 = -100
octave:##> xx1=-2*c/(b+sqrt(b*b-4*a*c))
xx1 = -1.00000000000000e-14
octave:##> xx2=-2*c/(b-sqrt(b*b-4*a*c))xx2 = -140.737488355328
octave:##> a*x1*x1+b*x1+c
ans = 2.89457264239900e-13
octave:##> a*x2*x2+b*x2+c
ans = 1.00000000000000e-12
octave:##> a*xx1*xx1+b*xx1+c
ans = 0octave:##> a*xx2*xx2+b*xx2+c
ans = 5733.29179303328

Olvasmány
 Stoyan G. Numerikus matematika

7-20. o.
 Stoyan G. MATLAB könyv,1-20.o., 28-38.o. és 373-376.o.
 P.J.G. Long: Octave Tutorial, 4-17. o.