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

Spannung mit Oberschwingungen - falsche Berechnung

 

ElBarto
Forum-Anfänger

Forum-Anfänger


Beiträge: 27
Anmeldedatum: 27.09.10
Wohnort: Bamberg
Version: R2009b
     Beitrag Verfasst am: 27.10.2010, 12:46     Titel: Spannung mit Oberschwingungen - falsche Berechnung
  Antworten mit Zitat      
Hallo,

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°
 

...
Code:

    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?

Bin für jeden Tip und Ratschlag dankbar!

Gruß
Michael
Private Nachricht senden Benutzer-Profile anzeigen


ElBarto
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 27
Anmeldedatum: 27.09.10
Wohnort: Bamberg
Version: R2009b
     Beitrag Verfasst am: 02.11.2010, 09:49     Titel:
  Antworten mit Zitat      
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!

Code:

clc
clear all

for n=1:1:20
    assignin('base',['ET' num2str(n)],0) % Vorbesetzung der Variablen ET1-ET20 in Speicher 'base'
end;

% Erzeugung der Oberschwingungsamplituden in Prozent (für Rechtecksignal)
ET2=100/3;
ET4=100/5;
ET6=100/7;
ET8=100/9;
ET10=100/11;
ET12=100/13;
ET14=100/15;
ET16=100/17;
ET18=100/19;
ET20=100/21;

% Grundschwingungseffektivwert Leiter-Leiter
ETgs=400000;

t=0:0.00001:0.04;

% Berechnen der Spannungsverläufe für Grundschwingung 50Hz (das funktioniert noch!)
u1=sqrt(2)/sqrt(3)*ETgs*sin(2*pi*50*t);
u2=sqrt(2)/sqrt(3)*ETgs*sin(2*pi*50*t-2*pi/3);
u3=sqrt(2)/sqrt(3)*ETgs*sin(2*pi*50*t-4*pi/3);

% Aufaddition der Oberschwingungen
 for n=1:1:20
 amp=sqrt(2)/sqrt(3)/100*eval(['ET' num2str(n)])*ETgs;
 osfkt_L1=amp*sin(2*pi*50*(n+1)*t);
 osfkt_L2=amp*sin(2*pi*50*(n+1)*t-(n+1)*2*pi/3);
 osfkt_L3=amp*sin(2*pi*50*(n+1)*t-(n+1)*4*pi/3);
 u1=u1+osfkt_L1;
 u2=u2+osfkt_L2;
 u3=u3+osfkt_L3;
 end;

plot(t, u1, 'r', t, u2, 'g', t, u3, 'b')


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.


Bin für jede Hilfe dankbar!
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 02.11.2010, 16:34     Titel:
  Antworten mit Zitat      
Hallo ElBarto,

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:
Code:

u1=sqrt(2)/sqrt(3)*ETgs*sin(2*pi*50*t);
u2=sqrt(2)/sqrt(3)*ETgs*sin(2*pi*50*t-2*pi/3);
u3=sqrt(2)/sqrt(3)*ETgs*sin(2*pi*50*t-4*pi/3);
 


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.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
ElBarto
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 27
Anmeldedatum: 27.09.10
Wohnort: Bamberg
Version: R2009b
     Beitrag Verfasst am: 15.11.2010, 12:18     Titel:
  Antworten mit Zitat      
Hallo Jan,

erstmal danke für deine Antwort.

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?

Damit wäre mir schon sehr geholfen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 17.11.2010, 12:49     Titel:
  Antworten mit Zitat      
Hallo ElBarto,

Zitat:
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.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
ElBarto
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 27
Anmeldedatum: 27.09.10
Wohnort: Bamberg
Version: R2009b
     Beitrag Verfasst am: 17.11.2010, 22:11     Titel:
  Antworten mit Zitat      
Okay, ich nehm das mal als Auftrag mit, hab nämlich selber langsam Probleme da durchzusteigen Shocked 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 Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
ElBarto
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 27
Anmeldedatum: 27.09.10
Wohnort: Bamberg
Version: R2009b
     Beitrag Verfasst am: 30.11.2010, 16:57     Titel:
  Antworten mit Zitat      
Lösung gefunden - endlich!!

Ich habe statt (wie hier)

Code:

u1=sqrt(2)/sqrt(3)*ETgs*sin(2*pi*50*t);
u2=sqrt(2)/sqrt(3)*ETgs*sin(2*pi*50*t-2*pi/3);
u3=sqrt(2)/sqrt(3)*ETgs*sin(2*pi*50*t-4*pi/3);
 


die Phasenverschiebung in der Form sin(2*pi*f*t-phi) anzugeben, das ganze so realisiert:

Code:

u1=sqrt(2)/sqrt(3)*ETgs*sin(2*pi*50*t);
u2=sqrt(2)/sqrt(3)*ETgs*sin(2*pi*50*(t-0.02/3));
u3=sqrt(2)/sqrt(3)*ETgs*sin(2*pi*50*(t-2*0.02/3));
 


Nun wird quasi die Grund- und jede Oberschwingung um den festen Wert 20/3 ms nach vorn oder hinten verschoben, je nach Phase.
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.