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

Formeln aus einer Klasse ansprechen

 

Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 03.12.2014, 18:42     Titel:
  Antworten mit Zitat      
Hallo,

Code:
heute = floor(now);
t = heute:1/(24*60):heute+1;
c = cellstr(datestr(t, 'HH:MM'));


heute+1 kannst du durch einen beliebigen Endzeitpunkt ersetzen.

Allerdings geht es nie bis 24:00, sondern nach 23:59 kommt 00:00. Das ist m.E. aber so korrekt.

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


Osterwma
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 38
Anmeldedatum: 01.12.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.12.2014, 17:28     Titel:
  Antworten mit Zitat      
Hi Harald,

vielen Dank für die Antwort.

Da ich jetzt mit unterschiedlichen Daten-Typen rechne, bekomme ich die Fehlermeldung: Undefined function 'minus' for
input arguments of type 'cell'.

Folgendes will ich machen:

Code:
     

heute = floor(now);
t = heute:1/(24*60):heute+1;
c = cellstr(datestr(t, 'HH.MM'));

CET = 01.00;
Longitude = 42.23;

 
           LMT = c-CET+((4*Longitude)/60);


Lasse ich das "cellstr" weg, bekomme ich eine nicht brauchbare Matrix mit 5 Spalten raus...

Wie kann ich den Daten-Typ verändern bzw. von vornherein so einstellen, dass die Rechnung durchläuft?

Vielen Dank & einen schönen Abend

Martin
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 08.12.2014, 21:28     Titel:
  Antworten mit Zitat      
Hallo,

verwendest du schon R2014b?
Die neuen datetime und duration-Objekte dürften dir da sehr weiterhelfen.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 38
Anmeldedatum: 01.12.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.12.2014, 22:08     Titel:
  Antworten mit Zitat      
Hi,

leider nicht, bin noch mit der 2013ner Version unterwegs Sad

Grüße

Martin
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 09.12.2014, 16:23     Titel:
  Antworten mit Zitat      
Hallo,

dann wird dir nichts anderes übrig bleiben, als für Berechnungen das datenum-Format zu verwenden und für die Darstellen das datestr-Format, und bei Bedarf zwischen beiden hin- und her zu konvertieren.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 38
Anmeldedatum: 01.12.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.12.2014, 17:27     Titel:
  Antworten mit Zitat      
Hi Harald,

hab das jetzt soweit hinbekommen.
Nur eine if else Funktion bereitet mir noch Schwierigkeiten...

Code:
      function cSolA(obj, SolH, Latitude, SolDecl, TCT, Limit)
         if TCT<Limit
               obj.SolA = 180-asind(((sind(SolH).*sind(Latitude))-sind(SolDecl))./(cosd(SolH).*cosd(Latitude)));
         else
               obj.SolA = 180+asind(((sind(SolH).*sind(Latitude))-sind(SolDecl))./(cosd(SolH).*cosd(Latitude)));
         end
       end


TCT ist ein Vektor der von -0.4137 bis 23.00 hochläuft.
Solange TCT kleiner als das Limit = 12 ist, soll die "if" function ausgeführt werden. Alles darüber mit "else"

Aktuell wird aber immer "else" ausgeführt.
Kannst du mir sagen, wo der Fehler stecken könnte? Gerne kann ich auch nochmal den gesamten Code hochladen, falls nötig...

Vielen Dank & Grüße

Martin
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

wenn TCT ein Vektor ist, dann heißt
Code:

dass alle Elemente die Bedingung erfüllen müssen.

Du musst also entweder eine Schleife verwenden oder logical indexing.

Im vorliegenden Fall verstehe ich das aber auch einfach nicht. Was soll denn passieren, wenn manche Elemente größer sind und manche kleiner? Sollen dann beide Anweisungen ausgeführt werden? Das eine würde doch das andere überschreiben?

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 38
Anmeldedatum: 01.12.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.12.2014, 10:30     Titel:
  Antworten mit Zitat      
Hi Harald,

jetzt verstehe ich was du meinst.

Also das Problem ist, dass in Abhängigkeit von TCT die einzelnen Elemente des zu berechnenden Vektors SolA mal durch die 180-asind(.... Formel und mal durch die 180+asind((.... Formel berechnet werden müssen.

Soll heißen, die if Funktion schaut sich nacheinander die Einträge in TCT an und entscheidet dann ob 180-asind oder 180+asind angewendet werden muss, um den Vektor SolA zu erstellen.
Code:

TCT(      11.58         11.59          12.00            12.01.....)
SolA(  180-asind   180-asind   180+asind   180+asind )
 

Jetzt weiß ich aber nicht, wie ich es anstellen kann, dass ab 12.00 Uhr der Vektor nicht einfach wieder überschrieben wird, wie du schon vermutet hast... Von Schleifen verstehe ich leider noch nicht genug, um einschätzen zu können, ob das der richtige Weg wäre... Falls ja, wie würde der Code hierzu aussehen.

Vielen Dank nochmal. Wüsste nicht, wie ich ohne dich vorrankommen sollte.

Grüße

Martin
Private Nachricht senden Benutzer-Profile anzeigen
 
Osterwma
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 38
Anmeldedatum: 01.12.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.12.2014, 17:11     Titel:
  Antworten mit Zitat      
Hi Harald,

ich habe es über logical indexing hinbekommen, indem ich TCT in zwei Vektoren mit 1 und 0 aufgeteilt habe ( 1 für TCT<0 im anderen 1 für TCT>0) und mit den ehmaligen if else Funktionen multipliziert habe...

Klappt auf den ersten Blick super Smile


Jetzt bin ich aber doch an den Punkt angelangt, wo eine Schleife wahrscheinlich notwendig wird.

Ich kann jetzt die Photovoltaik Leistung berechnen und habe einen Vektor mit dem elektrischem Verbrauch ( jeweils 1x525600 double ).

Jetzt soll immer wenn der Verbrauch kleiner ist als die PV-Erzeugung die überschüssige Energie in einer Batterie gespeichert werden.
Umgekehrt soll die gespeicherte Batterie abgerufen werden, wenn der Verbrauch über der Erzeugung liegt.

Also eine klassische If Else Bedingung. Allerdings besteht hier wieder das Problem, dass der Vektor wieder komplett überschrieben wird, sobald sich die Bedingung ändert.


Code:

Akt_Bat=Akt_Bat+PV_Produktion-Elektrischer_Verbrauch
 

In Worten: Der aktuelle Batteriestatus ergibt sich aus dem aktuellen Batterie Status der vorherigen Minute( also dem vorherigen errechneten Element im Akt_Bat Vektor ) plus PV_Produktion minus elektrischer Verbrauch.

Können ja erstmal so tun, als ob die Batterie nach oben und nach unten keine Speicherbegrenzungen hat.

Ich hoffe das ist einigermaßen verständlich Sad

Kann man dies mithilfe einer Schleife berechnen? Wie würde das dann aussehen?

Vielen Dank für die Rückmeldung.

Grüße

Martin
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 18.12.2014, 19:34     Titel:
  Antworten mit Zitat      
Hallo,

also so?

Code:
Akt_Bat = [Akt_Bat_0, zeros(1, numel(PV_Produktion))];
for I = 2:numel(PV_Produktion)+1
Akt_Bat(I)=Akt_Bat(I-1)+PV_Produktion(I)-Elektrischer_Verbrauch(I);
Akt_Bat(I) = min(Akt_Bat(I), Akt_Bat_max);
Akt_Bat(I) = max(Akt_Bat(I), Akt_Bat_min);
end


Ansonsten bitte nochmal erklären.
Wenn eine Frage nichts mehr mit dem restlichen Thread zu tun hat, dann lohnt es sich oft, einen neuen aufzumachen. Dann fühlen sich auch andere berufen, beizutragen.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 38
Anmeldedatum: 01.12.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.12.2014, 17:29     Titel:
  Antworten mit Zitat      
Hi Harald,

vielen Dank für die Antwort. Mit ein paar Anpassungen konnte ich das gut einbauen...

Hast allerdings recht, was den Thread betrifft.
Sollten weitere Fragen auftauchen, kommen die in einen Neuen.

An dieser Stelle nochmals vielen Dank für deine Hilfe & einen guten Rutsch ins neue Jahr.

Viele Grüße

Martin
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite Zurück  1, 2

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.