2017-03-20 5 views
0

Ich versuche eine stückweise Funktion (der Form y = αx + β) auf einer einzigen Zeichnung zu plotten, so dass für verschiedene Bereiche auf der x-Achse, Ich habe verschiedene Werte von α und β für die Funktion.Zeichnen von "sägezahnartigen" Funktionen auf MATLAB

Ich möchte die Positionen (auf der X-Achse) dieser Schritte nach Belieben modifizierbar machen, anstatt eine vorbestimmte Anzahl solcher Teilfunktionen zu haben. Wenn es geplottet wird, sollte es idealerweise wie eine Reihe von Linien mit verschiedenen Steigungen und Abschnitten aussehen, die jeweils durch einen Abstand voneinander getrennt sind. Wenn also mein Abstandsvektor 10 Elemente hat, habe ich meinen Code so geschrieben, dass ich entsprechend 10 verschiedene Teilfunktionen für verschiedene Regionen auf der X-Achse haben werde.

Hier ist der Code, den ich geschrieben habe.

x = linspace(0,100,10000); 
y = zeros(1,10000); 
spacing = 0:10:100; 

alpha = linspace(1,3,length(spacing)); %setting arbitrary upper lim 
beta = linspace(1,5,length(spacing)); 




for j = 1:length(spacing) 
    for i=1:10000 
     if x(i) <= spacing(j) 
      y(i) = alpha(j)*x(i) + beta(j); 
      i = i + 1; 
     else 
      j = j + 1; 


     end 
    end 



end 

plot(x,y) 

Wenn ich dies jedoch plotte, bekomme ich eine einzige Steigung. Es scheint nicht, eine Änderung des Abstands (j) aufgrund des j = j + 1 Iterator in der else-Anweisung

enter image description here

Irgendwelche Vorschläge oder helfen zu erkennen, wie ich Ansatz sollte so viel sein würde, geschätzt!

Antwort

1

Sie sollten zuerst über x und dann über spacing iterieren. Weil Sie für jedes Element in x versuchen, das richtige Intervall zu finden. Sobald Sie dieses Intervall gefunden haben, sollten Sie zum nächsten Element von x gehen und die Iteration über spacing stoppen. Sie können das mit brake tun. Wenn Sie das nicht tun, wählt es immer das letzte Intervall since x(i) <= spacing(end). Sehen Sie den Code unten:

x = linspace(0,100,10000); 
y = zeros(1,10000); 
spacing = 0:10:100; 

alpha = linspace(1,3,length(spacing)); %setting arbitrary upper lim 
beta = linspace(1,5,length(spacing)); 

for i=1:10000 
    for j = 1:length(spacing) 
     if x(i) <= spacing(j) 
      y(i) = alpha(j)*x(i) + beta(j); 
      break 
     end 
    end  
end 

plot(x,y) 
ylim([0 max(y)]) 

Die letzte Zeile y zu setzen, ist von 0

+0

Dank zu beginnen, die Sinn macht. Ich bin auch neugierig, ob es möglich ist, die linearen Plots von y = 0 zu starten, anstatt an der Stelle zu beginnen, an der die vorherige Stückfunktion unterbrochen wurde. Ich dachte daran, den 'i' Wert auf 1 in der Schleife zurückzusetzen, sobald y (i) aktualisiert wurde, aber das würde nicht mit dem Problem umgehen, wie die x-Achse immer noch wie üblich 0-100 lesen kann. – Ferreroire

+1

Sie können Ylim ([0 max (y)]) am Ende des Codes hinzufügen. Allgemeiner beschränkt ylim ([a b]) die Darstellung für a <= y <= b. Siehe die aktualisierte Antwort. –

Verwandte Themen