Egy kicsit többet dolgoztam ezen, ezért azt hiszem, megpróbálkozom a saját kérdésemmel. Itt van megint a limaconunk.

a limacon $\gamma(t)$

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))$.

két paraméterezé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.

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.