Quadriken  3d Ellipsoid

Prof. Dr. Dörte Haftendorn: Mathematik mit MuPAD 4, Juni 07    Update 5.07.07

Web:  https://mathe.web.leuphana.de             www.mathematik-verstehen.de ######################################################

Rückwärts aufgestellt, siehe Datei Konstruktion-rückwärts

p:=matrix([x,y,z]):pt:=linalg::transpose(p)

math

quadrik:=matrix([[7*x^2 - 4*x*y - 2*x*z - 70*x + 7*y^2 - 2*y*z + 38*y + 4*z^2 + 28*z + 202]])

math

quadrikp:=plot::Implicit3d(quadrik[1],x=-2..7,y=-5..0,z=-7..0,FillColor=[0,1,0,0.8], Scaling=Constrained):

plot(quadrikp)

MuPAD graphics

A  und a passend aufstellen

A:=matrix([[7,-2,-1],[-2,7,-1],[-1,-1,4]]);

a:=matrix([-70,+38,28]): at:=linalg::transpose(a);

d:=202;

math

math

math

expand(pt*A*p+at*p+d);  //Probe, ob man A,a und d richtig hat

%-quadrik

math

math

hier muss 0 herauskommen

Hauptachtsentransformation

E3:=matrix([[1,0,0],[0,1,0],[0,0,1]])

math

evli:=linalg::eigenvectors(A) //Probe, was MuPAD liefert

math

Eigenwerte und Eigenvektoren

ew1 :=evli[1][1];  ew2 :=evli[2][1]; ew3 :=evli[3][1];

ev1:=evli[1][3][1];

ev2:=evli[2][3][1];

ev3:=evli[3][3][1];

math

math

math

math

math

math

ev1n:=linalg::normalize(ev1):

ev2n:=linalg::normalize(ev2):

ev3n:=linalg::normalize(ev3):

P:=ev1n.ev2n.ev3n: Pt:=linalg::transpose(P);

math

Vektorschreibweise für die Abbildung image  und die 

Quadrikgleichungen, die sich durch Einsetzen ergeben:

imagebzw. in 3D

quastrich:=Simplify(pt*Pt*A*P*p+at*P*p+d)

math

quastrichp:=plot::Implicit3d(quastrich[1],x=-5..0,y=-5..4, z=-7..-2,FillColor=[1,1,0,1]):

plot(quastrichp /*,Op, tp */, Scaling=Constrained):

MuPAD graphics

quastrich

math

Die Arbeitsweise ist dieselbe wie bei der Herstellung der Scheitelform einer Parabel.

Hier durch Hinsehen:

xterm:=hold(6*(x+5/3*sqrt(3))^2);expand(xterm);

yterm:=hold(3*(y+2/3*sqrt(6))^2);expand(yterm);

zterm:=hold(9*(z+3*sqrt(2))^2);expand(zterm);

math

math

math

math

math

math

Also

quastrichK:=xterm+yterm+zterm-18   //-220+202

math

quastrich-expand(quastrichK)

math

hier muss 0 herauskommen

Letzter Teil der Hauptachsentransformation ist die Translation t

t:=matrix([5/3*sqrt(3), 2/3*sqrt(6),3*sqrt(2)]);

tt:=linalg::transpose(t):

math

image also image Das ergibt:

quaH:=Simplify(expand((pt-tt)*Pt*A*P*(p-t)+at*P*(p-t)))+202;

quadrikH:=ew1*x^2+ew2*y^2+ew3*z^2-18

math

math

Angabe der Gleichung in der üblichen Form:

hold(x^2/3+y^2/6+z^2/2=1)

math

quadrikHp:=plot::Implicit3d(quadrikH,x=-2..2,y=-3..3, z=-2..2,

Scaling=Constrained):

plot(%)

MuPAD graphics

Bestimmung des ursprünglichen Mittelpunktes:

image nun in 3D

m:=Simplify(P*(-t))

math

Dieses ist der alte Mittelpunkt.

 

Bestimmung des Urbildes des rechten Hauptscheitels:

image

Mit ev1 rechts ist hier der normierte 1. Eigenvektor gemeint. Alles jetzt in 3D

r:=sqrt(3): // Halbachse in (späterer) x-Richtung

rur:=r*ev1n+m;

rurstrich:=Pt*rur;

math

math

mp:=plot::Point3d(m,PointSize=2, PointColor=[0,1,0]):

Op:=plot::Point3d([0,0,0], PointSize=2, PointColor=[1,0,0]):

rurp:=plot::Point3d(rur, PointSize=2, PointColor=[0,1,1]):

rursp:=plot::Point3d(rurstrich, PointSize=2, PointColor=[1,0.5,0]):

rp:=plot::Point3d([r,0,0],PointSize=2, PointColor=[0,0,1]):

ev1urp:=plot::Arrow3d(m,m+3*ev1):

ev2urp:=plot::Arrow3d(m,m+3*ev2):

ev3urp:=plot::Arrow3d(m,m+3*ev3):

tp:=plot::Arrow3d(-t,[0,0,0],LineColor=[1,0,0]):

plot(quadrikp,mp,Op,rurp,tp,

      ev1urp,ev2urp,ev3urp,PointSize=2,Scaling=Constrained);

MuPAD graphics

Test ob es eine Drehung allein oder gefolgt von Spiegelung ist. det=1 reine Drehung

linalg::det(Pt)

math

plot(quadrikp,quastrichp, quadrikHp,mp,Op,tp,rp,rurp,rursp,

      ev1urp,ev2urp,ev3urp,Axes=Origin,Scaling=Constrained)

MuPAD graphics

####################################################

Weitere Untersuchungen,

die Abbildung wird von Pt geleistet

Pt

math

Suche nach der Drehachse, sie muss die Eigenrichtung der Drehmatrix sein.

evliP:=linalg::eigenvectors(Pt)

math

 

float(evliP)

math

Wie erwartet ist nur ein Eigenwert reell und zwar ist er 1.

Drehachsenrichtung:

dreh:=evliP[1][3][1]

math

Die Idee, dass die Normale auf der Ebene durch 0, M und M' die Drehachse sei, ist falsch:

mtt:=linalg::crossProduct(-t,m); float(mtt)

math

math

Obiger Vektor stimmt nicht mit den Normalenvektor überein.

drehp:=plot::Arrow3d(5*dreh, LineColor=[1,0,1])

math

Einzeichnen der Drehachse:

plot(quadrikp,quastrichp, quadrikHp,mp,Op,tp,rp,rurp,rursp,

      ev1urp,ev2urp,ev3urp,drehp,Axes=Origin,Scaling=Constrained)

MuPAD graphics

Die besondere Herausfordung, diese Drehung animiert zu gestalten, habe ich noch

nicht umgesetzt.

Zunächst muss ich herausbekommen, in welchen Ebenen sich die  Punkte jeweils bewegen.

Hessesche Normalenform:

float(linalg::scalarProduct( (p-m),dreh)=0);

float(linalg::scalarProduct( (p+t),dreh)=0)

math

math

Hier sieht man, dass tatsächlich m und mstrich=-t in dieser Ebene liegen.

Wo durchstößt die Drehachse diese Ebene?

Dieser Durchstoßpunkt muss das k-fache des Drehachsenvektors sein. )

1.303225373^2*k - 0.1109881895^2*k + 1.0^2*k + 6.050403504 = 0.0;

solve(%)

math

math

delete k:

Der Durchstoßpunkt ist also

k:= -2.252504773: dm:=float(k*dreh)

math

Bestimmung des Drehwinkels

m-dm, -t-dm, linalg::scalarProduct(m-dm,-t-dm)

math

 

cosi:=linalg::scalarProduct(m-dm,-t-dm)/       sqrt(linalg::scalarProduct(m-dm,m-dm)*

linalg::scalarProduct(-t-dm,-t-dm))

math

 

float(arccos(cosi))

math

################################################################

Das mache ich jetzt zur Probe auch für den rechten Hauptscheitel

rurs:=rurstrich:

float(linalg::scalarProduct( (p-rur),dreh)=0);

float(linalg::scalarProduct( (p-rurs),dreh)=0)

math

math

Hier sieht man, dass tatsächlich rur und rurstrich=rurs in derselben Ebene liegen.

Wo durchstößt die Drehachse diese Ebene?

Dieser Durchstoßpunkt muss das k-fache des Drehachsenvektors sein. )

delete kk:

1.303225373^2*kk - 0.1109881895^2*kk + 1.0^2*kk +6.242640687 = 0.0;

solve(%)

math

math

Der Durchstoßpunkt ist also

kk:= -2.324072756: rm:=float(kk*dreh)

math

 

rur-rm, rurs-rm, linalg::scalarProduct(rur-rm,rurs-rm)

math

 

cosi:=linalg::scalarProduct(rur-rm,rurs-rm)/

       sqrt(linalg::scalarProduct(rur-rm,rur-rm)*

       linalg::scalarProduct(rurs-rm,rurs-rm))

math

 

wradm:=float(arccos(cosi));

wgrdm:=float(wradm/PI*180);

math

math

 

Das sind dieselben Werte wie für m und mstrich

wradm;

wgrdm;

math

math

Damit handelt es sich also um eine Drehung um 125,75.. Grad.