"Willian d'foe" <will@not.receive.mails> writes:
> For min egen morskabs skyld har jeg lavet en simulation af en 2d
> firkantet bil med to baghjul med kraftoverførsel og to drejelige
> forhjul uden kraft. Bilen er bare et rektangel med to tværstivere
> og et hjul i hvert hjørne. Som den er nu, så er stiverne meget stive
> fjedre. Jeg er imidlertid ikke intereseret i hverken en elastisk bil
> eller numerisk instabilitet, så jeg vil gerne forsøge mig med
> "constraints". Metoden hvor man angiver en afstand mellem to
> forbundne partikler, og hvis afstanden ikke er korrekt, så "ryster"
> man partiklerne til afstanden passer. Lidt simpelt beskrevet, men de
> der kan hjælpe mig kender det nok i forvejen.
Jeg er ikke sikker på at jeg har forstået dig rigtigt, mon ikke det
letteste er at tilføje en støddæmper til hver fjeder ? :)
Nå.. men her er en lille snak om constraints Du beskriver tilstanden
af din bil med en vektor x=(x1,x2...xn). Elementerne i denne vektor
angiver placeringen af hjul. x1 er x-koordinatern for højre
baghjul. x2 er y-koordinaten for højre baghjul etc. Nu tilføjer du
nogle constrainst. De kan skrives på følgende form
f1(x1,x2...xn) = 0
f2(x1,x2...xn) = 0
....
fm(x1,x2...xn) = 0
Eksempelvis kunne en constraint være x1 - x2 = 7. Dette ville svare
til
f1(x1,x2...xn) = x1 - x2 - 7
Lad starte med en teori for hvordan man optimerer en vektor x så den
kommer til at opfylder dine constraints. Det kan sikkert gøre på flere
måder. Så vidt jeg kan se kender du en metode hvor man ryster
koordinaterne på plads. Alternativ kan man sikkert bruge Newtons
metode.
http://www.library.cornell.edu/nr/cbookcpdf/c9-6.pdf
Hvis du vil have noget der er simplere at implementere, så kan du
bruge steepest descent til at minimere følgende funktion
h(x) = f1(x) * f1(x) + f2(x) * f2(x) + ... + fN(x) * fN(x)
http://www.library.cornell.edu/nr/cbookcpdf/bookcpdf/c10-3.pdf
Når du nu har fundet en værdi af vektoren x der opfylder dine
constraints, så kan du lede efter kræfterne i dit system. Du leder
altså efter en kraftvektor på følgende form.
F = (F1,F2... FN)
Her er pointen at elementet F1 svarer til koordinaten x1.. osv. Jeg
har ikke regnet det følgende efter i detalje, men der virker rigtigt,
når jeg bruger det på et simpelt modelsystem.
F = -grad U(x)
+ a1 grad f1(x)
+ a2 grad f2(x)
....
+ an grad fn(x)
Her angiver "grad", gradientent operatoren
http://mathworld.wolfram.com/Gradient.html
Konstanterne a1, a2 .. an er givet ved
a1 = (grad U(x) * grad f1(x))/(grad f1(x) * grad f1(x))
a2 = (grad U(x) * grad f2(x))/(grad f2(x) * grad f2(x))
.....
aN = (grad U(x) * grad fN(x))/(grad fN(x) * grad fN(x))
Her angiver * prikproduktet.
Hvis du virkelig vil have en ordentlig formalisme, der sikrer at du
ikke laver fejl, så kan du læse en bog om analytisk mekanik :) Her er
et tilfældigt link til lecture notes på nettet. De er måske lidt for
kompakte til at være brugbare.
http://fy.chalmers.se/~tfemc/MekanikF1/mekanikkompendium.pdf
--
Niels L Ellegaard
http://dirac.ruc.dk/~gnalle/