Hello
Akadt egy kis fuggvenyabrazolasos gondom, s ebben szeretnek segitseget kerni.
Van egy chart, amire ra kellene illeszteni egy fuggvenyt, lehetoleg minel pontosabban.
Az alapot sikerult megcsinalni Bezier gorbevel, de bizonyos tartomanyokban nem teljesen passzol a dolog.
* Az eredeti: http://x-plane.hu/temp/L410/model/index.html (csak Bezier gorbes megoldas)
* A kicsit hekkelt megoldas: http://x-plane.hu/temp/L410/model/index_hack.html
* Az eredeti "lelke": http://x-plane.hu/temp/L410/model/engine.orig.js
* A hekkelt "lelke": http://x-plane.hu/temp/L410/model/engine.js
Ez egy L410-es hajtomuvenek homerseklete (y tengely) a magassag (x tengely) es sebesseg fuggvenyeben - a sebesseget a zold csuszkaval lehet allitani, ugy vandorol a piros gorbe.
Az eredeti megoldas problemaja: alsobb sebessegtartomanyban passzol a gorbe, de ahogy megyunk felfele, ugy csuszik el - ha pedig a nagyobb sebessegre illesztem a gorbet, akkor alacsonyban maszik el.
A hekkelt megoldasnal az a problema, hogy hekkelt :) Plusz az egyes valtasoknal, ahol a hekket alkalmaztam (100, 200, 300km/h), erthetoen ugrik egyet a gorbe, igy megeshet az az allapot, hogy ahogy emelkedik a gep adott sebesseggel, csokkennie kene az ITT-nek, de mikor a valtas van, felugrik hirtelen es ismet csokken.
Ezt szeretnem kikuszobolni. Erzem, hogy relativ egyszeru a megoldas, de napok ota nem tudom megoldani. Valami olyasmire gondoltam, hogy magassabb sebessegtartomanyban csak a "felso" reszet hasznalni a Bezier gorbenek, ezzel kvazi kiegyenesitve - s igy talan kozelebb kerul a tervhez.
Vannak egyaltalan az ilyen gorbe-illesztesre altalanos megoldasok?
Koszi!
- 7672 megtekintés
Hozzászólások
Itt most kiszamolsz egyes ertekeket a parameterek alapjan, es azokat kotod ossze?
hasznalj valami interpolaciot (pl Lagrange)
- A hozzászóláshoz be kell jelentkezni
Tulkepp igen, es utana "belenyulok", hogy ha egyik parameter nagyobb mint adott ertek, akkor X-el megnovelem.
Koszi, megnezem az interpolaciot.
- A hozzászóláshoz be kell jelentkezni
Vannak egyaltalan az ilyen gorbe-illesztesre altalanos megoldasok?
Nincsenek.
Gondolom a helyzeted jól jellemezhető az alábbival: vannak adatpontjaid (tudod, hogy bizonyos paraméterek esetén milyen értéknek kell kijönnie, mert pl. valaki ténylegesen megmérte), és vannak elméleti elvárásaid (pl. hogy folytonos legyen a kapott függvény, vagy hogy egyes részeken monoton legyen, stb.) Esetleg van valamilyen elméleti modelled, amiből kijön valami képlet is.
Szeretnél egy olyan, könnyen számolható képletet, ami teljesíti az elméleti elvárásokat, és az ismert adatpontoknál azt adja vissza, ami meg van adva.
Ez nem-triviális feladat (az elméleti elvárásokból nem lesz feltétlenül egyértelmű, hogy két lehetőség közül melyik jobb, illetve az elméleti elvárásokban önellentmondások is lehetnek), nem lesz egy "kanonikus" módszer, ami mindig működni fog.
Aszerint, hogy jobban szeretnél az elméleti elvárásokhoz alkalmazkodni (esetleg van valami elméleti modell, amiből kijön valamilyen képlet) akkor függvényt illesztésről szokás beszélni (ekkor az elméleti megfontolásokból van egy függvényed, aminek vannak paraméterei, és megkeresed a paramétereknek azon értéit, amire a leginkább visszakapod az ismert pontokat), vagy ha sok ismert pontod van, és inkább azokhoz akarsz ragaszkodni, és nem elméleti megfontolásokhoz, akkor szokás interpolációnak hívni az eljárást. A kettő lényegében ugyan azt csinálja, de kissé más felfogásban.
Függvény illesztés esetén, ha összetettebb a függvény (lényegében, ha nem-lineáris), akkor tapasztalatom szerint gnuplot függvény-illesztése hasznos lehet, de fontos figyelmeztetés, hogy minél nemlineárisabb a függvény, annál inkább "megadott kezdő-paraméterek javítása" és nem "függvényillesztés" módon fog viselkedni. Tehát fontos lesz, hogy előre kb. pontosan megtippeld a fittelendő paraméterek értékeit.
Interpoláció esetén, ha határozott elvárásaid vannak a függvény folytonosságáról, ill. hogy deriváltjai hogyan viselkedjenek (hanyadik derivált létezését, folytonosságát követeled meg), akkor lesznek "kanonikus megoldások" (tehát fogsz találni matematikai tételekkel alátámasztott eljárásokat, hogy így vagy úgy érdemes csinálni), de kérdés, hogy a függvény ill. deriváltjainak viselkedésére kirótt feltételekben meg tudod-e fogalmazni, hogy milyen viselkedést vársz el az eredménytől.
- A hozzászóláshoz be kell jelentkezni
>Vannak egyaltalan az ilyen gorbe-illesztesre altalanos megoldasok?
>
>Nincsenek.
De vannak. Nézz utána. Angolul "curve fitting"-nek hivják. Másik amire kereshetsz az a "regression".
Egyik legelterjedtebb a legkisebb négyzetek módszere. Ennek lényege a következő. Van valahány mintád ("alap pontod"). Illetve van egy függvényed valahány paraméterrel. Az algoritmus a paramétereket keresi tehát ezek lesznek a "változók". Definiálsz egy "hiba függvényt" ami úgy néz ki, hogy minden X értékhez kiszámolod a függvény értékét, és képzed a függvényértékek meg a mintapontok különbségeinek négyzetösszgét. Ez a "hiba függvény" az amit minimalizálni kell.
Függvény minimalizálás meg már nem olyan nehéz lehet pl. gradiens módszerrel. De ha elég egyszerű az alapfüggvényed alakja (pl. szimpla polinom) akkor akár egzakt módon fel is írhatod hogy a deriváltja nulla, és megoldod.
Lehetne írni még oldalakon keresztül de vannak róla jó könyvek meg cikkek. Ha kérdésed van akkor írj - mostanában sokat foglalkoztam ezzel.
- A hozzászóláshoz be kell jelentkezni
Koszi, azt hiszem ezt a "hiba fuggvenyes" dolgot sikerult megalkotnom (vagyis valami hasonlot) "onhibamon" kivul :)
Az egyes ertekeknel tudtam mekkora hibat kell a fuggvenybe csempeszni, hogy illeszkedjen. Igy vegulis ezt a hibat interpolaltam az ismert pontok kozt.
http://x-plane.hu/temp/L410/model/
http://x-plane.hu/temp/L410/model/engine.js
A fekete es zold csuszkakkal lehet jatszani. A megoldas nem tudom mennyire szep, de mukodik. Remelem C++-ba atirva nem fog sok eroforrast zabalni.
- A hozzászóláshoz be kell jelentkezni
Amit csinalsz, az nem 1 hanem tobbdimenzios fuggveny illesztes.
A hekkelessel pedig nincs gond, ez egy bonyolult fuggveny, bonyolult problemara. A lenyeg, hogy mukodjon es ugy viselkedjen ahogy szeretned.
De nem nagyon ertem, hogy mit varsz el tole...
En valami olyasmit csinalnek, hogy bepotyogok parszaz adatpontot a gorbebol, es megprobalnak megfittelni egy ketvaltozos, parparameteres fuggvennyel (ugye ket input van? bar ot csuszkat latok, de mintha csak egy csinalna valamit, es van masik valtozo, amin alapjan kirajzolsz egy gorbet).
Alacsony fokszamu polinomok jok szoktak lenni a legtobb problemara, de ha jol latom van egy tores a fuggvenyben, oda be kell rakni egy lepcsofuggvenyt mindenkepp.
y= f(x,v) = Sum_ij p_ij * x^i* v^j
es egy fittelessel meg kell keresni az (y_d, x_d,v_d) adatvektorokra jol illeszkedo p_ij-t.
Egy negyzetes minimalizalas:
min_{p_ij} sum ( y_d - f(x_d, v_d) )^2
megadja neked a p_ij -ket
Valahogy bele kell pakolni egy lepcsofuggvenyt is, ami leginkabb azt jelenti, hogy a nem-konstans reszeket probalod mefittelni, es ezt megpatkolod kesobb a szaturalodassal.
Szoval en valami ilyesmit csinalnek... remelem segit.
- A hozzászóláshoz be kell jelentkezni
Egyetértek! Kell egy lépcső!
Egy adott sebesség mellett ránézésre ez egy két részből álló görbe, aminek mindkét része nagyon jól közelíthető egy parabolával. Plusz úgy látom hogy az a zöld csúszka egyáltalán nincs hatással az egyik részének alakjára, csak azt befolyásolja hogy hol legyen vége az egyiknek és hol kezdőjön a másik.
A többi szín jelentése sajnos nem igazán világos. De valami ilyesminek tűnik első ránézésre:
y1(x) = a1*x*x + b1*x + c1
y2(x) = a2*x*x + b2*x + c2
y3(x) = a3*x + b3
f(x) = y1(y) ha x < y3(x), és y2(x) egyébként
Ahol az x érték neked a sebesség. De ettől biztosan bonyolultabb, csak nem látom hogy a többi változó mit csinál.
- A hozzászóláshoz be kell jelentkezni
Megneztem a Lagrange interpolaciot, a gnuplot-ot, illetve megprobaltam felfogni amit irtatok ugy altalaban :)
Vegul a Lagrange interpolacio mellett dontottem. Mivel alapbol egy Bezier gorbevel operalok, igy annak a veg- es kontrollpontjait valtoztatom az interpolacioval.
Azert valasztottam ezt a megoldast, mert a gorbet ezen felul kesobb egy ujabb valtozo bevezetesevel is transzformalni kell: a meredekseg, a gorbulet es az y tengelyen valo eltolas is valtozik. Azt pedig a legkonnyebben igy tudom megcsinalni. A ketto kozti atmenet pedig szinten egy interpolacio eredmenye lesz.
A lepcsofuggvenyre nincs szuksegem, a torest eleg egyszeruen egy
if (ITT>735){ITT=735}
-el oldom meg :)
Koszi mindenkinek, nem mondom, hogy nem feltem, mikor ebbe belefogtam, de megerte, sokat tanultam belole :)
(Vicces mennyire nem erdekelt a suliban ez, mostmeg murvara elvezem :D)
--
x-plane :: hu
- A hozzászóláshoz be kell jelentkezni
A lagrange interpolációval az a baj, hogy sok alappont esetén nem sima a függvény amit kapsz. N alappont esetén a lagrange interpolációs polinom legfeljebb N-1 fokú. Viszont ha van 100 alappontod akkor 99 fokú polinomot kaphatsz ami már elég gáz. Minden alapponton át fog menni, de valószínűleg egyáltalán nem fog hasonlítani az alakja a közelíteni kívánt valódi függvényhez.
Az a legjobb, ha magát a problémát elemzed! Először megvizsgálod egy diagramon a mintákat, mindenféle függvény megrajzolása nélkül. Megpróbálsz ráérezni arra, hogy kb. milyen görbére illeszkednek. Például, olyan mintha exponenciálisan nőne, akkor érdemes felírni egy paraméteres exponenciális függvényt, és megnézni hogy van-e olyan paraméterezése ami kis hibával illeszkedik a mintákra. Ha ez nem jön be, akkor próbálkozhatsz valami mással. Ha valamennyire már ismert a probléma akkor könnyű dolgod van. Pl. ha egy kondenzátor kisüléséről vannak feszültség adataid, akkor lehet feltételezni hogy logaritmikus lesz a görbe amit hasznánod kell stb.
A lényeg, hogy szerezz információt magáról a problémáról mielőtt ész nélkül mindenféle függvényeket próbálsz meg ráhúzni. Nem az a regresszió a jó amelyik minden alappontra illeszkedik. Hiszen N darab pontot mindig nulla hibával lehet közelíteni egy töröttvonalalal (vagy N dimenzió esetén egy szimplex-szel).
Akkor a jó a regresszió, ha minél kevesebb számú paraméterrel minél pontosabb közelítést találsz. Tehát kicsi a hiba, de emellett "sima" és minél kevésbé összetett a függvény.
Sok sikert! :-)
- A hozzászóláshoz be kell jelentkezni
+1
- A hozzászóláshoz be kell jelentkezni
subs
- A hozzászóláshoz be kell jelentkezni
[feliratkozás]
- A hozzászóláshoz be kell jelentkezni
A Lagrange csak akkor lesz jó, ha az adatsor "jól illeszkedő", a gyakorlatban ez csak ritkán teljesül és néha igan rondán viselkedik.
Próbáld meg a spline-t interpolációt. Kicsit számolós. Mi CNC-knél és robotoknál sikeresen használjuk.
- A hozzászóláshoz be kell jelentkezni