symulacja precesji dysku

0

Są jakieś algorytmy/metody symulacji wirujących ciał - jak precesja podpartego, czy swobodnego dysku, żyroskopu, itp.?

0

Zapomniałem dodać, że nie chodzi mi o numeryczne całkowanie równań Eulera, czy innych takich idealistycznych i hipotetycznych wzorów, lecz o wyliczanie realnych ciał...
np. stalowy dysk, który ma skończoną wytrzymałość jak i sprężystości.

0

Wszystko w fizyce liczy się „idealistycznie i hipotetycznie”, pytanie do jakego stopnia chcesz mieć to wyidealizowane.

0
Azarien napisał(a):

Wszystko w fizyce liczy się „idealistycznie i hipotetycznie”, pytanie do jakego stopnia chcesz mieć to wyidealizowane.

Np. do stopnia: 1e-12, bo na tyle precyzja double pozwala.. z lekkim zapasem.

0

Może tak wystarczy to robić:

zamiast solidnego ciała, jakim jest np. dysk, czy cokolwiek,
dzielę to na punkty o równych masach: m = M/N.

A to ma być jakość tam trwałe - sztywne, no więc wstawiam siły pomiędzy te fragmenty,
które zależą od przesunięcia względem... sąsiednich fragmentów - też punktowych mas.

Fi = suma -k*dr_ij;
gdzie j idzie po sąsiadach...

w sumie jest to chyba prostsze od symulacji typowego n-body z grawitacją,
bo tam mamy komplet sił: N(N-1)/2, czyli prawię N^2,
a tu tylko kilka sąsiednich wystarczy, więc to będzie problem rzędu N zaledwie.

0

W programach komercyjnych często korzysta z metody elementów skończonych, ale nie mam pojęcia jak trudna była by samodzielna średnio wydajna implementacja.
https://pl.wikipedia.org/wiki/Metoda_element%C3%B3w_sko%C5%84czonych
ps. Cieżko napisać konkretnie bo nie podałeś szczegółów wcześniej.

0
topik92 napisał(a):

W programach komercyjnych często korzysta z metody elementów skończonych, ale nie mam pojęcia jak trudna była by samodzielna średnio wydajna implementacja.
https://pl.wikipedia.org/wiki/Metoda_element%C3%B3w_sko%C5%84czonych
ps. Cieżko napisać konkretnie bo nie podałeś szczegółów wcześniej.

Właśnie nie wiem, czy do tego typu symulacji potrzeba się męczyć z równaniami cząstkowymi.

Tak na rzut okiem, wydaje mi się że tu wystarczą zwyczajne równania - te z Newtona,
czyli obliczamy serię zwyczajnych równań:
Fi = m ai,
po jakiejś tam sieci, która imituje ciało.

Np. weźmy problem precesji rozkręconego dysku, na który działa siła zewnętrzna: F = -mg.

Przecież tu wystarczy zastąpić ten dysk kilkoma masami i tyle... nawet dwie wystarczą!
m
| r - promień dysku
|-----------> w - i tak to sobie wiruje
| - nieważki pręt o elastyczności k.
m

Moment bezwładności: I = 2mr^2 = Mr^2...

Zaczepiamy to na końcu osi o zadanej długości ... no i obliczamy... wynik będzie przecież taki sam jak dla prawdziwego dysku, a może i nawet lepszy! :)

0

https://pl.wikipedia.org/wiki/Metoda_element%C3%B3w_sko%C5%84czonych
ps. Cieżko napisać konkretnie bo nie podałeś szczegółów wcześniej.

Tak patrzę sobie na to... no i nie wiem o co w tym biega.

Weźmy na przykład kawał płyty stalowej zawieszonej poziomo, czy też dowolnie, na jakimś zadanym... konturze.

No i po mi tu jakieś elementy?

Przecież wystarczy tę płytę podzielić zwyczajnie na N części - punktów o równej masie,
no i związać - połączyć te punkty... siłami sprężystości.

Najprostsza siatka kwadratowa da po 4 sąsiadów dla każdego punktu (pomijając obrzeże),
no i co to za problem wyliczyć co się z tym stanie po wpuszczeniu grawitacji: Fz = -mg?

Przecież to wygląda na banał...

0
  1. Na ile tych N-części chcesz podzielić płytę? Żeby było jak w realu musiałbyś dać N równe ilości wiązań sieci krystalicznej, tylko w takiej płycie ilość wiązań jest spora więc obliczania będą czasochłonne i trudne w realizacji itd, żeby temu zaradzić wymyślono dyskretyzację (jak ona działa dokładnie to nie mam pojęcia);

  2. Jeśli chcesz liczyć jak toto będzie się poruszać bez wnikania na jego wytrzymałość to każdy ruch jest składową ruchu obrotowego i postępowego. Ruch obrotowy ma odpowiedniki z ruchu postępowego np. moment masy - masa; moment pędu - pęd; moment siły - siła itd, równania będą analogiczne do zwykłych równań Newtona dla ruchu postępowego. Na końcu wystarczy połączyć rozwiązania dla obu ruchów, chociaż to takie proste może nie być, bo np wirująca piłka ma zakrzywiony tor ruchu.

  3. Jak chcesz liczyć oba naraz to musisz to jakoś połączyć, może rzeczywiście rozbić ciało na części składowe i połączyć siłami sprężystości, tylko na ile żeby rozwiązanie było dobre? Podejrzewam że lepszym rozwiązaniem byłoby po prostu zastosowanie prawa Hooka, super realistycznie nie będzie i w dodatku działa tylko do pewnych wartości naprężeń.

0
czaffik napisał(a):
  1. Na ile tych N-części chcesz podzielić płytę? Żeby było jak w realu musiałbyś dać N równe ilości wiązań sieci krystalicznej, tylko w takiej płycie ilość wiązań jest spora więc obliczania będą czasochłonne i trudne w realizacji itd, żeby temu zaradzić wymyślono dyskretyzację (jak ona działa dokładnie to nie mam pojęcia);

Pewnie wystarczy z milion punktów w przypadku powierzchni, czyli coś jak: 1000 x 1000.

  1. Jeśli chcesz liczyć jak toto będzie się poruszać bez wnikania na jego wytrzymałość to każdy ruch jest składową ruchu obrotowego i postępowego. Ruch obrotowy ma odpowiedniki z ruchu postępowego np. moment masy - masa; moment pędu - pęd; moment siły - siła itd, równania będą analogiczne do zwykłych równań Newtona dla ruchu postępowego. Na końcu wystarczy połączyć rozwiązania dla obu ruchów, chociaż to takie proste może nie być, bo np wirująca piłka ma zakrzywiony tor ruchu.

Nie ma potrzeby wprowadzać żadnych tych obrotowych pojęć:
moment pędu, moment siły, prędkość obrotowa, itp.... są pojęciami pomocniczymi - matematycznymi.

Można sobie to wyliczać w trakcie symulacji, ale tylko tak na boku - dla pokazania/wydrukowania.

W naturze i tak występuję jedynie te siły proste;
obrotowych sił nie ma w ogóle w naturze - to jest zawsze wynik działania wielu sił prostych.

Prędkość obrotowa jako wektor?
Nie istnieje żaden wektor 'w', który wystaje ze środka dysku - to jest pojęcie pomocne, a w ręcznych obliczankach,
natomiast w symulacji numerycznej jest to zupełnie zbyteczne.

  1. Jak chcesz liczyć oba naraz to musisz to jakoś połączyć, może rzeczywiście rozbić ciało na części składowe i połączyć siłami sprężystości, tylko na ile żeby rozwiązanie było dobre? Podejrzewam że lepszym rozwiązaniem byłoby po prostu zastosowanie prawa Hooka, super realistycznie nie będzie i w dodatku działa tylko do pewnych wartości naprężeń.

F = -kx;
to jest przecież prawo Hooka...
można to sobie uogólnić, np. uwzględniając kolejne wyrazy, typy: F = -kx + Ax^2 + Bx^3 + ...+ b/x + c/x^2 + ...

0

W naturze i tak występuję jedynie te siły proste;
obrotowych sił nie ma w ogóle w naturze - to jest zawsze wynik działania wielu sił prostych.

Oczywiście, wszystko jest wynikiem działania między miliardami różnych cząsteczek czterech podstawowych sił, przy czym my najbardziej odczuwamy działanie elektromagnetyzmu i grawitacji.

Obliczanie zachowań obiektów poprzez symulowanie oddziaływania miliardów cząsteczek tymi prostymi siłami jest po prostu nierealne, dlatego wprowadza się różne takie matematyczne twory i przybliżenia.

Twój podział na 1000 na 1000 punktów też można pod takie coś spokojnie podpiąć bo się będzie różnić od prawdy i to sporo (jakieś kilka miliardów cząsteczek i oddziaływań, prawdziwych liczb nie znam, ale na pewno są duże), wobec tego twoje przybliżenia sprowadzają się do tego samego co symulacje ruchu obrotowego poprzez wprowadzanie momentu masy i pędu itd, może nawet te matematyczne twory są dokładniejsze, zależy czy da się całkę wyliczyć.

0

Twój podział na 1000 na 1000 punktów też można pod takie coś spokojnie podpiąć bo się będzie różnić od prawdy i to sporo (jakieś kilka miliardów cząsteczek i oddziaływań, prawdziwych liczb nie znam, ale na pewno są duże), wobec tego twoje przybliżenia sprowadzają się do tego samego co symulacje ruchu obrotowego poprzez wprowadzanie momentu masy i pędu itd, może nawet te matematyczne twory są dokładniejsze, zależy czy da się całkę wyliczyć.

Nie sądzę żeby błąd był tu proporcjonalny do liczby cząstek.

Tam wyjdzie prawdopodobnie zależność błędu w stylu: er(N) = exp(-N),
co dla N = milion jest w zasadzie takim samym zerem jak i dla N = 10^24 - liczba atomów w płycie...

Jedynie w przypadku bardzo małych N, np. 4, 8, błąd byłoby duży...

0

A ostatecznie można nawet to symulować wprost na sieciach atomów:
wystarczy przeskalować sobie np. trylion razy tę płytę,
a wtedy jej rozmiary będą rzędu nanometrów zamiast metrów... kilka milionów komórek;
no i wynik będzie praktycznie taki sam jak dla metrowej płyty, bo to od skali aż tak bardzo nie zależy.

0

Nie wiem jakiego rzędu może wyjść błąd, może i nie jest proporcjonalny do liczby cząstek, ale grupa cząstek połączonych jakimiś tam siłami (oczywiście oddziaływania elektromagnetyczne, jakieś oddziaływania dipolowe czy co innego) to chyba nie to samo co mniejsza grupa cząstek połączonych jakąś wypadkową siłą sprężystości. Możesz jakoś spróbować wyliczyć tą siłę i robić jak napisałeś, ale nie wiem co ci z tego wyjdzie.

Druga sprawa to milion cząstek to też całkiem sporo jak na symulację, chyba nie jest to symulacja czasu rzeczywistego?

0
czaffik napisał(a):

Nie wiem jakiego rzędu może wyjść błąd, może i nie jest proporcjonalny do liczby cząstek, ale grupa cząstek połączonych jakimiś tam siłami (oczywiście oddziaływania elektromagnetyczne, jakieś oddziaływania dipolowe czy co innego) to chyba nie to samo co mniejsza grupa cząstek połączonych jakąś wypadkową siłą sprężystości. Możesz jakoś spróbować wyliczyć tą siłę i robić jak napisałeś, ale nie wiem co ci z tego wyjdzie.

To perfekt wyjdzie już dla sił typu F = -k dr.

Wystarczy sprawdzić jak się wylicza np. prędkość dźwięku w ciałach:

c^2 = Ey/ro

np. dla stali jest Ey = 200GPa, oraz gęstość około: ro = 7000kg/m^3

zatem prędkość dźwięku w stali wynosi:
c_stal = sqrt(200e9 / 7e3) = 5300 m/s

Woda:
gęstość ro = 1000 kg/m^3, Ey = 2.2GPa; (wsp. ściśliwości);
i stąd prędkość dźwięku w wodzie:
c_woda = sqrt(2.2e9/1000) = 1480 m/s

Druga sprawa to milion cząstek to też całkiem sporo jak na symulację, chyba nie jest to symulacja czasu rzeczywistego?

W przypadku uginanej płyty wystarczy kilka iteracji aby to wyliczyć... co trwałoby kilka sekund.
Tylko że z takich obliczeń wyszłoby nieustanne drganie - falowanie płyty, zamiast statycznego ugięcia.

Aby otrzymać statyczny wynik należałoby wprowadzić tłumie - straty energii...

0

Albo się mylę ale wydaje mi się że mówisz o prawie Hooke'a a ono jest dobre dla małych naprężeń, dla większych zaczyna coś niecoś zawodzić.

0

Albo się mylę ale wydaje mi się że mówisz o prawie Hooke'a a ono jest dobre dla małych naprężeń, dla większych zaczyna coś niecoś zawodzić.

No bo o takich tu mowa.
A. płyta stalowa zawieszona jakoś tam w grawitacji, zacznie pękać przy naprężeniach kilku MPa;
zatem oblicz sobie jaką wielkość musiałaby mieć ta płyta aby pękła.

  • wirujące dyski - precesja, itp.? Tu siły są wręcz zerowe!
    sprawdź to - oblicz: dla jakich obrotów rozerwałby się wirujący dysk stalowy?

Ale nawet w przypadku ekstremalnych sytuacji nadal nie ma z tym problemu:
wystarczy zadać limit siły, i sprawdzać to podczas obliczeń.

No i w przypadku przekroczenia tego limitu - co robimy?
Wtedy ta siła znika po prostu, bowiem więzy pękają, czyli kasujesz element wiążący, no i można liczyć to dalej -
obserwować jak to będzie pękać dalej, no i jak strzępy z tego ciała rozlecą się finalnie.

0

No to proponowałem prawo Hooke'a + liczenie momentów sił dla ruchu obrotowego, byłoby szybciej i lepiej niż dzielenie na NxN punktów i stosowanie między nimi siły sprężystości analogicznej do prawa Hooke'a, bo w ten sposób i tak nie dostaniesz czegoś bardziej realistycznego, może nawet będzie gorzej...

0
czaffik napisał(a):

No to proponowałem prawo Hooke'a + liczenie momentów sił dla ruchu obrotowego, byłoby szybciej i lepiej niż dzielenie na NxN punktów i stosowanie między nimi siły sprężystości analogicznej do prawa Hooke'a, bo w ten sposób i tak nie dostaniesz czegoś bardziej realistycznego, może nawet będzie gorzej...

Wątpię w to.
Raczej znacznie lepiej będzie, gdy ograniczymy się tylko do prostych sił pomiędzy elementami.

Te pojęcia obrotowe są tylko wtórne - dobre w ręcznych obliczeniach;

Gdybyś chciał symulować wirujący dysk w oparciu o te zmienne kątowe:
osie obrotu, momenty siły, bezwładności, prędkości kątowe, momenty pędu, itd.
wówczas automatycznie musisz założyć bryły doskonale sztywne.

Zatem taka symulacja byłaby już niewiele warta - mało realistyczna, a i ograniczona w zastosowaniu...
nawet stalowej płyty z tego nie wyliczysz... :)

0

Zgadzam się, że pojęcia obrotowe do podejścia ze "sprężynkami" są zbędne.
A z drugiej strony, o ile się nie pomyliłem w szacowaniu, to np. dla miękkiego metalu o module Younga 100 GPa i gęstości 10000 kg/m3 przy siatce 1 cm (wszystko dla równego rachunku), trzeba będzie co najmniej kilkadziesiąt tysięcy kroków symulacji na sekundę, żeby nie było wzmacniania błędów.

0

A z drugiej strony, o ile się nie pomyliłem w szacowaniu, to np. dla miękkiego metalu o module Younga 100 GPa i gęstości 10000 kg/m3 przy siatce 1 cm (wszystko dla równego rachunku), trzeba będzie co najmniej kilkadziesiąt tysięcy kroków symulacji na sekundę, żeby nie było wzmacniania błędów.

A to chyba zależy mocno od metody, której użyjesz do rozwiązywania rr.
W tej najprostszej metodzie Eulera z pewnością wyleciałbyś w kosmos po kilku krokach;
no ale z metodami konserwatywnymi - tak z samej natury (symplektycznymi),
jak np. metoda Eulera-Cromera, Leap-Frog, Velocity-Verlet, itp. byłoby pewnie OK.
https://en.wikipedia.org/wiki/Semi-implicit_Euler_method

Metody wyższego rzędu, jak np. RK4, byłby pewnie znacznie lepsze, bo tu można stosować wielokrotnie większy krok czasowy - z tysiąc razy!
No, a metoda symplektyczna rzędu 6, lub 8... to już w ogóle byłby kosmos - pewnie z 5 iteracji i gotowe.

0

Szacowałem dla prostej metody Eulera i właściwie to powinno być kilka milionów kroków na sekundę (wcześniej źle użyłem modułu Younga).

0
zz napisał(a):

Szacowałem dla prostej metody Eulera i właściwie to powinno być kilka milionów kroków na sekundę (wcześniej źle użyłem modułu Younga).

No to pewnie że błędy byłby astronomiczne.

Metoda Cromera ma identyczny nakład obliczeń, ale nie rozjeżdża się.

Ja bym zastosował minimum metodę 2-go rzędu, czyli VV lub Leap-Frog.
LF jest chyba szybsza, bo wymaga tylko jednego wyliczania sił na krok, na VV dwóch.

Ewentualnie standardowa RK4 powinna być super,
bo ta metoda ma bardzo mały błąd energii.. w zasadzie jest niemal symplektyczna - stąd pewnie jej popularność.

W wersji wielowymiarowej, i dla równań II-rzędu - jak te Newtona, tak to wygląda - w mojej wersji:

// y - tablica ciał - węzłów, a - przyspieszenia
void RK4()
{
// TBody *ys, *yi; // tablice pomocnicze - trzeba to wcześniej alokować...

 h = dt; // krok czasowy
 h2 = h*f_half;

// r1 = r; v1 = v;
force(a,y,nB); // a1 = a(x1, v1, 0)
copy(yi, y); // kopia ciał, nB sztuk

// r2 = r + v1h2; v2 = v + a1h2;
for(int i = 0; i < nB; i++)
{
yi[i].r.addm(y[i].v, h2); // y += vh2
yi[i].v.addm(a[i], h2); // v += a
h2

     addm(ys[i].r, y[i].v, yi[i].v, 2); // v1 + 2v2
     ys[i].v = a[i]; // a1
  }

 force(a, yi, nB);

// r3 = r + v2h2; v3 = v + a2h2;
for(int i = 0; i < nB; i++)
{
addm(yi[i].r, y[i].r, yi[i].v, h2);
addm(yi[i].v, y[i].v, a[i], h2);

     ys[i].r.addm(yi[i].v, 2); //  2v3
     ys[i].v.addm(a[i],    2); // 2a2
  }

 force(a, yi, nB);

// r4 = r + v3h; v4 = v + a3h;
for(int i = 0; i < nB; i++)
{
addm(yi[i].r, y[i].r, yi[i].v, h);
addm(yi[i].v, y[i].v, a[i], h);

     ys[i].r.add(yi[i].v); //  v4
     ys[i].v.addm(a[i], 2); // 2a3
  }

 force(a, yi, nB);

 for(int i = 0; i < nB; i++)
  {
     ys[i].v.add(a[i]); // a4
  }

  //  r += (h/6)*(v1 + 2*v2 + 2*v3 + v4);
  //  v += (h/6)*(a1 + 2*a2 + 2*a3 + a4);
  addmp(y, ys, nB, h/6);

}

dość proste...

1 użytkowników online, w tym zalogowanych: 0, gości: 1