WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Koordinaten

 

ThoRie
Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 22.05.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.06.2019, 08:55     Titel: Koordinaten
  Antworten mit Zitat      
Hallo Smile

Ich habe mal eine Frage zu folgender Aufgabe:


    Gegeben seien in der Ebene drei feste Punkte P_1=(x_1,y_1), P_2=(x_2,y_2) und P_3=(x_3,y_3), die nicht auf einer Linie liegen. Zusätzlich sei S_o=(x,y) ein beliebiger Startpunkt.
    Umgesetzt werden soll die folgende Iterationsvorschrift:
    
<br />
S_{k+1}=\dfrac{S_k+P_{i(k)}}{2},\;k\in\{0,1,...\}
<br />
    wobei i(k) in jedem Schritt zufällig aus \{1,2,3\} gewählt wird. Schreiben Sie dazu ein Octave--Programm, welches den Startzustand und die ersten 5000 Iterierten visualisiert.


Und jetzt zur eigentlichen Frage. Ich möchte nicht, dass irgendjemand die Aufgabe löst, sondern will wissen, mit welchem Befehl ich Punkte überhaupt eingeben kann. Ich habe jetzt schon mehrere Stunden mit der Suche im Internet zugebracht und leider keine Lösung gefunden :/

Wenn ich wenigstens diesen Anfang hätte, könnte ich immerhin weiter herumprobieren, aber so habe ich nicht einmal einen Start von dem ich ausgehen kann. Mein Editor ist also noch vollkommen leer Sad
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 11.06.2019, 00:00     Titel: Re: Koordinaten
  Antworten mit Zitat      
Hallo ThoRie,

Wie wäre es mit:
Code:
P1 = [17, 3];
P2 = [13, 7];
P3 = [2, 10];

Per rand(1,2) könntest du auch zufällige Werte nehmen.

Die Iteration geht dann mit for k = 1:5000 . Mit randi([1,3]) bekommst du eine zufällige Zahl. Dann:
Code:
switch rand([1,3])
case 1
  S = (S + P1) * 0.5
 

usw. Einfacher wäre es, du definierst die Punkte gleich als Matrix:
Code:

Dann kannst du statt des SWITCH Blocks direkt einen Index verwenden:
Code:
S = (S + P(randi([1,3]), :) * 0.5;


Statt lange im Internet zu suchen, würde ich empfehlen die Getting Started Kapitel der Matlab Dokumentation durch zu lesen. Matlabs "Onramp" erklärt auch viele Details. Das hilft dann auch bei Octave.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
ThoRie
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 22.05.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.06.2019, 11:11     Titel:
  Antworten mit Zitat      
Also ich habe jetzt das hier:

Code:
P1 = [17,3];
P2 = [13,7];
P3 = [2,10];
S = [0,0];

 for k=2:10
   randi([1,3])

switch rand([1,3])
  case 1
  S(k) = (S(k-1) + P1) * 0.5;
  case 2
  S(k) = (S(k-1) + P2) * 0.5;
  case 3
  S(k) = (S(k-1) + P3) * 0.5;
  endswitch
  plot(S,'r')
 
  endfor
 


Das Problem ist halt, dass er nicht macht, was er soll, da ich keine Möglichkeit finde, ihm zu sagen, dass S(1) eben gerade (0,0) sein soll.

Wie kann ich das jetzt also machen? :/
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 18.06.2019, 17:17     Titel:
  Antworten mit Zitat      
Hallo ThoRie,

Prima! Das ist schon ganz schöne nahe dran.

Ein paar Kommentare im Code:
Code:
P1 = [17,3];
P2 = [13,7];
P3 = [2,10];
S = [0,0];

 for k=2:10
   randi([1,3])  % Das ist hier sinnfrei. Das Ergebnis wird gar nicht genutzt
switch rand([1,3]) % Dies erzeugt einen zufälligen [1 x 3] Vektor
                            % im Wertebereich [0, 1]. Switch braucht aber einen Skalar
  case 1
  S(k) = (S(k-1) + P1) * 0.5;
  case 2
  S(k) = (S(k-1) + P2) * 0.5;
  case 3
  S(k) = (S(k-1) + P3) * 0.5;
  endswitch
  plot(S,'r')
   endfor
 

"endswitch", "endfor"? Du arbeitest mit Octave. Bitte erwähne das oder poste in der Kategorie Octave.
Lies dir nochmal die Dokumentation zu rand und randi durch.

Zitat:
Das Problem ist halt, dass er nicht macht, was er soll, da ich keine Möglichkeit finde, ihm zu sagen, dass S(1) eben gerade (0,0) sein soll.

Doch, steht doch da:
Code:

Allerdings ist das nicht "S(1)", sondern "S(1, :)". S(1) ist das erste Element des Vektors S.
Du könntest die Indices auch einfach weglassen:
Code:
P1 = [17,3];
P2 = [13,7];
P3 = [2,10];
S = [0,0];
plot(S(1), S(2), 'ro');   % Hier werden die Indices benötigt
hold('on');
for k = 2:10
  switch randi([1,3])   % randi() hier statt rand()
    case 1
      S = (S + P1) * 0.5;
    case 2
      S = (S + P2) * 0.5;
    case 3
      S = (S + P3) * 0.5;
  end
  plot(S(1), S(2), 'ro');
end

Wenn du die Zwischenwerte speichern möchtest, anstatt sie nur zu plotten:
Code:
P1 = [17,3];
P2 = [13,7];
P3 = [2,10];
S = zeros(10, 2);  % Impliziert bereits: S(1, :) = [0,0];
for k = 2:10
  switch randi([1,3])   % randi() hier statt rand()
    case 1
      S(k, :) = (S(k-1, :) + P1) * 0.5;
    case 2
      S(k) = (S(k-1, :) + P2) * 0.5;
    case 3
      S(k) = (S(k-1, :) + P3) * 0.5;
  end
end
plot(S(:, 1), S(:, 2), 'ro');

Oder kompakter:
Code:
P = [17,3;  13,7;  2,10];
S = zeros(10, 2);
for k = 2:10
   S(k, :) = (S(k-1, :) + P(randi([1,3]))) * 0.5;
end
plot(S(:, 1), S(:, 2), 'r');

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
ThoRie
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 22.05.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.06.2019, 18:51     Titel:
  Antworten mit Zitat      
Also, ich habe jetzt mal diese Variante probiert, da die Werte egal sind, sondern es eigentlich nur um den Plot geht:

Code:
P1 = [17,3];
P2 = [13,7];
P3 = [2,10];
S = [0,0];
plot(S(1), S(2), 'ro');   % Hier werden die Indices benötigt
hold('on');
for k = 2:5000 % geändert wegen Aufgabenstellung
  switch randi([1,3])   % randi() hier statt rand()
    case 1
      S = (S + P1) * 0.5;
    case 2
      S = (S + P2) * 0.5;
    case 3
      S = (S + P3) * 0.5;
  end
  plot(S(1), S(2), 'b'); % geändert, damit vom Startwert unterscheidbar
end


Außerdem habe ich noch k angepasst, da ich vergessen hatte das vor dem einstellen zu machen.

Jetzt entsteht da das Bild, was angehängt ist.
Also ich kann ja erkennen, dass es ein Sierpinski-Dreieck wird (btw soll es ja auch), aber warum liegt das jetzt so komisch schräg in der Ebene?

Zitat:
Du arbeitest mit Octave. Bitte erwähne das oder poste in der Kategorie Octave.

Zum einen dachte ich, da ich das in meiner Hauptfrage schonmal hatte, dass das nicht nochmal nötig ist, aber wenn es hilft, werde ich das natürlich in Zukunft berücksichtigen Smile
Und die Existenz einer eigenen Kategorie war mir leider nicht bekannt, tut mir leid Embarassed

Unbenannt.png
 Beschreibung:

Download
 Dateiname:  Unbenannt.png
 Dateigröße:  12.76 KB
 Heruntergeladen:  235 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 19.06.2019, 11:34     Titel:
  Antworten mit Zitat      
Hallo ThoRie,

Zitat:
Also ich kann ja erkennen, dass es ein Sierpinski-Dreieck wird (btw soll es ja auch), aber warum liegt das jetzt so komisch schräg in der Ebene?

Es liegt genau zwischen den Punkten P1, P2, P3. Je nachdem, wie diese Punkte liegen, ist auch das Dreieck positioniert.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
ThoRie
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 22.05.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.06.2019, 12:01     Titel:
  Antworten mit Zitat      
Okay, danke. Das ist ja mal mehr als dämlich von mir Embarassed

Gut dann danke ich für die schnellen und guten Antworten. Jetzt funktioniert wirklich alles perfekt, wie es soll Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.