schnelles lösen linearer Gleichungssysteme
-
Hallo!
Für einen Algorithmus muss ich sehr oft folgendes LGS lösen:
X=ax+by+c Y=dx+ey+f
Das stellt eine affine Transformation oder sowas dar. Ich habe drei Punkte (X, Y) und drei Punkte (x, y) gegeben, also 6 Gleichungen, 6 Variablen, und muss aus diesen jetzt a,b,c,d,e,f berechnen. Wie stell ich das am schnellsten mit einem computer an? gibts da schnelle algos oder macht man es doch besser mit gauß-algo?
Gruß, Maxi
-
Für so kleine Sachen gibt es nicht wirklich ne fertige Theorie. Numeriker beschäftigen sich eher mit größeren Matrizen.
Im Prinzip kannst Du einfach den Gauß reinhacken. Aber vielleicht ist auch der schon zu kompliziert. Für so einfache Matrizen gibt's bestimmt fertige Formeln für die Inverse. Alternativ kannst Du auch die cramersche Regel benutzen, damit lassen sich solche LGS auch leicht und schnell lösen. Gerade dadurch, daß es 2x2 ist sind viele Berechnungen ja sehr sehr einfach.
-
stimmt, mir ist auch grad aufgefallen, dass es sich hierbei ja nicht um 1 LGS mit 6 Gleichungen handelt, sondern um 2LGS mit je 3 gleichungen, da kann man die determinante ja relativ schnell ausrechnen, mal sehen wie schnell ich bzw. mein rechner das hinbekommt
-
hab das mal mit der determinante durchgerechnet:
X1=x1a + y1b + c X2=x2a + y2b + c X3=x3a + y3b + c |x1 y1 1| Det=|x2 y2 1|=x1(y2-y3)+x2(y3-y1)+x3(y1-y2) |x3 y3 1| Da=X1(y2-y3)+X2(y3-y1)+X3(y1-y2) Db=x1(X2-X3)+x2(X3-X1)+x3(X1-X2) a=Da/D b=Db/D c=X1- a*x1 - b*y1
Das c rechne ich nicht mit der determinante aus, weil man da mehr rechnen müsste
Kann man das noch irgendwie für den pc verbessern? ich will so wenig wie möglich rechenschritte machen
-
Vielleicht spart es noch was invD = 1/D erst zu berechnen und dann zu schreiben:
a=DainvD;
b=DbinvD;aber so richtig viel dürfte das auch nicht mehr reißen.
-
eigentlich ist der code schon ziemlich kompakt.
wenn dir float-praezision reicht, koenntest du die parameter in vector-form bringen und sse nutzen um einige operationen zu sparen, aber am ende macht das auch nicht viel aus:xmm0= 0,x1,x2,x3
xmm1= 0,y2,y3,y1
xmm2= 0,y3,y1,y2xmm3= xmm1 - xmm2 // 0, (y2-y3), (y3-y1), (y1-y2)
xmm4= xmm3 * xmm0 // 0, x1*(y2-y3), x2*(y3-y1), x3*(y1-y2)usw...
-
na, mit dem sse system kenn ich mich nihc so auf, ich glaub das reicht so, wie ichs da gepostet hab, das geht eigentlich schon gut so