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

if in for Funktioniert nicht

 

ECO
Forum-Anfänger

Forum-Anfänger


Beiträge: 37
Anmeldedatum: 07.07.13
Wohnort: Berlin
Version: R2014b (Mac)
     Beitrag Verfasst am: 11.12.2013, 23:40     Titel: if in for Funktioniert nicht
  Antworten mit Zitat      
Hi Leute

ich sitze an einem Programm zur Berechnung der Sonnenposition.
In der For-Schleife ist zum Schluss noch ein If-else Bedingung eingebaut,
jedoch funktioniert es einfach nicht wie ich will. Entweder wird nur

SAz = 180 - b oder SAz = 180 + b (hier wäre es nur ersteres)

über einen Intervall, den ich mit LT = Anfangswert:Endwert, berechnet.

Code:


function sundata2(lambdag,phig,TZ,DOY,LT)

   J = 360 *(DOY/365);                                                                                                                    % Einheit in Grad

   delta = (0.3948-23.2559*cosd(J*9.1)- 0.3915*cosd(2*J+5.4)-0.176*cosd(3*J+26));                       % Einheit in Grad

   TEQ = (0.0066+7.3525*cosd(J+85.9)+9.9359*cosd(2*J+108.9)+0.3387*cosd(3*J +105.2));           % Einheit in min
 
   for  TLT = (LT - TZ)*60 + 4*lambdag - TEQ;                                                                                   % Einheit in min
 
        w   = (12 - TLT/60)*15;                                                                                                           % Einheit in Grad

        Ys  = asind(cosd(w)*cosd(phig)*cosd(delta)+sind(phig)*sind(delta));                                         % Einheit in Grad

        a   = sind(Ys);
   
        Am  = 1\a;                                                                                                                             % Einheitenlos

        b   = acosd((sind(Ys)*sind(phig)-sind(delta))/(cosd(Ys)*cosd(phig)));

         if TLT<=12
            SAz = 180 - b;

         elseif TLT>12
            SAz = 180 + b;

          end
       
         
        plot(SAz,Ys,'*');
        grid on;
        hold on;
    end

end
 


Kann einer mir bitte helfen.
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 12.12.2013, 00:20     Titel:
  Antworten mit Zitat      
Hallo,

bitte Beispielparameter für einen Funktionsaufruf zur Verfügung stellen, bei dem das Problem auftritt.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
ECO
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 37
Anmeldedatum: 07.07.13
Wohnort: Berlin
Version: R2014b (Mac)
     Beitrag Verfasst am: 12.12.2013, 01:26     Titel:
  Antworten mit Zitat      
das ist meine Vorgabe

sundata2(13.2,52.3,2,172,6:20)
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 12.12.2013, 10:57     Titel:
  Antworten mit Zitat      
Hallo,

mit dieser Vorgabe bekomme ich:

( (LT - TZ)*60 + 4*lambdag - TEQ )'
ans =
294.41
354.41
414.41
474.41
534.41
594.41
654.41
714.41
774.41
834.41
894.41
954.41
1014.4
1074.4
1134.4

TLT ist also in jeder Iteration der Schleife > 12, daher wird immer dieser Teil der if-Anweisung ausgeführt.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
ECO
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 37
Anmeldedatum: 07.07.13
Wohnort: Berlin
Version: R2014b (Mac)
     Beitrag Verfasst am: 12.12.2013, 11:20     Titel:
  Antworten mit Zitat      
Hi,

das kann ich dir nicht sagen Harald, ich habe die Werte noch
nicht einzeln ausgelesen. Aber wenn dem so ist muss ich
meine Bedingung bei if ändern bzw. TLT noch durch 60 teilen
um die Werte in Stunden zu kriegen. Ich versuche das hinzukriegen
und melde mich wieder.

Die folgenden Anhänge zeigen dir woher ich die Formeln habe bzw.
was ich versuche zu Implementieren. Und im dritten Bild siehst du wie das
ganze aussehen sollte. I

Bildschirmfoto 2013-12-12 um 10.05.29.png
 Beschreibung:

Download
 Dateiname:  Bildschirmfoto 2013-12-12 um 10.05.29.png
 Dateigröße:  123.9 KB
 Heruntergeladen:  348 mal
Bildschirmfoto 2013-12-12 um 10.05.47.png
 Beschreibung:

Download
 Dateiname:  Bildschirmfoto 2013-12-12 um 10.05.47.png
 Dateigröße:  121.07 KB
 Heruntergeladen:  377 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
ECO
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 37
Anmeldedatum: 07.07.13
Wohnort: Berlin
Version: R2014b (Mac)
     Beitrag Verfasst am: 12.12.2013, 11:58     Titel:
  Antworten mit Zitat      
Hi,

Harald herzlichen Dank, das mit dem TLT war genial. Die If Bedingung
funktioniert. Nun habe irgendwo einen Fehler der die Amplitude meiner Funktion
um ca. 20 senkt.
Ich denke das liegt irgendwo am Bogen- und Gradmaß den ich benutzt habe.


Gruß, Eco

Code:


function sundata2(lambdag,phig,TZ,DOY,LT)

   J = 360 *(DOY/365);                                                                                                                   % Einheit in Grad

   delta = (0.3948-23.2559*cosd(J*9.1)- 0.3915*cosd(2*J+5.4)-0.176*cosd(3*J+26));                      % Einheit in Grad

   TEQ = (0.0066+7.3525*cosd(J+85.9)+9.9359*cosd(2*J+108.9)+0.3387*cosd(3*J +105.2));          % Einheit in min
 
   for  TLT = (LT - TZ)*60 + 4*lambdag - TEQ;                                                                                  % Einheit in min
 
        w   = (12 - TLT/60)*15;                                                                                                          % Einheit in Grad

        Ys  = asind(cosd(w)*cosd(phig)*cosd(delta)+sind(phig)*sind(delta));                                         % Einheit in Grad

        %a   = sind(Ys);
   
        Am  = 1\sin(Ys);   %a                                                                                                              % Einheitenlos
                 
        b   = acos((sind(Ys)*sind(phig)-sind(delta))/(cosd(Ys)*cosd(phig)));

        TLT = TLT/60;
       
         if TLT<=12
            SAz = 180 - b;
         elseif TLT>12
            SAz = 180 + b;      
          end
           
        plot(SAz,Ys,'*');
        grid on;
        hold on;
    end

end
 
Private Nachricht senden Benutzer-Profile anzeigen
 
ECO
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 37
Anmeldedatum: 07.07.13
Wohnort: Berlin
Version: R2014b (Mac)
     Beitrag Verfasst am: 17.12.2013, 14:50     Titel:
  Antworten mit Zitat      
Hi,

habe das Problem mit dem Code gelöst.

Code:


function[Am,Ys,SAz] = sundata(lambdag,phig,TZ,DOY,LT)

   % Day Angle
   J = 360 *(DOY/365);                                                                          

   % Declination
   delta = (0.3948-23.2559*cosd(J+9.1)- 0.3915*cosd(2*J+5.4)-0.176*cosd(3*J+26));              

   % Time Equation
   TEQ = (0.0066+7.3525*cosd(J+85.9)+9.9359*cosd(2*J+108.9)+0.3387*cosd(3*J +105.2));          
 
        % True Local Time
   for  TLT = ((LT - TZ)*60 + 4*lambdag + TEQ)/60;                                                    
 
        % Hour Angle
        w   = (12 - TLT)*15;                                                                
       
        % Sun Elevation
        Ys  = asind(cosd(w)*cosd(phig)*cosd(delta)+sind(phig)*sind(delta));                    
       
        % Air Mass
        Am  = 1/sind(Ys);                                                                      
       
        % Sun Azimuth
        b   = acosd((sind(Ys)*sind(phig)-sind(delta))/(cosd(Ys)*cosd(phig)));
       
         if TLT<=12
            SAz = 180 - b;
         elseif TLT>12
            SAz = 180 + b;
         end
         
    % Output Format    
    plot(SAz,Ys,'r-o');
    title({'Sun Elevation and Azimuth'
           'Berlin(13.2,52.3) on 21.06.2013(172/365)'});  
    xlabel('Azimuth in degrees As');
    ylabel('Attitude Position in degrees Ys');
    grid on;
    hold on;        
   end
end

 


ich würde nur noch gerne die einzelnen Punkte miteinander verbinden,
aber leider Funktioniert es nicht, wie ich es will. Mit dem folgenden Daten

sundata(13.2,52.3,2,172,6:20)

könnt ihr ein Aufruf machen und seht was ich meine.

Gruß Eco
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 17.12.2013, 14:59     Titel:
  Antworten mit Zitat      
wenn er die punkte verbinden soll wäre es sinnvoller in der for schleife die werte erst alle zu speichern und dann auf einmal zu plotten.
grüße
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
ECO
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 37
Anmeldedatum: 07.07.13
Wohnort: Berlin
Version: R2014b (Mac)
     Beitrag Verfasst am: 17.12.2013, 16:03     Titel:
  Antworten mit Zitat      
Hi Winkow

kannst du mir erklären wie ich das machen kann bzw. mir ein Beispiel dazu geben bin ein Matlab Neuling und weiss nicht wie das funktioniert.
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 17.12.2013, 16:59     Titel:
  Antworten mit Zitat      
Hallo

mit Speichern meint Winkow hier, die Werte in einem Vektor aufzusammeln oder in einer Cell:
Code:


function[Am,Ys,SAz] = sundata(lambdag,phig,TZ,DOY,LT)

   % Day Angle
   J = 360 *(DOY/365);                                                                          

   % Declination
   delta = (0.3948-23.2559*cosd(J+9.1)- 0.3915*cosd(2*J+5.4)-0.176*cosd(3*J+26));              

   % Time Equation
   TEQ = (0.0066+7.3525*cosd(J+85.9)+9.9359*cosd(2*J+108.9)+0.3387*cosd(3*J +105.2));          
 
   % True Local Time
   TLT = ((LT - TZ)*60 + 4*lambdag + TEQ)/60;
   %  Vektoren preallokieren
   Ys  = zeros(size(TLT));
   SAz = zeros(size(TLT));
   
   for k = 1:length(TLT)                                                    
 
        % Hour Angle
        w   = (12 - TLT(k))*15;                                                                
       
        % Sun Elevation
        % in Array an der Stelle der Berechnung ablegen
        Ys(k)  = asind(cosd(w)*cosd(phig)*cosd(delta)+sind(phig)*sind(delta));                    
       
        % Air Mass
        Am  = 1/sind(Ys(k));                                                                      
       
        % Sun Azimuth
        b   = acosd((sind(Ys(k))*sind(phig)-sind(delta))/(cosd(Ys(k))*cosd(phig)));
       
         if TLT(k)<=12
            SAz(k) = 180 - b;
         elseif TLT(k)>12
            SAz(k) = 180 + b;
         end    
   end

% Output Format
figure;
plot(SAz,Ys,'r-o');
title({'Sun Elevation and Azimuth'
    'Berlin(13.2,52.3) on 21.06.2013(172/365)'});
xlabel('Azimuth in degrees As');
ylabel('Attitude Position in degrees Ys');
grid on;

 



Man kann aber einen Schritt weiter gehen und die FOR-Loop ganz vektorisieren:


Code:




function[Am,Ys,SAz] = sundata(lambdag,phig,TZ,DOY,LT)

% Day Angle
J = 360 *(DOY/365);

% Declination
delta = (0.3948-23.2559*cosd(J+9.1)- 0.3915*cosd(2*J+5.4)-0.176*cosd(3*J+26));

% Time Equation
TEQ = (0.0066+7.3525*cosd(J+85.9)+9.9359*cosd(2*J+108.9)+0.3387*cosd(3*J +105.2));

% True Local Time
TLT = ((LT - TZ)*60 + 4*lambdag + TEQ)/60;

% Hour Angle
w   = (12 - TLT)*15;

% Sun Elevation
Ys  = asind(cosd(w)*cosd(phig)*cosd(delta)+sind(phig)*sind(delta));

% Air Mass
Am  = 1./sind(Ys);

% Sun Azimuth
% .* oder ./ bedeutet elementweise Multiplikation bzw Division
b   = acosd((sind(Ys).*sind(phig)-sind(delta))./(cosd(Ys).*cosd(phig)));

SAz = 180 - b;
SAz(TLT>12) = 180 + b(TLT>12);



% Output Format
figure();
plot(SAz, Ys,'r-o');
title({'Sun Elevation and Azimuth'
    'Berlin(13.2,52.3) on 21.06.2013(172/365)'});
xlabel('Azimuth in degrees As');
ylabel('Attitude Position in degrees Ys');
grid on;

 
Private Nachricht senden Benutzer-Profile anzeigen
 
ECO
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 37
Anmeldedatum: 07.07.13
Wohnort: Berlin
Version: R2014b (Mac)
     Beitrag Verfasst am: 17.12.2013, 21:47     Titel:
  Antworten mit Zitat      
Ok ich denke ich habe es verstanden.
Mit ein wenig Übung müsste ich diese Art der Denkweise
innehaben.

Vielen Dank nochmals an alle.

Gruß Eco
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.