Nick Janson wrote:
>> Men jeg undrede mig over den perfekte lavpasvirkning der er i
>> 'luften' alene, i 1D versionen. Man kan også se 'ripples' i 2D, når
>> man slår an med en skarp puls.
>
> Et fjedersystem som beskrevet vil altid være low pass. Spørgsmålet er
> så hvor skarp grænsen er og hvor den ligger.
> Du har et vidst tidsskridt h og sampler dit system deri. Hvis du har
> frekvenser med periodelængder under h/2 så forsvinder de.
Det virker som om grænsen er ideelt skarp, og at grænsefrekvensen flytter
sig nedad jo længere man kommer fra kilden. Hvordan forholder det sig med
rigtig lyd i luft? Er der en tilsvarende grænsefrekvens der er afhængig af
afstanden?
> X og y hastighed? Jeg ville have troet du lod partiklerne svinge op
> og ned i plnet og ikke i planet. Da jeg legede dem denne slags, da
> svingede partiklerne kun langs planets normalvektor. Det er også
> sådan det gøres på det link jeg sendte sidst. Hvad er x-y-hastigheden?
Hm, ja det er egentlig noget vrøvl at kalde dem x og y hastighed, kan jeg
godt se. Jeg har jo kun én position til hver partikel, så de svinger kun i
én retning. Jeg lægger jo begge hastighederne til samme position. Nu har jeg
lavet en funktion der kun bruger 2 arrays. Det virker også, men jeg har lidt
problemer med at mine vægge 'opsuger' noget energi fra bølgen, så man ikke
kan tegne et smalt rør og sende en bølge igennem. Det var vist egentlig
derfor jeg oprindelig lavede x og y 'hastigheder', for så kunne jeg lave
lodrette og vandrette vægge der virkede rigtigt. Men det burde nu også være
muligt med den anden model, det må der lige leges lidt mere med.
> Hvis man ønsker at se på trykket over tid, så vil man med helt simpel
> integration (explicit euler) sige tryk(t+h)=tryk(t)+h*tryk'(t), hvor
> tryk'(t) er hastigheden af trykændringen til tiden t. du vil også sige
> tryk'(t+h) = tryk'(t) + h*tryk''(t). Trykændringen ændrer sig altså
> også. Med fjedersystemer, som jeg gjorde det, så er trykket
> partiklens højde over eller under planet. Ændringen i tryk er så dens
> hastighed langs planets normalvektor og ændringen i ændring af tryk
> er partiklens acceleration som er forskel i højde mellem partikel og
> nabopartikel ganget en konstant (fjederkonstanten) divideret med
> partiklens masse.
> Hvis man forestiller sig et gitter, i et plan, af partikler som er
> forbundet til deres naboer med fjedre og du trækker en partikel op
> fra planet, så vil den hive sine naboer med og de hiver deres etc.
> Bemærk at partikler kun bevæger sig normalt til planet og ikke i
> planet.
Ja, det må være det jeg har lavet nu. Hastigheden laver jeg ved at lægge de
4 nabopositioner sammen og dele med 4, og så trække positionen fra, for at
få en samlet fjederkraft fra de 4 nabopunkter.
v[x, y] += ((p[x - 1, y] + p[x + 1, y] + p[x, y - 1] + p[x, y + 1])/4 - p[x,
y]);
Og positionen lægger jeg blot hastigheden til.
p[x, y] += v[x, y];
> Din metode virker lidt adskildt den matematiske beskrivelse, hvor man
> jo opskriver en tilstandsvektor og så stepper i tiden. Jeg tror du
> vil få vanskeligt ved at udvide den med bedre integrationsmetoden.
> Overvej evt at beskrive partiklerne som en vektor med position og
> hastighed (begge dele i 1D) samt masse. Beskriv få fjedrene som
> skalarer der er fjederkonstanterne. Du kan så implementere
> forskellige integrationsmetoder helt efter bogen.
> det simple eksempel er stadig explicit euler (findes der en mere
> simpel?) hvor du siger
> system(t+h) = system(t)+h*system'(t)
> Hvis dit system er vektoren
> system = [pos0 vel0 pos1 vel1 pos2 vel2 ... posn veln]^T
> så er den afledte
> system' =[vel0 f0/m0 vel1 f1/m1 vel2 f2/m2 ... veln fn/mn]^T
> f0 er alle krafterne på partikel 0 som afhænger af dens og dens
> naboers positioner samt fjederkonstanterne for nabofjedrene.
> Kraften på p0 fra p1 (som er en nabo) er så
> f01 = (p0.pos-p1.pos-hvilelængde)*fjederkonstant
> Du summerer alle krafter for alle partikler og har derefter den
> afledte systemvektor og kan steppe.
>
> Det er, så vidt jeg kan se, en korrekt beskrivelse af systemet.
Lyder meget som det jeg har nu, bortset fra at jeg har sparet
fjederkonstanterne og partikelmasserne. Men de svarer vel til at jeg delte
med min 'wavespeed' før.
>> "wavespeed" er er 2 som udgangspunkt. Hvis jeg gør den større,
>> udbreder bølgerne sig langsommere. Og hvis den bliver ret meget
>> under 2 går det hele i sving.
>
> Svingningerne er netop et udtryk for numerisk ustabilitet som simple
> integrationsmetoder generelt vil opleve.
Hm, denne integrationsmetode, er det blot det at man ganger med en
fjederkonstant eller en partikelmasse, så man kun får overført en del af
fjederkraften eller hastigheden for hvert tidsskridt?
> Hvis jeg skal slynge et gæt ud, relateret til mine egne partikler, så
> er problemet måske at nok sætter du hastigheden til det samme som
> sidste simulerede partikel, men det tager jo tid for den derefter at
> komme også flytte sig. Du har en partikel med positionen 10 og
> hastigheden 5. Naboen (kanten) får så også hastigheden 5 men har
> stadig en eller anden position (hvad er den egentlig) som eksempelvis
> er 0. I næste skridt vil kanten nok have samme fart som naboen, men
> ikke samme position og dermed påvirker den stadig...?
Det lyder sandsynligt. Det virker som om det netop er forskellen mellem to
tidsskridt der reflekteres. Den forskel er mindre jo lavere frekvensen er,
så derfor reflekteres høje frekvenser mest. En stor, blød bølge absorberes
næsten perfekt.
Hm, jeg føler mig lidt handicappet omkring alle de matematiske begreber og
måder at skrive det på. Har ikke rigtig 'forstand' på matematik på det plan.
Kan bedre fatte nogle linier kode, haha.
>> Jeg har tidligere lavet det samme i VB6, skulle lige hilse og sige
>> at det kører en DEL bedre i C#!
>
> Kender det. Jeg kører også en del bedre i C#
Fedt, så kan vi jo udveksle kode.
Jeg kører med den gratis C# 2005
Express.
--
Ulrik Smed
Aarhus, Denmark