BME Építészmérnöki Kar, Építészeti Ábrázolás Tanszék.

CAAD és Építészinformatika, VBA programozás (Excel, AutoCAD)

Előadó: dr. Peredy József prof. em.

 

 

2. Feladat. A tárgyalóasztal-elrendezés javítása. 

Bármily kézenfekvő, hogy az ülőhelyeket az asztal kerülete mentén egyenletesen osszuk ki, a klasszikus matematikai analízis számára ez egyáltalán nem elemi feladat. Az ellipszis ívhosszát leíró integrálokat nem lehet az elemi függvényekkel zárt alakban kifejezni. Kialakult az ellptikus integrálok ill. az elliptikus függvények elmélete, ami külön tanulmányokat igényel és (elvi szépsége ellenére) számszerű eredmények eléréséhez nem ideális. A számítógépes megkőzelítésben azonban az egyenletes kiosztás megvalósításának módja ugyanolyan egyszerű és természetes, mint amilyen egyszerű és természetes magának az egyenletes kiosztásnak az igénye. Az informatikai kultúra kibontakozásának egyik legfontosabb hozadéka az emberi gondolkodás hatékonyságának növekedése, a „gondolkodás ökonómiája". Ez esetünkben abban jelentkezik, hogy néhány elemi alapelv segítségével a feladatok rendkívül széles körére tudunk megfelelő megoldást találni, így az ellipszis kerületének számítására is.

2.1 A rendez szubrutin. Az If utasítás. Ívhossz és érintő számítása véges elem módszerrel.

Bonyolult matematikai eszközökkel (pl. differenciál- és/vagy integrálegyenletekkel) leírható feladataink számítógépes megoldásánál gyakran alkalmazzuk a "véges elem módszert" mind a geometriai elrendezés, mind a tartószerkezettervezés, vagy éppen valamely épületfizikai elemzés stb. során. Ennek alagondolata a következő. Van egy, a maga egészében nehezen kezelhető feladatunk. Ennek a feladatnak az alkalmazási cél szempontjából kifogástalan (közelítő) megoldását kaphatjuk, ha azt sikerül nagyszámú (de nem végtelen sok), kis (de nem végtelenül kis) elemből összetenni úgy, hogy az egyes véges elemek esetében a feladat megoldása jól ismert, egyszerű, de sok egyszerű véges elem együtt mégis jellemzi az eredeti bonyolult feladatot. Az ellipszis ívhosszának számításánál az ívet rövid húrokból álló sokszögvonallal helyettesítjük. Az egyes húrok egyenesek, hosszuk a Pitagorasz-tétellel jólismert módon számítható, s ha ezeket az elemi hosszakat összeadjuk, kiadódik az eredeti görbe ívhossza a megkívánt pontossággal:

A képlet mindjárt az érintő hajlásszögének a közelítő értékét is megadja. A "megkívánt pontosság" kifejezés úgy értendő, hogy az általunk használt számítógépekkel és szoftverekkel a közelítő poligon megfelelő megválasztása (lásd később) mellett az ilyenfajta feladatoknál a műszaki cél által megkívánt pontosság általában elérhető. Az asztal kerülete mentén egyenlő távolságra, az asztalperem érintőjének megfelelő elforgatással történő ülőhelyelrendezést az alábbi szubrutinnal valósíthatjuk meg:

Sub rendez()

' rendez Macro

' Macro recorded 2/14/01 by Peredy Jozsef

' Keyboard Shortcut: Ctrl+r

' I.)

Dim a As Double, b As Double, c As Double, m As Double

Dim xi As Double, yi As Double, x0 As Double, y0 As Double

Dim xn As Double, yn As Double, arct As Double, arca As Double

Dim arcd As Double, arcl As Double, pi As Double

Dim fin As Double, fi As Double, fip As Double

Dim n As Integer, nfin As Integer, i As Integer

' II.)

m = Range("G2")

a = m * Range("D3")

b = m * Range("D4")

c = m * Range("D5")

n = Range("D6")

nfin = Range("B7")

x0 = Range("G4")

y0 = Range("G5")

pi = Atn(1) * 4

asztal a, b, x0, y0

' III.)

arct = 0

For i = 0 To nfin * 360 - 1

fi = -i * pi / (nfin * 180)

fin = -(i + 1) * pi / (nfin * 180)

xi = x0 + (a / 2 + 0.55 * c) * Sin(fi)

yi = y0 + (b / 2 + 0.55 * c) * Cos(fi)

xn = x0 + (a / 2 + 0.55 * c) * Sin(fin)

yn = y0 + (b / 2 + 0.55 * c) * Cos(fin)

arct = arct + Sqr((xn - xi) ^ 2 + (yn - yi) ^ 2)

Next i

' IV.)

Range("D7") = arct

' V.)

arcd = arct / n

arcl = arcd

arct = 0

For i = 0 To nfin * 360

fi = i * pi / (nfin * 180)

fin = (i + 1) * pi / (nfin * 180)

xi = x0 - (a / 2 + 0.55 * c) * Sin(fi)

yi = y0 + (b / 2 + 0.55 * c) * Cos(fi)

xn = x0 - (a / 2 + 0.55 * c) * Sin(fin)

yn = y0 + (b / 2 + 0.55 * c) * Cos(fin)

arct = arct + Sqr((xn - xi) ^ 2 + (yn - yi) ^ 2)

' VI.)

If arct > arcl Then

fip = Atn((yn - yi) / (xn - xi)) * 180 / pi

If xn - xi < 0 Then fip = fip + 180

fotel c, fip, xi, yi

arcl = arcl + arcd

End If

Next i

End Sub

A szubrutin a ' I.)' VI.) római számozással az áttekinthetőség érdekében részekre van osztva, és ezekhez kölön-külön fűzünk magyarázatot.

Ad I.) E részben találjuk a használt változók deklarálását. A deklaráló rész – jóllehet rendszerint a program elején áll – többnyire utólag, az érdemi részek megírása után készül, amikor már egyértelmű, hogy a feladat megoldásához milyen változókat kell használnunk.

Ad II.) Ez a rész a változók kezdő értékeit állítja be, túlnyomórészt ugyanúgy az Excel cellákból véve át azokat, mint ahogyan a targyalo szubrutin edetében már láttuk. Új változó az nfin, ami a kerület- és érintőszámításhoz használni kivánt felosztási finomságot szabja meg. Jelentése az, hogy egy fokot hány részre kívánunk felosztani a kellő pontosságú kerület és érintőszámításhoz. Ha értéke 1, akkor fokonként iktatunk be poligon-csúcspontot az ellipszis kerületére, azaz a teljes ellipszist egy 360 oldalú poligonnal közelítjük, ha pedig nfin =10, akkor tizedfokokkal, azaz 3600 oldalú poligonnal dolgozunk. A változók kezdeti beállításánál az utolsó tétel a pi, azaz p. Mivel tg(45˚) = tg(p/4) = 1, úgy számolhatjuk, hogy vesszük az 1-nek megfelelő arcus tangens négyszeresét. A VBA-ban az Atn függvény képezi az adott tangensértékhez tartozó radiánban értett szögértékeket, mindig -p/2 és +p/2 közötti eredményt adva.

Ad III.) Az asztal megrajzolása utáni programrész képezi az ellipszis kerületét. A kerületet az arct változóban állítja elő elő olymódon, hogy egy annyiszor lefutó ciklust indít, ahány oldala van a közelítő poligonnak, kiszámítja az i ciklusváltozó szerint éppen soron lévő poligon-oldal (ellipszishúr) hosszát, és ezt hozzáadja az arct változó már meglévő értékéhez. Az összegezésnek ez a módja a programokban általánosan használatos, de csak akkor lehetünk biztosak a helyes végeredményben, ha azt a változót, amibe elő kivánjuk állítani az összeget a ciklus indítása előtt (azon kívül) nullára állítjuk, kinullázzuk. A kinullázás a III) comment-et kovető sorban a beleösszegezés pedig a ciklusmag utolsó sorában történik.

Ad IV.) Az itt álló egyetlen sor kiírja a kiszámított kerületet az Excel munkalap egy cellájába, ahol az számunkra is látható formában meg tud jelenni.

Ad V.) Az itt kezdődő hátralévő programrész valósítja meg a székek egyenletes kiosztását az ívhossz mentén. Ennek stratégiája a következő. A teljes ellipszis ívhossza az arct változóban már megvan, miután a III.) alatti ciklus meghatározta. Ha n darab ülőhelyet kívánunk a tárgyalóasztal körül elhelyezni, a teljes ívhossz n-ed része lesz a két ülőhely közötti ivhossz arcd=arct/n. Kiindulunk a j=0 szögnek megfeleló ellipszispontból, s a fotelok középpontjait rendre az ettől az ívhossz mentén mért arcd, 2*arcd, 3*arcd,… n*arcd távolságra lévő ellipszispontokba helyezzük. Az arcl változót használjuk annak az alapponttól az ívhossz mentén mért mindenkori elhelyezési távolságnak a tárolására, ahova a következő fotelnak kerülnie kell. Az ívhosszat számító ciklus indítása előtt az arcl értékét be kell állítani arcd-re, mivel ide kerül az első fotel, és valahányszor elhelyeztünk egy ülőhelyet, értékét meg kell növelni arcd-vel, mert ennyivel van tovább a következő fotel helye az ellipszisív mentén. Az ívhossz folyamatos számítására ugyanazt az arct változót használjuk mint a III.) alatti részben, de természetesen újra ki kell nullázni. A ciklusmag első sorai végzik az ívhosszámítást, a III.) alatti ciklusban már használt módszerrel.

Ad VI.) Itt történik az ülőhelyek elhelyezése. Ülőhelyet ott helyezünk el, ahol az ellipszisív mentén folyamatosan (valójában igen kis, de végesen kis lépésekben) haladva a kiszámított arct ívhossz éppen túllépi a következő fotel helyét megszabó arcl értéket. (Az arct=arcl egyenlőség fennállása általában nem következhet be, többek között azért sem, mert a haladásunk nem teljesen folyamatos.) A fotel elhelyezése tehát az arct>arcl feltételhez van kötve. A VBA rendszerben az If … Then (Ha … Akkor) kulcsszavak feltételesen végrehajtandó utasítások kifejezésére szolgálnak. Az If és a Then között kell a feltételt kifejező egyenlőtlenségnek állnia (egyenlőségi feltételről csak egész értékű változók körében van értelme beszélni), és a Then után álló utasítások csak akkor hajtódnak végre, ha ez a feltétel igaz ( True logikai értékű). Két alakja van e feltételes szerkezetnek, attól függően, hogy a feltétel fennállása (igaz volta) esetén egy (esetleg egymástól : kettősponttal elválasztva egy sorban elférő néhány) utasítást kell-e végrehajtani, vagy pedig tőbbet. Az egy utasításos esetre a ' VI.) comment utáni harmadik sor mutat példát, itt a fip = fip + 180 értékadó utasítás csak az xn - xi < 0 feltétel igaz volta esetén hajtódik végre, de a következő sorban lévő szubrutinhívás végrehajtása már nem függ ettől a feltételtől. (E sor funkciójára mindjárt visszatérünk.) A "sokutasításos If" alakjára a ' VI.) comment utáni hat sor együtt a példa: ilyenkor a Then után nem állhat semmi a sor hátrelévő részében, viszont kell lennie a program további folyamán valahol egy End If sornak, s a feltétel érvénye a Then és az End If közötti valamennyi utasításra (ez a feltételes utasítás magja) vonatkozik. Esetünkben a feltételes utasítás magja az éppen soronlévő kis húrocska hajlásszógének kiszámításával kezdődik, mindjárt fokokba átszámolva (erre a fotel megfelelő elfordításához van szükség). Emlékezzünk azonban, hogy az arcus tangens függvény igen sokértékű, s a programnyelvekbe beépített megfelelő függvények ennek csak a "főágával" (azaz szögértékben kifejezve rendszerint csak -90˚ és +90˚ között) dolgoznak. Esetünkben viszont a tárgyalóasztalt körbe kell rakni fotelekkel, így a teljes 360˚ -os szögtartományra szükség van. Ezt oldja meg az utasításmag második sora. Programunk egyben arra is példa, hogy feltételes utasítások (és a velük sok szempontból rokon ciklusszerkezetek) tetszés szerint egymásba építhetők, de a belső szerkezet a külső határait persze nem lépheti át. A helyes elfordítási szög kiszámítása után elhelyezhetjük a soronlévő fotelt, és a következő fotel elhelyezéséhez átállíthatjuk az ezt vezérlő arcl változót.

2.2 Kísérletek, tanulságok. A közelítés pontossága, a gondolkodás ökonómiája.

A jelen feladat elején álló ábra úgy készült, hogy a megfelelő cellákban látható számértékek mellett lefuttattuk a rendez makrót, majd a középponti koordinátákat (G4:G5 cellák) megváltoztatva lefuttatttuk a targyalo makrót. A kétféle szempontú elrendezés közötti kűlönbség szemléletesen jelentkezik.

A rendez makró esetében olyan számítási módszereket alkalmaztunk, amelyeket többnyire közelítő módszereknek neveznek (az érintő hajlásszögét a megfelelő kis húr hajlásszögével, az ellipszisgörbe ívhosszát a beleírt igen sok oldalú húrpoligon oldalhosszainak összegével helyettesítettűk). A számítógépes munkánál igen gyakran fordul elő olyan helyzet, hogy kiszámíttatunk a géppel valamit, de ez nem egészen az amit "tulajdonképpen szeretnénk". Esetünkben "tulajdonképpen" az ellipszis "valódi" ívhosszaival szerettünk volna dolgozni, s e helyett használtuk a húrpoligont. De hát ez az eredeti, "naív" szándékunk eleve reménytelen volt, hiszen már a körív "valódi" hosszát sem tudhatjuk pontosan, mivel mindig ott van benne a p, ez a nem periodikus végtelen tört! A számítógépes módszerek csak ráirányítják a figyelmet az emberi megismerés olyan korlátaira, vagy inkább sajátosságaira, amelyek korábban is jelen voltak, csak legtöbbűnkben nem tudatosodtak. A jelen bekezdés elsö mondatában a "közelítő módszer" kifejezést azért használtuk bizonyos fenntartással, mert igazából nincs mivel szembeállítani. Pontos gondolatmenet létezik az absztrakt matematikában, de amint számszerűsíteni kell valamit, akár papirra számjegyekkel leírva, akár a számítógép véges sok bit-ből álló regisztereivel kifejezve, az igazi pontosság az egész számok (vagy, ami ugyanaz, a véges törtek) körére korlátozódik.

Jóllehet az abszolút pontosság olyan elméleti fogalom, amely a konkrét számításokban többnyire nem valósul meg, az eredmények rendszerint mégis jól használhatóak. Kisérletezzünk a felosztás finomságát megszabó nf érték változtatásával. A jelen fejezet elején álló ábrán egy kis táblázat mutatja, milyen eredményt kapunk a teljes ellipszis kerületének értékére attól függően, hogy a közelítő húrpoligont fokonkénti felosztással, vagy még finomabban, egy fokot még tovább nf részre osztva képezzük. Láthatjuk, hogy akár tizedfokokkal dolgozunk, akár ötvened fokokkal, az eredmény hat értékes jegyre megegyezik. Már a fokonkénti számítás is 1 miliméternél kevésbé tér el a legfinomabb felosztással adódó értéktől. Az ilyen egyszerű összevetések is érzékeltetik az eredmény műszaki szempontból való használhatóságát.

Természetesen az eredmények helyességének, pontosságának a kérdését ennél szabatosabb matematikai módszerekkel is lehet és szükséges vizsgálni. Törekedjünk az eredmény olyan becslésére, amely két számot ad meg, s a helyes,  pontos eredmény bizonyíthatóan e két érték közé esik. Esetünkben például biztos, hogy a negyedellipszis ívhossza kisebb mint a két féltengely összege, és nagyobb, mint a két féltengely alkotta derékszögű háromszőg átfogója.Ha ezt az ellenőrző becslést a tárgyalt feladatra alkalmazzuk, két dolgot kell figyelembe venni:

1.      feladatunk az ülőhelyek kiosztása volt, így a program az ülőhelyek középpontjain átmenő ellipszissel dolgozik, s a kiszámított kerületérték is erre vonatkozik (nem pedig az asztal kerületére);

2.      a mindenkori képenyőmérethez való igazodás érdekében a rajz nagyságát egy m tényezővel változtathatóvá tettük, ami a példa esetén m = 0.7 –re volt beállítva.

Mindezt számításba véve annak az ellipszisnek az a’ és b’ féltengelyei, amire a kiszámított (közelítő) kerületérték vonatkozik

a’ = (a / 2 + 0.55 * c) * m = 87.325 és b’ = (b / 2 + 0.55 * c)* m = 69.825.

Ezekkel számolva a két féltengely összegének négyszerese adja a kerület biztos felső korlátját kf = 628.6, és a két féltengely, mint befogók által alkotott derákszögű háromszög átfogójának négyszerese ka = 447.235 pedig az alsó korlátját. Láthatjuk, hogy

ka  <  k=495.23  <  kf ,

azaz a nyert számérték a durva, de biztos korlátok közé esik. Az ilyesfajta ellenőrzés a közelítő számítás rendszerében, vagy programjában lévő esetleges hibák felderítésére hasznos, az elvileg helyes eljárás közelítésének jóságát pedig a korábban már vizsgált, különböző számítási finomságú futtatások eredményeinek egybevetésével vizsgálhatjuk. A kapott eredmény realitásának gondos mérlegeléséről soha sem szabad megfeledkezni. Már viszonylag egyszerű feladatoknál (pl. görbe felületek felszínszámításánál) is előfordulhat, hogy első látásra kézenfekvőnek tűnő véges elem felosztás teljesen téves számeredményre vezet. Az építészmérnöki alkalmazásoknál az eredmények helyességéért végeredményben mindig az építészmérnök a felelős.