Der Durchlauf der inneren for-Schleife dauert ca. 47 Sekunden. Das Array "Preise" und "Ascend" bzw. "Descend" sind 86400x31 double Arrays. Dementsprechend existieren 2.678.400 Werte.
Kann ich noch etwas an Rechenzeit mit irgendwelchen Tricks einsparen, oder liegt die lange Rechenzeit wirklich an dem sehr großen Array?
es ist immer einfacher mit einem lauffähigen beispiel zu hantieren. vielleicht kannst du nochmal kurt in worten beschreiben was dein ziel ist matlab code ist zwar meist besser aber beides zusammen kann ja nicht schaden _________________
Zusätzlich wird die Suche nach Descend nur durchgeführt, wenn Ascend nicht gefunden wurde.
Die Arrays sind mit 2.6 Millionen Elementen nicht besonders groß. Ich bin sicher, dass sich das deutlich beschleunigen lässt. Genauer lässt sich das aber nur sagen, wenn ein lauffähiger Code mit realitsischen Testdaten zur Verfügung steht (siehe Winkows Antwort).
%-------------------------------------------------------------------------%
% In dem ersten Teil des Codes wird der Fahrplan der Batterie % anhand der Börsenpreise ermittelt. In einem ersten Schritt % wird abgefragt ob die Einkaufspreise geteilt durch den % Batterie- und Wechselrichterwirkungsgrad < dem Verkaufspreis % mal dem Batterie- und Wechselrichterwirkungsgrad sind. Anhand % der Ergebnisse wird durch Indexabfragen der jeweiligen % Gewinnspanne der Fahrplan der Batterie erstellt.
%-------------------------------------------------------------------------%
for N = 1:31
if(Descend(I,N)*(eta_bat_B*eta_wr_B) - Ascend(I,N)*(1/(eta_bat_B*eta_wr_B))) >= 0% Abfrage ob durch Wirkungsgradverluste Einkaufspreis < Verkaufspreis ist
P(I,N) = Descend(I,N)*(eta_bat_B*eta_wr_B) - Ascend(I,N)*(1/(eta_bat_B*eta_wr_B)); % Gewinn pro Preispaar else
P(I,N) = 0; % Übersteigen die Verluste beim Einkaufen den Verkaufspreis wird kein Preispaar gebildet end end
idx = find(P(:,N) == (min(P(:,N))),1,'first')-1; % Heraussuchen des Indexes des niedrigsten Preispaares > 0
idxAscend = find(Ascend(:,N) == Preise(I,N),1,'last'); % Heraussuchen des Indexes des aktuellen Strompreises im Array der Einkaufspreise
idxDescend = find(Descend(:,N) == Preise(I,N),1,'last'); % Heraussuchen des Indexes des aktuellen Strompreises im Array der Verkaufspreise
if idxAscend <= idx % Wenn Index des aktuellen Strompreises (Einkaufspreis) kleiner als Index des niedrigsten Preispaares
FP(I,N) = 1; % Batterie laden elseif idxDescend <= idx % Wenn Index des aktuellen Strompreises (Verkaufspreis) kleiner als Index des niedrigsten Preispaares
FP(I,N) = -1; % Batterie entladen else
FP(I,N) = 0; % Keine Batterieladung end
So sollte das Programm laufen. Es dauert 838 Sekunden bis das Programm durchlaufen wurde. Die Prealloziierung von FP und P wurde schon vorgenommen. Mit Jans Vorschlag, idxDescend in die if- Abfrage aufzunehmen konnte ich die Rechenzeit auf 727 Sekunden verkürzen.
Vielleicht kann nochwas an der Variablen idx verbessert werden? Ich möchte dort nämlich den letzen Wert > 0 ermitteln und den Index davon übernehmen.
Das Programm kann gestartet werden sobald die Preise im Workspace eingelesen wurden.
da mir grade langweilig ist versuche ich mich mal in die problemstellung reinzudenken. da hab ich noch ne frage.
ich verstehe nicht ganz warum die eingkaufspreise und verkaufspreise die sortierten preise sind. da hängt es bei mir irgendwie.
eine schleife und ein find kann man rauszihen... das hat so gut wie keinen performance gewinn... siht aber finde ich besser im code aus.
ich bin mir fast sicher das man irgendwas mit unique und den rückgabe werten von sort machen kann aber ich verstehe halt die vorgehensweise noch nicht ganz.
_________________
ok das beispiel ist schonmal einfacher vielleicht können wir uns ja gemeinsam da durchhangeln
das beispiel was du gegeben hast läst sich ohne schleife realisieren.
1. Wie kriege ich denn in dem Beispiel FP mehrdimensional?
2. In dem Fall, dass durch die Wirkungsgradverluste Ascend > Descend wird, soll eine 0 in den Fahrplan.
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.