MATLAB < Matlab < Mathe-Software < Mathe < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 21:16 Mi 27.04.2005 | Autor: | kaoote |
jo... also.. wie fange ich am besten an?
ju.. also, ich denke es können mir eh nur diejenigen helfen die matlab haben, und deshalb hier zwei M-Files.
das erste M-File:
%M-File von Dreieck1
%Dreieck wird im Gegenuhrzeigersinn gedreht.
%u ist die Anzahl der Dreiecke die er machen soll. :) oder Iterationen
% DrehMatrix in Abhängigkeit von a
% Seite des Dreiecks in Abhängigkeit von s
axis equal
[mm] c=sqrt(s^2-(s/2)^2);
[/mm]
b=a*pi/180; % Umrechnung in Bogenmass
m1=[cos(b) -sin(b);sin(b) cos(b)];
L1(:,:,1)=[s/2;-1/3*c]; % Punkt B
L2(:,:,1)=[0;2/3*c]; % Punkt C
L3(:,:,1)=[-s/2;-1/3*c]; % Punkt A
for i=1:u
L1(:,:,i+1)=m1*L1(:,:,i)*1/(2*sin(150*pi/180-b));
L2(:,:,i+1)=m1*L2(:,:,i)*1/(2*sin(150*pi/180-b));
L3(:,:,i+1)=m1*L3(:,:,i)*1/(2*sin(150*pi/180-b));
hold on
line([L1(1,1,i);L2(1,1,i)],[L1(2,1,i);L2(2,1,i)])
line([L2(1,1,i);L3(1,1,i)],[L2(2,1,i);L3(2,1,i)])
line([L3(1,1,i);L1(1,1,i)],[L3(2,1,i);L1(2,1,i)])
end
also das dort mal so reinkopieren in ein M-file und dann mal zeichnen lassen...
und das ganze hier noch für ein quadrat:
% DrehMatrix in Abhängigkeit von a
% Alle Vier punkte in Abhängigkeit von x
% u ist die Anzahl der Quadrate die er machen soll
axis equal
b=a*pi/180;
m=[cos(b) -sin(b);sin(b) cos(b)];
L1(:,:,1)=[x;x];
L2(:,:,1)=[-x;x];
L3(:,:,1)=[-x;-x];
L4(:,:,1)=[x;-x];
for i=1:u
L1(:,:,i+1)=m*L1(:,:,i)*1/(sin(b)+cos(b));
L2(:,:,i+1)=m*L2(:,:,i)*1/(sin(b)+cos(b);
L3(:,:,i+1)=m*L3(:,:,i)*1/(sin(b)+cos(a));
L4(:,:,i+1)=m*L4(:,:,i)*1/(sin(b)+cos(b));
hold on
line([L1(1,1,i);L2(1,1,i)],[L1(2,1,i);L2(2,1,i)])
line([L2(1,1,i);L3(1,1,i)],[L2(2,1,i);L3(2,1,i)])
line([L3(1,1,i);L4(1,1,i)],[L3(2,1,i);L4(2,1,i)])
line([L4(1,1,i);L1(1,1,i)],[L4(2,1,i);L1(2,1,i)])
end
und jetzt noch für ein 5-eck
% M-File von 5-Eck 1
% 5-Eck wird im Uhrzeigersinn gedreht.
%u ist die Anzahl der Quadrate die er machen soll. :)
% DrehMatrix in Abhängigkeit von a
% s ist die Strecke vom Mittelpunkt zu einem beliebigen Punkt, des 5-ecks
axis equal
b=a*pi/180;
m1=[cos(b) -sin(b);sin(b) cos(b)];
L1(:,:,1)=[s*sin(36*pi/180);-s*sin(54*pi/180)];
L2(:,:,1)=[cos(72*pi/180) -sin(72*pi/180);sin(72*pi/180) cos(72*pi/180)]*L1;
L3(:,:,1)=[cos(72*pi/180) -sin(72*pi/180);sin(72*pi/180) cos(72*pi/180)]*L2;
L4(:,:,1)=[cos(72*pi/180) -sin(72*pi/180);sin(72*pi/180) cos(72*pi/180)]*L3;
L5(:,:,1)=[cos(72*pi/180) -sin(72*pi/180);sin(72*pi/180) cos(72*pi/180)]*L4;
for i=1:u
[mm] L1(:,:,i+1)=m1*L1(:,:,i)*(5^0.5+1)/(4*sin(b+54*pi/180));
[/mm]
[mm] L2(:,:,i+1)=m1*L2(:,:,i)*(5^0.5+1)/(4*sin(b+54*pi/180));
[/mm]
[mm] L3(:,:,i+1)=m1*L3(:,:,i)*(5^0.5+1)/(4*sin(b+54*pi/180));
[/mm]
[mm] L4(:,:,i+1)=m1*L4(:,:,i)*(5^0.5+1)/(4*sin(b+54*pi/180));
[/mm]
[mm] L5(:,:,i+1)=m1*L5(:,:,i)*(5^0.5+1)/(4*sin(b+54*pi/180));
[/mm]
hold on
line([L1(1,1,i);L2(1,1,i)],[L1(2,1,i);L2(2,1,i)])
line([L2(1,1,i);L3(1,1,i)],[L2(2,1,i);L3(2,1,i)])
line([L3(1,1,i);L4(1,1,i)],[L3(2,1,i);L4(2,1,i)])
line([L4(1,1,i);L5(1,1,i)],[L4(2,1,i);L5(2,1,i)])
line([L5(1,1,i);L1(1,1,i)],[L5(2,1,i);L1(2,1,i)])
end
so... nun möchte ich das ganze für ein n-Eck machen.
das habe ich mal geschrieben, geht aber nicht! aber guckt es euch mal an.
% das ultimative M-file.
% der name ist ultimativ
% a=Winkel
% f=Anzahl Ecken
% s= strecke des Ursprungs zu einem Punkt
% u=Anzahl iterationen
c=a*pi/180; % umrechnen in Bogenmass
b=(pi-(2*pi/f))/2 % das ist winkel beta, in dem Dreieck O, L1(:,:,1), L1(:,:,2)
j=pi-c-b % das ist winkel gamma, in dem Dreieck O, L1(:,:,1), L1(:,:,2)
q=(2*pi)/f % das ist der Winkel den ich brauche um die übrigen punkte des f-ecks zu berechnen
m1=[cos(c) -sin(c);sin(c) cos(c)]; % das ist die drehmatrix die ich brauche für die drehung, analog wie im quadrate1
w=s*sin(b)/sin(j) %diese Strecke brauche ich um den streckungsfaktor zu errechnen. Vom sinus satz her abgeleitet
for k=1:f
m3=[cos(k*q) sin(k*q);-sin(k*q) cos(k*q)]; % das ist die drehmatrix zum die anderen Punkte zu berechnen
L1(:,:,1)=[s*cos(b);s*sin(b)]
Lk+1(:,:,1)=m3*[s*cos(b);s*sin(b)]
for i=1:u
Lk(:,:,i+1)=m1*Lk(1,1,i)*(w/s)
end
end
for i=1:u
for k=1:f
line([Lk(1,1,i);Lk+1(1,1,i)],[Lk(2,1,i);Lk+1(2,1,i)]
end
end
nun habe ich das ganz analog geschrieben wie ich es z.b. beim 5-eck gemacht habe...
nur geht das mit dem Lk und dem LK+1 nicht... irgendwie sollte man ein zweiten index einführen.
ju... und wieso ich zwei for befehle habe, ich stelle mir das so vor, dass matlab zuerst den zweiten for befehl alle zahlen durchgeht, dann zum ersten for befehl geht und dort eine zahl höcher macht, und dann wieder alle zahlen durchmachen beim zweiten for befehl.
naja.. irgendwie noch schwer zu erklären.
Ich hoffe dass mir irgendwer helfen kann und dass ich das problem genug klar formuliert habe, sonst fragt, ich gebe gerne antwort.
und ja... ich habe gar keine ahnung obs überhaubt ein problem dafür gibt... vielleicht geht es gar nicht, vielleicht braucht man noch ein anderes programm. helft mir einfach, wäre sehr dankbar dafür!
danke schon mal im vorraus, für alle die sich die zeit genommen haben.
mfg
KaOoTe
|
|
|
|
hi kaoote,
kann dir zwei lösungsvorschläge machen.
den eleganten hast du schon fast da stehen.
benutzte einfach die dritte dimension für deine verschieden punkte.
also L1(:,:,1)->L(:,:,1)
L2(:,:,1)->L(:,:,2)
L3(:,:,1)->L(:,:,3) usw
würde mich ja mal interessieren warum du da überhaupt immer die 1 in der dritten dimension stehen hast. brauchst du in deinen ersten drei beispiele nicht.
die zweite lösung ist umständlicher und langsamer. soll dir eigentlich auch nur zeigen wie man bei matlab mit laufende name bilden kann.( sinnvoll wenn man datein speichert.
und zwar leifert der ausdruck
for k=1:10
for j=1:10
eval(sprintf('L%01i=matrixoperations_etc%01i;',k,j))
end
end
deine variablen L1 bis L10 wobei jeweils die matrixoperation 1 bis 10 ausgeführt wurde
sprintf setzt an die stelle %01i den integer k ein. (%02i würde eine laufende null vorsetzten 01,02...,09,10,11...) und gibt das ganze als string zurück, eval setzt den string in einen matlab befehl um.
hoffe das hilft dir weiter
grüsse Physikus
|
|
|
|
|
Status: |
(Frage) reagiert/warte auf Reaktion | Datum: | 17:45 Fr 29.04.2005 | Autor: | kaoote |
jo.. das hat schon einen grund wieso da ne 1, steht.
eigentlich hat das, so meinte ich, nichts mit der dritten dimension zu tun, aber hm... also ich habe das eins dort als index verwendet.
denn z.b. bei den quadraten.
L1(:,:,1)=[x;x]; das ist der erste punkt! da müsste das eins glaube ich nicht stehen, aber schauen wir doch mal die for-schleife an.
for i=1:u
L1(:,:,i+1)=m*L1(:,:,i)*1/(sin(b)+cos(b));
das ist jetzt eine rekursive Schreibweise. m ist hier die Drehmatrix. Ins deutsch übertragen heisst das: L1(:,:,2)=m*L1(:,:,1) also L1 ist der erste punkt des quadrats, und L1(:,:,1) ist der ursprüngliche Punkt, L1(:,:,2) ist der gedrehte punkt, aber immernoch der erste Punkt, nur halt gedreht.
hm... also bei deinem zweiten ausdruck der zwar etwas langsamer ist. Für was brauchst genau brauchst du da zwei variabeln?
also.. für was steht da noch j? und was passiert konkret wenn man %01i macht? dann gibt es keine nullstelle? also dann heisst es:
L1, L2, u.s.w. bis L10?
hm.. na aber ich versuchs mal mit dem, habs zwar noch nicht ganz so den Durchblick, aber probieren kann ja nie schaden!
dank dir vielmals!
mfg KaOoTe
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 18:33 Fr 29.04.2005 | Autor: | kaoote |
naja, also wie gesagt, hab mal etwas herumprobiert.
Es soll ja schlussendlich ein m-file sein, wo man die anzahl ecken eingeben kann und dann automatisch ein n-eck gebildet wird mit u iterationen.
schaut das mal an! :
% das ultimative M-file.
% der name ist ultimativ
% a=Winkel
% f=Anzahl Ecken
% s= strecke des Ursprungs zu einem Punkt
% u=Anzahl iterationen
axis equal
c=a*pi/180; % umrechnen in Bogenmass
b=(pi-(2*pi/f))/2; % das ist winkel beta, in dem Dreieck O, L1(:,:,1), L1(:,:,2)
j=pi-c-b; % das ist winkel gamma, in dem Dreieck O, L1(:,:,1), L1(:,:,2)
q=(2*pi)/f; % das ist der Winkel den ich brauche um die übrigen punkte des f-ecks zu berechnen
m1=[cos(c) -sin(c);sin(c) cos(c)]; % das ist die drehmatrix die ich brauche für die drehung, analog wie im quadrate1
w=s*sin(b)/sin(j); %diese Strecke brauche ich um den streckungsfaktor zu errechnen. Vom sinus satz her abgeleitet
for k = 1:f
m3=[cos(k*q) sin(k*q);-sin(k*q) cos(k*q)];% das ist die drehmatrix zum die anderen Punkte zu berechnen
eval(['L' num2str(k) ' = m3*[s*cos(b);-s*sin(b)]'])
end
nun gibt er L1 L2, bis Lf heraus... f ist die anzahl ecken.
Die Punkte werden nun auch immer schön richtig angeordnet, nun solte man noch diesen teil einfügen irgendwie.
for i=1:u
[mm] L1(:,:,i+1)=m1*L1(:,:,i)*(5^0.5+1)/(4*sin(b+54*pi/180));
[/mm]
[mm] L2(:,:,i+1)=m1*L2(:,:,i)*(5^0.5+1)/(4*sin(b+54*pi/180));
[/mm]
u.s.w. einfach diese rekursive schreibweise dass L1(:,:,i+1)=m1*L1(:,:,i) ist. m1 ist hier die drehmatrix.
jo.. also was ich schon probiert habe ist: Lk in der hoffnung dass er dann jedes k dort einsetzt als zahl.. nur schaut er die Variabel Lk wie Fg an.. hm.. und erkennt dort kein k, hoffe ihr versteht was ich meine :)
ju also... das problem wurde jetzt hoffentlich noch etwas präziser geschildert.
|
|
|
|
|
ok auf ein neues,
nur
> schaut er die Variabel Lk wie Fg an.. hm.. und erkennt dort
> kein k, hoffe ihr versteht was ich meine :)
> ju also... das problem wurde jetzt hoffentlich noch etwas
> präziser geschildert.
sorry aber den satz verstehe ich nicht. aber deine eval variante sollte funktionieren.
ok das problem mit dem dritten index hab ich verstanden. aber auch kein problem. nimm einfach nen vierten index . also zb. index 1 und 2 für drehmatrix index 3 für den punkt und index 4 für die i-te iteration.
keinproblem für matlab. nur ein wenig aufpassen mit dem speicher. ab ner millon iteration könnte es kritsch werden *g*.
generell kann matlab mit bielibig vielen dimensionen umgehen.
grüsse physikus
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 13:08 Sa 30.04.2005 | Autor: | kaoote |
jup mit der 4. dimension ist es gegangen, wer sich dafür interessiert kann mir ja ein mail schreiben, kanns ihm dann schicken!
danke
mfg
KaOoTe
|
|
|
|