Építész-informatika 1 |
Függvényábrázolás metszéspontkeresés makróval |
IT alkalmazások |
Egy csarnok metszete a következő harmadfokú függvénnyel írható le:
– ahol b a fél fesztáv (6,00 m),
– h a gerincmagasság (7,00 m).
Egy lehetséges megoldás |↷|
Ábrázoljuk a csarnok keresztmetszetét, illetve az azt metsző függvényt.
Mivel a függvény szimmetrikus, érdemes páros számú (2n) szakaszra osztani – n legyen 10.
A felosztáshoz érdemes egy i segédváltozót alkalmazni, amely az egyes osztáspontok sorszámát jelzi –n-től +n-ig (-10 ≤ i ≤ +10).
Az egyes pontok x koordinátáját az i/n·b képlettel kapjuk meg.
Keressük meg a két függvény metszéspontját az itt látható algoritmusnak megfelelő programmal, az intervallum 10 000 részre osztásával.
Válasszuk a Fejlesztőeszközök ⇄ Developer menüben a Kód ⇄ Code csoportból a Visual Basic lehetőséget, majd a megjelenő ablak bal oldali panelében kattintsunk a VBAProject (Fájlnév) részén jobb egérgombbal, és válasszuk az Insert ⇨ Module parancsot.
♦ Ha a szalagmenüben nem látható a Fejlesztőeszközök ⇄ Developer menü, akkor a Fájl ⇄ File menü Beállítások ⇄ Options parancsára megjelenő panel Menüszalag testreszabása ⇄ Customize Ribbon lapján a jelölőnégyzetben jelöljük be, hogy látható legyen.
Definiáljuk a h és b paramétereket mint globális változókat, illetve az f(x) és g(x) függvényeket.
' [D1] globális változók definiálása: Dim h, b As Double ' [F1] f(x) függvény definiálása: Function f(x As Double) Let f = h / 4 * (2 + (1 - Abs(x) * 2 / b) ^ 3 + (1 - Abs(x) * 2 / b)) End Function ' [F2] g(x) függvény definiálása: Function g(x As Double) Let g = Sqr(b ^ 2 / 6 + (x + h / 6) ^ 2) End Function
A [D1] definíciók után (a függvények definíciója elé) szúrjuk be az új szubrutint.
Sub linker() ' két függvény metszéspontjának lineáris keresése ' [D2] függvények paramétereként átadandó változó definiálása: Dim x As Double ' [V1] változók értékének átvétele a táblázatból: Application.Goto Reference:="xe" Let xe = ActiveCell.Value ' « intervallum eleje Application.Goto Reference:="xv" Let xv = ActiveCell.Value ' « intervallum vége Application.Goto Reference:="n" Let n = ActiveCell.Value ' « intervallum-osztáspontok száma Application.Goto Reference:="h" Let h = ActiveCell.Value ' « függvény „h” paramétere Application.Goto Reference:="b" Let b = ActiveCell.Value ' « függvény „b” paramétere End Sub
Az End Sub parancs elé szúrjuk be azokat az értékadásokat, melyek segítségével megtörténhet majd a metszéspont keresése.
' [V2] változók kezdeti értékének számítása: Let dx = (xv - xe) / n ' « keresési osztásköz számítása Let x = xe ' « keresési kezdőpont felvétele Let i = 0 ' « segédváltozó a csomópontok számlálásához Let e = Sgn(f(x) - g(x)) ' « függvények helyzete az intervallum elején
Az End Sub parancs elé szúrjuk be a metszéspont keresését szolgáló ciklust.
' [L1] metszéspont keresése Do While i < n And e * (f(x) - g(x)) > 0 Let i = i + 1 ' « segédváltozó léptetése Let x = xe + i * dx ' « vizsgálat helyének léptetése Loop ' « új [L1] ciklus indítása
Az End Sub parancs elé szúrjuk be a programunk eredményét a táblázatba visszaíró programrészt.
' [RE] eredmény kiíratása üzenetként illetve a táblázatba:
Application.Goto Reference:="dx"
ActiveCell.FormulaR1C1 = dx
If e * (f(x) - g(x)) <= 0 Then
Application.Goto Reference:="mpx"
ActiveCell.FormulaR1C1 = x
Else: MsgBox ("Nincs metszéspont az intervallumban," & _
Chr(10) & "vagy dx = " & dx & " nem elegendően sűrű lépésköz.")
Application.Goto Reference:="mpx"
ActiveCell.FormulaR1C1 = "0"
End If
A program indítása többféleképp történhet.
A program jelen formájában addig fut, amíg meg nem történik az átmetszés, vagyis amíg már nem az eredetileg fölül lévő függvény van fölül. Elvileg előfordulhat, hogy éppen olyan pontot vizsgálunk, ahol a két függvény értéke egyenlő, és ebben az esetben a metszéspont pontos helyét kapjuk eredményül. Sokkal valószínűbb azonban, hogy túllépünk a metszésponton, és ilyenkor csak annyit tudhatunk biztosan, hogy a valódi átmetszés távolsága kisebb, mint a dx osztásköz. (Ha például az n lépésszámot 10-re állítjuk, dx osztásköz 0,6 m lesz, miáltal az átmetszés mpx koordinátájaként -3,0 m adódik – a valós „hiba” tehát ~0,36 m.)
BME Morfológia és Geometriai Modellezés Tanszék