2016-05-05 8 views
2

Ich schreibe eine Funktion, um ein Fraktalbild in einem Diagramm zu erstellen. Wenn ich meinen Code starte, erscheint ein Plot, aber es ist leer. Ich denke, dass die Probleme irgendwo in meinen if/elsif-Aussagen liegen, aber es fällt mir schwer, sie zu finden. Mein Code ist:Erstellen von Fraktalbild in einem Diagramm MATLAB, aber das Diagramm ist leer

function [] = fractal(x, y, N) 
close all 
start = [x, y]; 
X = zeros(N+1,1); 
Y = zeros(N+1,1); 
X = start; 
hold on 
for i = 1:N 
prob = rand; 
if prob >= 0.01 
    X(i+1,:) = 0; 
    Y(i+1,:) = 0.16*y(1); 
elseif prob == 0.02:0.86 
    X(i+1,:) = (0.85*x(i))-(0.04*y(i)); 
    Y(i+1,:) = (-0.04*x(i))+(0.85*y(i))+1.6; 
elseif prob == 0.87:0.94 
    X(i+1,:) = (0.2*x(i))-(0.26*y(i)); 
    Y(i+1,:) = (0.23*x(i))+(0.22*y(i))+1.6; 
elseif prob == 0.95:1.0 
    X(i+1,:) = (-0.15*x(i))+(0.28*y(i)); 
    Y(i+1,:) = (0.26*x(i))+(0.24*y(i))+0.44; 
plot(X(i,:),Y(i,:),'.','Markersize',1) 
axis equal 
    end 
end 
end 

Wenn ich meinen Code ausführen mit

>> fractal(1,1,1000) 

... ein Grundstück kommt, aber es ist leer.

Antwort

3

Yup ... es sind Ihre if Anweisungen, aber es gibt mehr Probleme mit Ihrem Code, aber wir werden diese später angehen. Lassen Sie uns zuerst Ihre if Aussagen adressieren. Wenn Sie in einem Bereich von Werten für Beispiele vergleichen möchten, müssen Sie die UND-Anweisung (&&) verwenden. Darüber hinaus sollten Sie Ihren plot Code außerhalb jeder if/elseif/else Anweisung platzieren. Sie haben es derzeit in Ihrer letzten elseif Anweisung, so plot wird nur ausgeführt, wenn die letzte Bedingung erfüllt ist.

Um explizit zu sein, wenn Sie es wünschen ein Wert zu vergleichen, wenn zwischen einem bestimmten Bereich ist, so etwas wie:

if (prob >= a && prob < b) 

und für elseif:

elseif (prob >= a && prob < b) 

a und b das sind untere und obere Grenze von dem, was Sie vergleichen möchten. Dieser enthälta aber schließtb im Vergleich aus.

Ich habe auch ein mehr Kommentare und Empfehlungen mit Ihrem aktuellen Code, um diese Arbeit zu bekommen:

  1. Sie führen Ihre Funktion mit einem einzigen x und y Wert, aber Sie versuchen, diese x zugreifen und y in Ihrer for Schleife, als ob diese Arrays wären. Ich nehme an, das ist rekursiv in der Natur, so müssen Sie tatsächlich X und Y in Ihrem if/else Bedingungen anstelle von x und y verwenden.
  2. Da Sie einzelne Werte verwenden, ist es überflüssig, : für den Zugriff auf die zweite Dimension zu verwenden. Lass das einfach weg.
  3. Sie erstellen X und Y aber dann X überschreiben die Startposition als 2D-Array zu sein ... Ich glaube, Sie X und Y s erstes Element mit dem Ausgangspunkt statt ersetzen sollten.
  4. Ihre erste if Aussage ich denke, ist falsch. Sie möchten auf Y(i) nicht Y(1) nicht zugreifen? ... angesichts des Verhaltens Ihres Codes so weit.
  5. Ihre erste Bedingung wird definitiv Dinge für Sie durcheinander bringen. Dies bedeutet, dass, solange der Wert größer oder gleich 0,01 ist, diese Anweisung ausgeführt wird. Versuchen Sie andernfalls, die anderen Bedingungen auszuführen, die möglicherweise nie funktionieren, da Sie nach Werten suchen, die größer als 0,01 sind, wo die erste Bedingung das bereits für Sie handhabt.Ich nehme an, Sie wollten überprüfen, ob es weniger als 0,01 stattdessen war.
  6. Doing value comparecondition array in MATLAB bedeutet, dass diese Aussage wahr ist, vorausgesetzt, einer der Werte in Array entspricht der Bedingung von value zur Verfügung gestellt. Dies hat unbeabsichtigte Nebenwirkungen mit Ihrem aktuellen Code.
  7. Stellen Sie sicher, dass Ihre Bereiche, die für jede if-Anweisung abgedeckt sind, kontinuierlich sind (d. H. Keine Lücken oder Trennungen zwischen den Bereichen). Im Moment suchen Sie nach Werten in 0,01-Intervallen. rand generiert zufällige Werte zwischen 0 und 1 exklusiv. Was wäre, wenn Sie einen Wert von 0,15 hätten? Keine Ihrer if Bedingungen behandeln dies, so dass Sie verwenden müssen, worüber ich oben gesprochen habe.
  8. Sie erhalten am ehesten eine leere Zeichnung, weil Ihr MarkerSize Attribut sehr klein ist .... Sie setzen es auf 1 Pixel. Wenn du keine super menschliche Vision hast, kannst du das nicht wirklich visualisieren. Machen Sie die MarkerSize größer.
  9. Verwenden Sie drawnow; nach Ihnen plot, um die Ergebnisse sofort auf dem Bildschirm zu aktualisieren.

daher mit Ihrem Code Refactoring, sollten Sie es in etwa so aussehen:

function [] = fractal(x, y, N) 
close all 
start = [x, y]; 
X = zeros(N+1,1); 
Y = zeros(N+1,1); 
%// Change - Initialize first elements of X and Y to be the starting positions 
X(1) = start(1); 
Y(1) = start(2); 
hold on 
for i = 1:N 
    prob = rand; 
    if prob <= 0.01 %// Change 
     X(i+1) = 0; 
     Y(i+1) = 0.16*Y(i); %// Change 
    elseif (prob > 0.01 && prob <= 0.86) %// Change 
     X(i+1) = (0.85*X(i))-(0.04*Y(i)); %// Change 
     Y(i+1) = (-0.04*X(i))+(0.85*Y(i))+1.6; %// Change 
    elseif (prob > 0.86 && prob <= 0.94) %// Change 
     X(i+1) = (0.2*X(i))-(0.26*Y(i)); %// Change 
     Y(i+1) = (0.23*X(i))+(0.22*Y(i))+1.6; %// Change 
    elseif (prob > 0.94 && prob <= 1.0) %// Change 
     X(i+1) = (-0.15*X(i))+(0.28*Y(i)); %// Change 
     Y(i+1) = (0.26*X(i))+(0.24*Y(i))+0.44; %// Change 
    end 

    %// Change - move outside of if/else blocks 
    %// Also make marker size larger 
    plot(X(i),Y(i),'.','Markersize',18); %// Change 
    axis equal 

    %// Add just for kicks 
    drawnow; 
end 

end 

ich jetzt diese Zahl, wenn ich fractal(1,1,1000) tun:

enter image description here

.... coole Fraktal BTW!

+0

Warum überprüfen Sie doppelt nach 'prob '? Wenn der Code die Zeile erreicht, sagen wir, 'elseif (prob> 0.86 ...' ist es sicher, dass 'prob> 0.86', weil die 'elseif' Anweisung oben ausgewertet und zur nächsten Iteration rückgeführt werden würde. Ich würde verwenden 'if prob <0,01' und' elseif prob <0,86' Aussagen – Crowley

+0

@Crowley Das stimmt, aber ich möchte explizit sein – rayryeng

+0

X kann auch definiert werden durch: 'X = [x; Nullen (N, 1)]; ' – Crowley