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

Fourierreihe

 

Matlabneuling

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.04.2009, 11:00     Titel: Fourierreihe
  Antworten mit Zitat      
Hi Leute,

ich soll mit Matlab ein Script zur Fourierreihenentwicklung schreiben.

Mein Problem ist, dass normalerweise bei größerer Laufzahl m die Annäherung an die Ursprungsfunktion besser wird. Bei mir ist es nicht so, weiß nicht genau wo der Fehler steckt. Wenn ich statt der unten aufgeführten absschnittsweisen definierten Fkt. einen Rechteckimpuls (square) nehme, sieht die Annäherung schon gut aus. Aber ich habe wiederrum das Problem mit der Annäherung.

Hoffe ihr könnt mir helfen.





Code:
function [] = fourierreihe ()

clear


T=6;                                                    % Zeitraum festlegen
DeltaT=2;                                               % Zeitpunkt für 2.Funktion
n=6000;                                                 % Anzahl der Unterteilungen
dt=T/n;                                                 % Zeitraum einer Unterteilung
t0=0:dt:T;
w0=2*pi/T;



Qa0=(2/T)*quad(@myfun,0,T);                          % ao bestimmt


y=Qa0/2;

for m=1:15
    an= @(t0) myfun(t0).*cos(m*t0*w0);
Qan=(2/T)*quad(an,0,T) ;
 
bn= @(t0) myfun(t0).*sin(m*t0*w0);
Qbn=(2/T)*quad(bn,0,T) ;
 
   
    y=y+((Qan*cos(m*t0*w0))+(Qbn*sin(m*t0*w0)));
end

 
 
 
 
 plot(t0,myfun(t0),'r', t0+T,myfun(t0),'r',t0+2*T,myfun(t0),'r',t0,y) ;
   
   
   
   
     
    function f = myfun(t)                                    % periodische Funktion
for k=1:length(t)
        if t(k)<=DeltaT
              f(k)= sin(pi/DeltaT*dt*k);
        elseif (DeltaT<t(k)) && t(k)<T  
              f(k)=1;
        else
            f(k)=0;
        end
end

end
 
   
   
end


Matlabneuling

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.04.2009, 11:56     Titel:
  Antworten mit Zitat      
Beim Durchlaufen ist mir aufgefallen, dass wenn der erste Wert der Funktion 0 ist, versucht meine Reihenentwicklung bis zur nächsten Funktion den Wert bei Null zu halten(in diesem Zeitintervall) und orientiert sich nicht an der tatsächlichen Funktion bei mir eine Sinusfunktion. Im 2. Teilabschnitt ist der Wert 1 und die Reihe strebt dann auch über das komplette Intervall dem Wert 1 zu....

Hoffe es kann mir einer helfen, weiß im Moment nicht so wirklich weiter
 
Titus
Forum-Meister

Forum-Meister


Beiträge: 871
Anmeldedatum: 19.07.07
Wohnort: Aachen
Version: ---
     Beitrag Verfasst am: 14.04.2009, 13:12     Titel:
  Antworten mit Zitat      
Hallo,

der Fehler ist in der Tat ziemlich tricky: Deine myfun-Funktion ist falsch! Sie geht davon aus, dass der Input t immer auf dem ganzen Gitter ist, daher ist das "t" im sin bei Dir "dt*k". Zum Einen müsste es "dt*(k-1)" sein, zum anderen aber ist dt hier nicht immer gleich diff(t) (sondern dt=diff(t0)!). Hier eine angepasste myfun, die richtig rechnet (und dann auch ein vernünftiges Ergebnis erziehlt).
Code:

function f = myfun(t)                                    
   for k=1:length(t)
      if t(k)<=DeltaT
         f(k)= sin(pi/DeltaT*t(k));
      elseif (DeltaT<t(k)) && t(k)<T
         f(k)=1;
      else
         f(k)=0;
      end
   end
 end
 


Folgende Verbesserungen noch: bitte Vektoren immer initialisieren! Also vor der for-Schleife einfach
Code:


Oder aber gleich ganz vektorisieren mittels logischer Indizierung:
Code:

function f = myfun1(t)  
   f = zeros(size(t));
   t1 = t<=DeltaT;
   f(t1) = sin((pi/DeltaT)*t(t1));
   t2 = DeltaT<t & t<T;
   f(t2) = 1;
 end


Titus
Private Nachricht senden Benutzer-Profile anzeigen
 
Matlabneuling

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.04.2009, 13:32     Titel:
  Antworten mit Zitat      
Vielen Dank Titus,

besonders deine 2. Lösung gefällt mir sehr gut.
 
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 - 2024 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.