function cSolDay(obj, DayNum)
obj.SolDay = 360*(DayNum/365);
end
function cTimeEquation(obj)
obj.TimeEquation = 0.0066+7.3525*cosd(obj.SolDay+85.9)+9.9359*cosd(2*obj.SolDay+108.9)+0.3387*cosd(3*obj.SolDay+105.2);
end
function cSolDecl(obj)
obj.SolDecl = 0.3948-23.2559*cosd(obj.SolDay+9.1)-0.3915*cosd(2*obj.SolDay+5.4)-0.1764*cosd(3*obj.SolDay+26);
end end
hat, dann muss auch wirklich eine Instanz der Klasse zur Verfügung gestellt werden, d.h. der Aufruf erfolgt entsprechend der Signatur.
Die Fehlermeldung will sagen: es gibt auch Methoden, die nicht auf einer Instanz einer Klasse arbeiten. Diese müssen dann aber als statische Methoden deklariert werden:
Das willst du aber z.B. bei deinen Methoden nicht, denn aus der Implementierung schließe ich ja, dass sie sehr wohl mit Instanzen der Klasse arbeiten sollen.
Bottom Line: du musst eine Instanz der irradiance-Klasse erstellen und diese an die Methoden übergeben.
vielen Dank für die schnelle Antwort. Ich glaube ich habe etwas Grundlegendes noch nicht ganz verstanden. Ich habe das Beispiel für mich nochmal vereinfacht:
In der Klasse irradiance2 soll SolDay ausgerechnet werden. Dies soll für jeden Tag im Jahr geschehen.
Bei jedem Mal soll nun die Methode cSolDay durchgeführt werden.
Als Ergebnis müsste jetzt eine 1x366 Matrix herauskommen.
ich lege vor der Berechnung über s=irradiance2 die Instanz an.
Oder muss DayNum gar nicht in der Klasse irradiance2 als Objekt definiert werden, wenn die Berechnung in der main geschieht?
eine Möglichkeit wäre wie angedeutet ein Array von Objekten.
Alternativ die Klasse so aufsetzen, dass intern ein Array von Zeitstempeln abgespeichert ist.
Eine ganz andere Frage: für diese Anwendung scheint mir der objektorientierte Ansatz etwas übertrieben - nutzt du das Beispiel zur Einarbeitung, oder gibt es Gründe, warum du diese Sache objektorientiert umsetzen willst.
Wenn du eine Handle-Klasse definierst, ist es übrigens nicht nötig, das Objekt zurückzugeben: du arbeitest ja direkt auf dem Objekt.
ich arbeite mich gerade im Rahmen einer Hausarbeit in Matlab ein.
Ziel dieser ganzen Anwendung ist die Berechnung des Sonnenstandes und der daraus resultierenden Sonneneinstrahlung. Diese scheint auf ein Photovoltaik-Modul, dessen Leistung es zu berechnen gilt.
Daher dachte ich, macht der objektoerientierte Ansatz Sinn. Kannst mich aber auch gerne eines besseren belehren, wenn es dort schönere Umsetzungen gibt Simulink kommt erst später dran, da kenne ich mich noch gar nicht mit aus...
Könntest du mir das Array für das Beispiel kurz als Code schreiben? Da komm ich ohne Fehlermeldung aktuell noch nicht zum Ziel...
das hoffe ich
Ich muss aber dazu sagen, dass der Code noch nicht vollständig läuft, da ich z.T. noch ein Vektor aus einer externen Datei einlesen muss und eine Variable nicht vollständig definiert habe. Ich hab aber an den Stellen ein Kommentar eingefügt.
Klasse Irradiance zur Berechnung der Sonneneinstrahlung:
Code:
classdef irradiance < handle
% Calculation solar irradiance
SolDay; %Length of solar day
DayNum; % day of the year
TimeEquation;
SolDecl;
LMT; % Local medium Time
LT; %Local Time, 1for MEZ
CET = 1; % Central European Time
Latitude = 52.52; % degree of latitude
Longitude = 13.41; % degree of longitude
TCT;
HourAngle;
SolH; % solar altitude
SolA; % solar azimuths
AoI_Hor; % Angel of incidence horizontal
AoI_Gen; % Angel of incidence inclined
incl_Gen = 30; % inclination by user
E_G_hor; % global radiation horizontal --> Hier soll eine Datein eingelesen werden, mit minütlichen Werten (hab ich noch nicht fertig)
E_diff_hor; % diffuse radiation horizontal
E_diff_gen; % diffuse radiation inclined
E_dir_hor; % direct radiation horizontal
E_refl_gen; % reflected radiation inclined
E_G_gen; % global radiation inclined
function obj = cSolDay(obj, DayNum)
obj.SolDay = 360*(DayNum/365);
end
function cTimeEquation(obj)
obj.TimeEquation = 0.0066+7.3525*cosd(obj.SolDay+85.9)+9.9359*cosd(2*obj.SolDay+108.9)+0.3387*cosd(3*obj.SolDay+105.2);
end
function cSolDecl(obj)
obj.SolDecl = 0.3948-23.2559*cosd(obj.SolDay+9.1)-0.3915*cosd(2*obj.SolDay+5.4)-0.1764*cosd(3*obj.SolDay+26);
end
function cLMT(obj, LT, CET, Longitude)
obj.LMT = LT-CET+((4*Longitude)/60); %Time as 00.00 o'clock end
function cTCT(obj, LMT, TimeEquation)% True Central Time
obj.TCT = LMT+TimeEquation/100;
end
function cHourAngle(obj, TCT)% Hour Angle
obj.HourAngle = (12.00-TCT)*15;
end
function cSolH(obj, HourAngle, Latitude, SolDecl)
obj.SolH = asind(cosd(HourAngle)*cosd(Latitude)*cosd(SolDecl)+sind(Latitude)*sind(SolDecl));
end
Ich hatte jetzt erstmal nur den Funktions-aufruf für SolDay geschrieben, um dies auszuprobieren...
Aber im Grunde müssen alle Formeln/Funktionen für alle Minutenschritte durchgerechnet werden... Dafür den Loop einzufügen, scheitere ich bisher... Mehr hab ich bisher nicht
wenn ich den Code laufen lasse, beklagt sich MATLAB weiterhin über das fehlende s.
Vielleicht habe ich mich falsch ausgedrückt: der entscheidende Punkt ist nicht, dass du deinen gesamten Code zur Verfügung stellst, sondern dass man das, was du zur Verfügung stellst, auch laufenlassen kann, damit man das Problem sieht und Lösungen direkt testen kann.
Wenn ich den die Main jetzt laufen lasse, ist Matlab Busy ohne Ende...
Die Frage ist, was ich bei dem Array falsch mache? Wie gesagt, ich brauche als Ergebnis für jede Minute im Jahr einen Wert für SolDay, welche im Workspace auch als SolDay (Matrix) gespeichert wird. Im nächsten Schritt würde dann die cTimeEquation Funktion mit den ausgerechneten SolDay Werten weiterrechnen(siehe Post gestern 16.50 Uhr)... Aber wichtig für mich ist erstmal, dass wir für SolDay die minütlichen Werte rausbekommen.
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.