Forum » Znanost in tehnologija » valavanje sferaste membrane -- > simulacija
valavanje sferaste membrane -- > simulacija
pro549 ::
Pozdravljeni,
mogoče bi mi vi lahko pomagali. Namreč sem se lotil simulirat valovanje na sferični membrani. Seveda prvo sem se lotil simulirati ravne membrane, kjer tudi deluje super s formulo:
U(i,j,k)=r*(U(i-1,j,k-1)+U(i+1,j,k-1)+U(i,j-1,k-1)+U(i,j+1,k-1))-U(i,j,k-2)+(2-4*r)*U(i,j,k-1);
pri čemer je i in j je točka na membrani, k pa je naslednjo stanje, r je hitrost širjenje valovanja, pa mora biti manjše kot 0.5.
recimo kos programa je tako če bo hotel kdo od vas programirat:
for k=3:M
U(end/2-2:end/2+2,2,2)=0.1*sin(2*pi*k/30);
for i=1:m
for j=1:n
if (D(i,j)==0)
U(i,j,3)=r*(U(i-1,j,2)+U(i+1,j,2)+U(i,j-1,2)+U(i,j+1,2))-U(i,j,1)+(2-4*r)*U(i,j,2);
end
end
end
end
OK vse lepo in prav, ampak jaz sem se lotil da bi naredil valovanje za sferično membrano (valovanje vode po sferi) pa sem prišel do take formule
U(i,j,k)=r/cos(theta(j))^2*(U(i-1,j,k-1)+U(i+1,j,k-1)+cos(theta(j))^2*(U(i,j-1,k-1)+U(i,j+1,k-1)))-U(i,j,k-2)+(2-2*r*(1/cos(theta(j))^2+1))*U(i,j,k-1);
i=phi, j=theta
delta phi = delta theta, tako da je prišla zgornja formula malo bolj poenostavljena in to pomeni da imamo 2 več i-jev kot j-jev
saj na začetku celo deluje ampak čez nekaj časa pa vse podvija (divergira). A bi znal kdo kaj pomagat, zakaj tako podivja?
mogoče bi mi vi lahko pomagali. Namreč sem se lotil simulirat valovanje na sferični membrani. Seveda prvo sem se lotil simulirati ravne membrane, kjer tudi deluje super s formulo:
U(i,j,k)=r*(U(i-1,j,k-1)+U(i+1,j,k-1)+U(i,j-1,k-1)+U(i,j+1,k-1))-U(i,j,k-2)+(2-4*r)*U(i,j,k-1);
pri čemer je i in j je točka na membrani, k pa je naslednjo stanje, r je hitrost širjenje valovanja, pa mora biti manjše kot 0.5.
recimo kos programa je tako če bo hotel kdo od vas programirat:
for k=3:M
U(end/2-2:end/2+2,2,2)=0.1*sin(2*pi*k/30);
for i=1:m
for j=1:n
if (D(i,j)==0)
U(i,j,3)=r*(U(i-1,j,2)+U(i+1,j,2)+U(i,j-1,2)+U(i,j+1,2))-U(i,j,1)+(2-4*r)*U(i,j,2);
end
end
end
end
OK vse lepo in prav, ampak jaz sem se lotil da bi naredil valovanje za sferično membrano (valovanje vode po sferi) pa sem prišel do take formule
U(i,j,k)=r/cos(theta(j))^2*(U(i-1,j,k-1)+U(i+1,j,k-1)+cos(theta(j))^2*(U(i,j-1,k-1)+U(i,j+1,k-1)))-U(i,j,k-2)+(2-2*r*(1/cos(theta(j))^2+1))*U(i,j,k-1);
i=phi, j=theta
delta phi = delta theta, tako da je prišla zgornja formula malo bolj poenostavljena in to pomeni da imamo 2 več i-jev kot j-jev
saj na začetku celo deluje ampak čez nekaj časa pa vse podvija (divergira). A bi znal kdo kaj pomagat, zakaj tako podivja?
Thomas ::
To je često pri fizikalnih simulacijah, da podivjajo. Stanje ki ga izračunaš, je malenkost narobe, potem se pa napaka amplificira ob vsakem izračunu.
Manši dt uporabljaš, kasneje podivja, pa več CPU rabiš.
Manši dt uporabljaš, kasneje podivja, pa več CPU rabiš.
OwcA ::
Poišči kje je napaka prevelika. Potem se pa lahko igraš s stvarmi kot je razvijanje vsega kar leze in gre v Taylorjevo vrsto (predvsem v upanju, da se kaj pokrajša in/ali izpostavi). Če tako ne gre, je, resda grda, rešitev, da strateško postaviš kak pogoj, ki vlovi očitno napačne rezultate. Pri tem si lahko pomagaš tudi s tem, da hraniš nekaj zadnjih rezultatov (ali pa kar vse in potem zaradi pridobljene hitrosti izvajanja uporabiš bolj fino delitev).
Otroška radovednost - gonilo napredka.
pro549 ::
dt -je že majhen (to je tisti r- ki vsebuje dt in hitrost valovajna istočasno),. Fora je v tem da ne amplificira linearno, saj so razmaki minimalni ampak iz enga delčka časa v drugi kr naenkrat podivja. Seveda sem poskrbel da na severu in jugu je ta membrana pripeta, tako da ne bi bilo nevarnostiza singularnost (1/cos(theta), theta je na severu pi/2 in na jugu -pi/2). saj če komu zanima mu pošljem celo kodo, ki je napisana v matlabu in bi se vi malo igrali. Celotno izpeljavo pa ne bi rad pisal pri čemer sem upošteval to formulo (d^2*u)/dt^2-c^2*(d^2*u/dx^2+....)=0.
Za (d^2*u)/dt^2 po teylorju (u(x,y,t-dt)-2u(x,y,t)+u(x,y,t+dt))/(deltat^2) ali pa (u(x,y,t-2*dt)-2u(x,y,t-dt)+u(x,y,t))/(deltat^2) kjer ssem iz tega izpeljal u(x,y,t) kjer sem imel pol shranjeno dva stanje pred tem.
Za (d^2*u)/dt^2 po teylorju (u(x,y,t-dt)-2u(x,y,t)+u(x,y,t+dt))/(deltat^2) ali pa (u(x,y,t-2*dt)-2u(x,y,t-dt)+u(x,y,t))/(deltat^2) kjer ssem iz tega izpeljal u(x,y,t) kjer sem imel pol shranjeno dva stanje pred tem.
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | Izdelava algoritmaOddelek: Znanost in tehnologija | 1543 (923) | Klemen86 |
» | HP g62 in tipkovnicaOddelek: Pomoč in nasveti | 717 (662) | OmegaM |
» | Python iskanje podvojenih vrednostiOddelek: Programiranje | 1488 (1201) | BlueRunner |
» | Računanje vrednosti iz tabeleOddelek: Programska oprema | 1643 (1509) | KoMit |
» | [Turbo Pascal] Pomoč...Oddelek: Programiranje | 1468 (1370) | Grey |