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

Rechteckfunktion mit stochastischen Perioden

 

susi26
Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 18.11.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.11.2010, 17:46     Titel: Rechteckfunktion mit stochastischen Perioden
  Antworten mit Zitat      
Hallo,
ich möchte eine Rechteckfunktion mit stochastischen Perioden generieren. Mit square bekomme ich das nicht hin.
Die funktion sollte 365 (tage) lang sein. die perioden, sollten zwischen 8 und 13 (tage) sein. die funktion soll die werte +1 und -1 annehmen! ginge es prinzipiell auch, dass die Werte 0 und +1 annehmen?
Vielen Dank im Voraus,
eure susi
Private Nachricht senden Benutzer-Profile anzeigen


lilov
Forum-Century

Forum-Century


Beiträge: 193
Anmeldedatum: 05.05.10
Wohnort: Bremerhaven
Version: ---
     Beitrag Verfasst am: 28.11.2010, 02:54     Titel:
  Antworten mit Zitat      
Hi Susi:)

bin mir nicht sicher ob du das meintest aber hier wäre eine eventuelle Lösung deines Problems ohne die Benutzung von square Funktion:

Code:

% erstellt eine Reihe von Zufallszahlen zwischen 8 und 13 mit einer Länge
% von 365/8 da dies die maximale Länge wäre.(wenn alle Intervalle 8 Tage
% lang sind)
% ceil ist da weil die Länge eines Vektor eine ganze Zahl sein muss
L = 8+5*round(rand(ceil(365/8),1));
% Da die Summe vom Vektor 365 überschreitet, weil Intervalle mit der Länge
% von 13 Tage vorhanden sind, wird mit cumsum überprüft wann die Länge von
% 365 überschritten wird und die restlichen Werte werden gelöscht
A = L.*(cumsum(L)<=365);
A(A==0)=[];



stochasticSquare = [];
for j = 1:length(A);
    % es werden hier abwechselnd Intervalle mit einsen oder Nullen erstellt
    % mit Längen von 8 oder 13 Tagen
   
    if rem(j,2)==0 %wenn j gerade ist
        B = ones(A(j),1);
        stochasticSquare = [stochasticSquare;B];
    else
        B = zeros(A(j),1);
        stochasticSquare = [stochasticSquare;B];
    end
         
end
% die Matrix bis 365 mit Nullen füllen
stochasticSquare = [stochasticSquare;zeros(365-length(stochasticSquare),1)];
   
plot(stochasticSquare)
axis([0 365 0 1.2])
 


Probiere es mal aus...wenn Fragen sind einfach melden

Gruß,

lilov
Private Nachricht senden Benutzer-Profile anzeigen
 
lilov
Forum-Century

Forum-Century


Beiträge: 193
Anmeldedatum: 05.05.10
Wohnort: Bremerhaven
Version: ---
     Beitrag Verfasst am: 28.11.2010, 03:02     Titel:
  Antworten mit Zitat      
ach, und wenn die Funktion aus 1 und -1 bestehen soll statt 1 und 0, dann einfach die Zeile mit zeros Funktion so umändern:

Code:


B = ones(A(j),1).*-1;
 


Gruß,

lilov
Private Nachricht senden Benutzer-Profile anzeigen
 
susi26
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 18.11.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.11.2010, 10:38     Titel:
  Antworten mit Zitat      
hallo lilov!

Wow, vielen dank! hat mir echt sehr geholfen! genau so wollt ichs haben Smile

wenn ich jetzt die perioden ändern möchte, auf zB 2 bis 5 Tage, dann ändere ich einfach diese zeile folgendermaßen:
L = 2+3*round(rand(ceil(365/2),1)); oder?

vielleicht ist es auch ein leichtes für dich, mir dann dabei zu helfen Embarassed :
die einfache variante: eine rechteckfunktion zw. 0 und 1 bzw. -1 und 1 für eine fixe periode. zB 8 Tage! machte das bisher mit Excel und hab die Spalte eingelesen. mit square habe ich es so gemacht:

t = 1:1:365;
y = square(pi*0.125*t)';

liefert mir bei 8 tagen schöne werte, bei 7 tagen ist es da 1/7 viele kommastellen hat schon ungenauer. außerdem habe ich nur den Wertebereich -1 bis 1 Sad

Danke schon jetzt!!!!!!!!!!!!!!
lg Susi

Ach so, jetzt hab ich ein weiteres Problem erkannt:

ich will nun einen Spaltenvektor x mit 0.85 addieren, wenn mein y=square die Werte -1 hat. also mit excel mach ich so: =wenn(y=-1,x*0.85,x)
aber wie funktioniert es mit matlab??

So viele Fragen auf einmal... Confused
Private Nachricht senden Benutzer-Profile anzeigen
 
lilov
Forum-Century

Forum-Century


Beiträge: 193
Anmeldedatum: 05.05.10
Wohnort: Bremerhaven
Version: ---
     Beitrag Verfasst am: 28.11.2010, 13:00     Titel:
  Antworten mit Zitat      
hi:)
kein Problem, ich helfe gerne, dafür ist es ja ein matlab forum. Weil Menschen Fragen haben

mir ist aufgefallen dass ich das falsch verstanden hatte. du wolltest Perioden zwischen 8 und 13 und nicht Perioden die entweder 8 oder 13 sind. Dann müsste deine Funktion so lauten:
Code:

L = 8+round(5*(rand(ceil(365/8),1)));
 

wenn du die Zahlen zwischen 2 und 5 haben willst dann:
Code:

L = 3+round(2*(rand(ceil(365/2),1)));
 

Das hast du richtig verstanden. Nur jetzt ist round woanders weil du ja Werte zwischen 3 und 5 haben willst und nicht entweder 3 oder 5.
Liegt daran weil dir rand zufällige Zahlen zwischen 0 und 1 erstellt. Wenn du sie also mit 2 multiplizierst, kriegst du Zahlen von 0 bis 2. Mit (+3) => 0 bis 5. Jetzt willst aber keine Bruchzahlen sondern Integers haben. Deswegen die round Funktion.
Der code mag kompliziert aussehen..ist aber nicht wenn man sich dran gewöhnt. Erspart eine Menge zeit im Vergleich zu excel. Du kannst dir das Ganze als eine Funktion zusammen basteln damit du es nicht jedes Mal eingeben musst.
Hab deine zweite Frage leider nicht verstanden. Das mit der square Funktion scheint richtig zu sein. Willst du eine Lösung mit der square funktion? Das mit -1 und 1 wäre auch mit square machbar glaube ich…nur den Teil mit der Stochastik geht nicht.
Das mit der if Fukntion könntest du auch hier machen. Dafür müßtest du aber eine Schleife machen. Der Vorteil von matlab ist dass du schleifen öfters vermeiden kannst weil die langsam sind. Berispiel für dein Code wäre:
Code:

y =[1 -1 1 1 1 -1 -1 -1 1 1 -1]';
y(y==-1) = y(y==-1)+0.85;
 

Viele Grüße,
lilov
Private Nachricht senden Benutzer-Profile anzeigen
 
susi26
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 18.11.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.11.2010, 18:25     Titel:
  Antworten mit Zitat      
Hallo, das Mulitplizieren habe ich jetzt so gemacht

x1=[234, 444, 233, 334]'
f = stochasticSquare;
f(f==-1) = f(f==-1)+1.85;
xneu=(x1.*f);
So hab ich immer wenn die Rechteckfunktion den Wert -1 hat, bei Vektor x1 in der gleichen Zeile 15 % abgezogen (*0,85 mulitpliziert). Danke, funktioniert.

Die andere Frage wäre so zu verstehen gewesen: Ich möchte eine Rechteckfunktion mit einer fixer Periode erzeugen. zB 8 Tage. Wie mach ich das? Square
t = 1:1:365;
y8 = square(pi*0.125*t)';

sind die ersten werte 7 mal, erst dann ist die Periode 8!
y8 =

1
1
1
1
1
1
1
-1
-1
-1
-1
-1
-1
-1
-1
1
1
1
1
1
1
1
1
-1
-1
-1
-1
-1
-1
-1
-1

Das gleiche bei 10 Tagen, da sind die ersten Werte 9 mal. kann man das verhindern?

bei einer Periode von 2 Tagen y2 = square(pi*0.5*t)'; sind zwischendurch auch Perioden von 1 Tage oder 3 Tagen vorhanden.

kann ich also eine Rechteckfunktion auch ohne square mit fixer periode generieren??

liebe Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
lilov
Forum-Century

Forum-Century


Beiträge: 193
Anmeldedatum: 05.05.10
Wohnort: Bremerhaven
Version: ---
     Beitrag Verfasst am: 28.11.2010, 19:25     Titel:
  Antworten mit Zitat      
Hi Susi,
klar geht das. ich hab die square funktion bis jetzt nicht so oft verwendet, deswegen geb ich dir wieder eine von mir ausgedachte Lösung. Die ist aber wesentlich einfacher als die letzte. hoffe das hilft dir weiter:)
Code:

% Länge der Periode
period = 8;
% Reihe von einsen mit der Lönge 8
pos = ones(period,1);
% Reihe von -1 mit der Lönge 8
neg = pos*-1;
% pos und neg aneinander reihen
hilfsmatrix = [pos;neg];
% replizieren der Matrix. Die die hilfsmatrix mit der Länge 16 ist muss die
% Matrix 365/16 mal multipliziert werden
squarefunc = repmat(hilfsmatrix,floor(365/(2*period)),1);

% bis 365 mit 1 füllen

squarefunc = [squarefunc;ones(365-length(squarefunc),1)];

 


viele Grüße,
lilov
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 - 2025 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.