Moin Moin, ich stehe momentan vor einem kleinen Problem und würde mich über eure Hilfe freuen. Ich möchte ein Sägezahnsignal plotten lassen, welches eine amplitude von 0.02 hat. Der Ablauf soll sein: Signal steigt(von 0) so lange linear, bis +0.02 erreicht ist. Bei diesem Zeitpunkt soll das Signal dann durch dotenew=-0.001; solange fallen, bis der Wert -0.02 erreicht ist und dann wieder positiv etc... Mein Problem ist jetzt, dass sobald der Wert 0.02 erreicht ist, durch "else" dotenew=-0.001 ist, dies jedoch nur genau einmal passiert und anschließend wieder dotenew wieder positiv ist, wodruch das Signal ständig zwischen 0.021 und 0.02 pendelt. Ich weiß, dass mir eine Bedingung fehlt, welche sagt, dass dotenew erst wieder positiv sein soll, sobald -0.02 erreicht worden ist. Hat jemand eine Idee wie ich diese Bedingung programmieren kann? Die Matlabdatei befindet sich im Anhang :) Danke!
Ganz unelegant kann man das mittels eines Flags lösen. Zumindest würde ich das so machen ;-) MfG
Okay, wie genau meinst du das? Ich denke halt eher an eine zusätzliche Bedignung, welche irgendwie feststellt, dass -0.02 noch nicht erreicht wurde und deswegen weiterhin dotenew=-0.001 ist. Nur bekomme ich keinen funktionierenden Code zusammen.
Also nach deinem Code würde ich so gehen:
1 | if enew>=0.02 & flag==0; %steptime<=20 |
2 | % blocker>0 %Dehnung, Epsilon |
3 | %else blocker |
4 | %steptime<=10 %wenn steptime kleiner gleich 10 ist... |
5 | %dotenew=+0.001; %Dehnrate |
6 | flag=1; %aufwärts |
7 | |
8 | elseif enew<=-0.02 & flag==1 |
9 | % enew>=-0.02; %Dehnung, Epsilon |
10 | %dotenew=-0.001; %Dehnrate |
11 | flag=0; %abwärts |
12 | blocker=1; |
13 | %bis -0.02 erreicht wurde, dann wieder dotenew+0.001 |
14 | end |
danach auf die Zustände prüfen
1 | if flag==1; |
2 | dotenw=0.001; |
3 | else |
4 | dotenw=-0.001; |
5 | end |
MfG Edit: ein wenig abgeändert... Denkfehler. Jetzt aber.
:
Bearbeitet durch User
super :) also ich habe den code mal getestet, jedoch war nur ein linear sinkendes Signal zu sehen. Ich hab den Code mal angepasst, jetzt ist das Sägezahnsignal erkennbar:
1 | enew<=0.02 & flag==0; |
und
1 | elseif enew>=-0.02 & flag==1 |
Leider schwingt das Signal jedoch zwischen 0-1 (das Ziel ist 0.02 und -0.02). Wie kann das sein, obwohl enew max +-0.02 ist?
Genau, da habe ich noch einen Vorzeichenfehler dringehabt. Mit diesem Code geht es von -0.02 bis 0.02:
1 | clear; |
2 | enew=0.0; |
3 | flag=0; |
4 | |
5 | for N=1:400 |
6 | if enew>=0.02 & flag==0; %steptime<=20 |
7 | %dotenew=0.001; %Dehnrate |
8 | flag=1; |
9 | elseif enew <=-0.02 & flag==1 |
10 | %dotenew=-0.001; %Dehnrate |
11 | blocker=1; |
12 | flag=0; |
13 | %bis -0.02 erreicht wurde, dann wieder dotenew+0.001 |
14 | end |
15 | if flag==0; |
16 | dotenew=0.001; |
17 | else |
18 | dotenew=-0.001; |
19 | end |
20 | enew=enew+dotenew; |
21 | Y(N,1)=enew; |
22 | %disp(enew); |
23 | |
24 | end |
25 | N=1:1:400; |
26 | plot(N,Y); |
Sollte passen. Hat gegenüber deiner Version die Vergleichszeichen anders und die Flags waren vorhin beim hoch- und runterzählen falschherum. MfG
:
Bearbeitet durch User
Das geht mit guter Kenntnis der mächtigen Matlab Syntax auch in drei Zeilen: y1=repmat(1e-3*[1 -1],40,5); y2=cumsum(y1(:))-0.02; y3=[y2(21:end);y2(1:20)]; Yo ;)))) Cheers Detlef
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.