Egy kicsit többet dolgoztam ezen, ezért azt hiszem, megpróbálkozom a saját kérdésemmel. Itt van megint a limaconunk.
Nézzük, hogy mivel kezdünk: egy $t$ időparaméterrel, amely egyenlő lépésekben fut a $$ intervallumon, az ívhossz mentén $t$ időpontban megtett $s$ kumulatív távolsággal, és a limacon $\gamma$ kartéziánus koordinátáival $t$ időpontban. A kérdésben ennyit állítottunk fel. Amit ehelyett akarunk, az egy ívhossz paraméter $s$, amely egyenlő lépésekben fut a $$ intervallumon, ahol $L$ a teljes ívhossz, valamint az $s$ időpontban $t(s)$ és a $\gamma (t(s))$ kartézi koordináták.
Az ívhossz mentén megtett $s$ kumulatív távolságot derivative
(File Exchange link) segítségével csináljuk újra, hogy ne veszítsünk mintákat.
x_t = derivative(x);y_t = derivative(y);s = cumtrapz( sqrt(x_t.^2 + y_t.^2 ) );
A Matlab interp1
függvényét fogjuk használni, hogy interpoláljuk az ívhossz mentén egyenlően elosztott $s_i$ lépéseknek megfelelő $t(s_i)$ időpontokat és $\gamma (t(s_i))$ koordinátákat. Ennek megfelelően a interp1
argumentumait a dokumentációjában megadott változónevekkel deklaráljuk. A X
vektor az eredeti $s_i$, azaz az ívhossz mentén $t_i$ időpontban megtett távolság. A V
mátrix olyan oszlopvektorokból áll, amelyek sorai $t_i$ (az eredeti időparaméterünk egyenlő léptékben), valamint a $\gamma (t_i)$ koordináták.
X = s.';V = ;
Interpolálni kell, hogy megtaláljuk a görbe mentén egyenlően elosztott ívhosszúságú lépéseknek megfelelő $t(s_i)$ időpontokat. Ezek az egyenlően elosztott lépések $s_0=0$-tól $s_N=L$-ig tartanak, ahol $L$ a teljes ívhossz.
L = s(end);s0 = s(1);N = length(s);Xq = linspace(s0,L,N); % equally spaced indices
Megállapíthatjuk, hogy s(N) == sum(diff(Xq))
, ahogyan annak lennie kell. A Matlab interp1
interpolációs függvényének többdimenziós darabonkénti lineáris interpolációs képességét használjuk arra, hogy megtaláljuk a $t(s_i)$ idő és a $\gamma (t(s_i))$ koordináták interpolált értékeit, amelyek megfelelnek a Xq
-ban megadott $s_i$ egyenletesen elosztott lépéseinek.
Vq = interp1(X,V,Xq);
A diff(Xq)
hívása azt mutatja, hogy állandó ívhosszúságú lépésekben haladunk a $\gamma$ mentén, míg a diff(Vq)
hívása azt mutatja, hogy az időlépések már nem egyenlőek (első oszlop). Az interpolációnk eredménye tehát a következő:
- ívhossz $s_i$ állandó lépésekben (
Xq
) - megfelelő időpontok $t_i$, már nem állandó lépésekben (
Vq
első oszlopa) - koordináták $\gamma(t(s))$ az ívhossz függvényében (
Vq
második és harmadik oszlopa)
A limacon $\gamma(t(s))$ ívhosszparaméterezése tehát kartéziánus koordinátákban xs
és ys
.
xs = Vq(:,2);ys = Vq(:,3);
Ezek a vektorok a $\gamma$ mentén mozgó részecske helyzetét adják meg $s$ függvényében, ahol $s$ 0.1058
lépésekben növekszik. Itt látható a $\gamma $ görbe két paraméterezése, nevezetesen a kék színű $\gamma (t)$ és a piros színű $\gamma (t(s))$.
Még egy kis munkát kell végeznem, ha periodikus megoldásokat akarok engedélyezni, mivel a jelenlegi Matlab-szkript általában nem teszi ezt lehetővé. Hogy ezt lássuk, csak nézzük meg a fenti $\gamma (t(s))$ utolsó és első mintája közötti távolságot piros színnel. Ha még egy 0.1058
egységnyi lépést haladnánk előre a limacon mentén, akkor nem érnénk olyan pontra, amit már meglátogattunk, pedig tudjuk, hogy a limaconok $2\pi$-periodikusak. Azt hiszem, ez alapvetően azt jelenti, hogy az $s$ lépésméretét a 0.1058
.
-tól eltérőnek kell választanunk.