ich sitze seit 2 Tagen an einem Problem und zweifle schon an der Mathematik...
Ich habe eine GUI in der in einer Callback-function eines Buttons folgendes Teilskript integriert ist:
Code:
else % Die Variable 'u_Verlauf_Lx' dient dem Aufsummieren der einzelnen % Oberschwingungen und der Grundschwingung in einer Variable
gsamp=sqrt(2)*1000*str2double(get(handles.ETgs,'String'))/sqrt(3)% Einlesen Grundschwingungsamplitude L-E in Volt aus Effektivspannung L-L in kV in Variable 'gsamp'
u_Verlauf_L1=gsamp*sin(2*pi*50*t)% Vorbesetzung der Summenspannung mit Grundschwingung und 0°
u_Verlauf_L2=gsamp*sin((2*pi*50*t)-(2*pi/3))% ... 120°
u_Verlauf_L3=gsamp*sin((2*pi*50*t)-(4*pi/3))% ... 240°
for n=2:1:11% Einlesen der ersten 10 (festen) Oberschwingungen (Harmonische 2 bis 11!!!) if(get(eval(['handles.CH' num2str(n-1)]),'Value')==1)% Wenn Checkbox 1-10 gesetzt, dann... (eval Befehl wandelt String in evaluierbaren Code um)
amp=sqrt(2)/sqrt(3)*1000/100*(str2double(get(eval(['handles.ET' num2str(n-1)]),'String'))*gsamp); % Amplitude L-E [Vpeak] aus prozentualer Grundeffektivspannung berechnen
osfunktion_L1=amp*sin(2*pi*50*(n)*t); % Verlauf für L1 berechnen
osfunktion_L2=amp*sin((2*pi*50*(n)*t)-(2*pi/3)); % ... L2 ...
osfunktion_L3=amp*sin((2*pi*50*(n)*t)-(4*pi/3)); % ... L3 ...
u_Verlauf_L1=u_Verlauf_L1+osfunktion_L1; % Aufsummieren der Harmonischen (+Grundschwingung)
u_Verlauf_L2=u_Verlauf_L2+osfunktion_L2;
u_Verlauf_L3=u_Verlauf_L3+osfunktion_L3;
end;
end;
k=zeros(10,2); % Vordefinition Hilfsmatrix für OS 11-20 (Harm. 12-21)
for n=12:1:21% Einlesen der 11. bis 20. Oberschwingungseingabefelder mit variabler OS-Ordnung (Default: Harmonische 12-21) if(get(eval(['handles.CH' num2str(n-1)]),'Value')==1)% Wenn Checkbox 11-20 gesetzt, dann...
amp=sqrt(2)/sqrt(3)*1000/100*(str2double(get(eval(['handles.ET' num2str(n-1)]),'String'))*str2double(get(handles.ETgs,'String'))); % Amplitude L-E [Vpeak] aus prozentualer Grundeffektivspannung berechnen
h=get(eval(['handles.OS' num2str(n-1)]),'String'); % Hilfsvariable h für Nummer der Oberschwingung
k((n-11),1)=str2double(h)-1; % Ablegen OS-Nummer in Hilfsmatrix k zur späteren Sortierung
k((n-11),2)=str2double(get(eval(['handles.ET' num2str(n-1)]),'String')); % zugehörigen Prozentwert eintragen
osfunktion_L1=amp*sin(2*pi*50*(k((n-11),1)+1)*t);% Verlauf berechnen
osfunktion_L2=amp*sin((2*pi*50*(k((n-11),1)+1)*t)-(2*pi/3));
osfunktion_L3=amp*sin((2*pi*50*(k((n-11),1)+1)*t)-(4*pi/3));
u_Verlauf_L1=u_Verlauf_L1+osfunktion_L1; % Aufsummieren der Harmonischen (+Grundschwingung)
u_Verlauf_L2=u_Verlauf_L2+osfunktion_L2;
u_Verlauf_L3=u_Verlauf_L3+osfunktion_L3;
end;
end;
u_tab=[t' u_Verlauf_L1' u_Verlauf_L2' u_Verlauf_L3']; % Ablegen der berechneten Spannungswerte in Matrix/Wertetabelle
Das Skript dient dazu, die in der GUI eingegebenen Oberschwingungen dem Grundschwingungssignal mit einer bestimmten Amplitude zu überlagern, so dass am Ende in der Matrix u_tab eine Wertetabelle der resultierenden Schwingung (also Grundschwingung + alle eingepflegten Oberschwingungen) steht.
Nach dem Funktionsdurchlauf steht zwar eine funktionierende, korrekt zugeordnete Wertetabelle in u_tab zur Verfügung, jedoch mit falsch berechneten Werten (sowohl in Amplitude als auch in der Phasenlage des Signals, Frequenz wird offenbar richtig umgesetzt).
Will man z.B. ein Rechtecksignal erzeugen, bekommt man statt dessen 3 komplett verschiedene aber periodische Signale.
Das Skript läuft ansonsten fehlerfrei, es werden keine Warnung/Fehler ausgegeben.
Mache ich was falsch bei der Addition des Signals?
Hat sich denn noch keiner mit dem Thema beschäftigt?
Na gut, dann werd ich mal noch ne Erkenntnis einstellen:
mit dem folgenden Skript funktioniert die Sache nun, aber nur in diesem Skript. Baue ich den Teil in meinem GUI-Skript ein funktioniert wieder nichts!
Aber warum berechnen sich die Oberschwingungen in Phase L2, L3 nun nach der Formel:
A*sin(2*pi*f*(n+1)*t-(n+1)*2*pi/3)
und
A*sin(2*pi*f*(n+1)*t-(n+1)*4*pi/3)
Die Phasenverschiebung sollte doch unabhängig von der Frequenz bzw. Ordnung der Oberschwingung sein???
Obendrein funktioniert die Implementierung in mein GUI-Skript mit dieser Methode ja ebenfalls nicht.
Dein Posting enthält einige Stolperfallen, die es schwer machen, Dein Problem zu bearbeiten:
1. "clear all" - wenn ich das bei mir laufen lasse, sind meine Variablen gelöscht. Das mag zwar auf Deinem Rechner hilfreich sein und man muss ja auch nur die eine Zeile löschen, aber es bremst mich trotzdem.
2. "Baue ich den Teil in meinem GUI-Skript ein funktioniert wieder nichts!" Man kann nicht ergründen, was "funktioniert nicht" bedeuten soll. Für mich ist es effizienter nur Postings zu beantworten, in denen genau beschrieben wird, was genau nicht funktioniert.
3. "assignin('base',['ET' num2str(n)],0)"
Den Base-Workspace ferngesteuert mit Variablen vollzuschreiben ist eine unsichere und fehlerträchtige Programmiermethode. Es ist wenig verwunderlich, dass dies z.B. nach dem Kopieren in eine Funktion zu Problemen führt. Statt den Index in den Namen der Variablen zu packen, wäre es viel hilfreicher und sicherer einen Index als Index zu verwenden (wie das Wort ja schon sagt...).
4. Ein paar temporäre Variablen würden hier die Übersichtlichkeit stark erhöhen:
5. "eval(['ET' num2str(n)])*ETgs;"
Der EVAL-Zugriff ist genauso fehlerträchtig wie ASSIGNIN.
Eine geordnetes Variablen-Management würde das Lesen des Codes deutlich vereinfachen und wahrscheinlich auch das ein oder andere Deiner Probleme lösen. Vielleicht auch nicht.
Insgesamt ist es für mich also zu viel Aufwand, Dein Programm so genau zu analysieren, bis ich eine Ahnung davon bekommen könnte, wo Dein Problem liegt. Zum Glück gibt's hier ja aber noch genügend andere Antwortende.
Oder Du versuchst Dein Programm zu vereinfachen und die Variablen "ordentlich" zu verwenden.
zu 2.
Die Oberschwingungen werden mit dem zugrundeliegenden Skript einfach falsch überlagert. Für drei Phasen bekomme ich drei verscheidene Verläufe, die auch nach Berücksichtigung der Phasenverschiebung NICHT im Amplitude und Frequenz übereinstimmen. Ich möchte ja im Grunde ein bestimmtes, verrauschtes Signal in 3 Phasen, also amplituden- und frequenzgleich für Phase L1, L2 und L3 erzeugen. Wenn ich die Phasenverschiebung aller Signale wegließe, wären das also 3 identische Kurven.
Noch mal: Im ISOLIERTEN Skript (mein zweiter Post) funktioniert die Sache wie ich das will, im GUI-SKRIPT (siehe erster Post) funktioniert die OS-Erzeugung nicht, und es treten die gerade beschriebenen Probleme auf.
zu 3./5.
Du hast natürlich Recht, aber das ist leider eine zu erfüllende Forderung, diese Variablen unter dem Namen xy im Workspace zur späteren Verarbeitung zur Verfügung zu stellen, hätte ich auch gerne anders. Ich habe das deswegen im isolierten Skript nicht geändert, um jede mögliche Fehlerquelle aus meinem GUI-Skript einzubeziehen.
Zusammengefasst brauche ich bei folgendem Kernproblem Hilfe oder zumindest einen Denkanstoß:
Die explizite Berechnung der Oberschwingungen wird von MATLAB trotz richtiger mathematischer Formel falsch durchgeführt. Woran kann das liegen bzw. welche Fehlerquellen meines Skripts kommen in Frage?
Woran kann das liegen bzw. welche Fehlerquellen meines Skripts kommen in Frage? Damit wäre mir schon sehr geholfen.
Ich würde Dir schon gerne helfen. Aber wie gesagt: Solange Du den Code nicht deutlich vereinfachst, ist das Lesen, und damit auch das Debuggen, unnötig schwierig - sowohl für mich als offensichtlich auch für Dich. Wenn Du alle Redundanzen entfernst, z.B. indem Du alle Konstanten Ausdrücke nur einmalig berechnest und in einer temporären Variable speicherst, ist Dein Code weniger also halb so lang. Dann geht das Fehler-Suchen über den Daumen gepeilt etwa doppelt so schnell.
Okay, ich nehm das mal als Auftrag mit, hab nämlich selber langsam Probleme da durchzusteigen Ich hab mich mittlerweile entschlossen das GUI neu zu gestalten und das Skript komplett zu überarbeiten. Sollte das Problem dann wieder auftauchen werd ich mich nochmal melden.
Trotzdem vielen Dank, dass du dich mit meinem Chaosskript befasst hast
Nun wird quasi die Grund- und jede Oberschwingung um den festen Wert 20/3 ms nach vorn oder hinten verschoben, je nach Phase.
Einstellungen und Berechtigungen
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
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.