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

Optimierung eines Durschnittswert

 

General_Griboz
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 66
Anmeldedatum: 05.04.17
Wohnort: ---
Version: R2016b
     Beitrag Verfasst am: 04.05.2017, 15:52     Titel: Optimierung eines Durschnittswert
  Antworten mit Zitat      
Moin,

ich habe eine Reihe von Werten in einem Vektor gespeichert. Mit mean kann ich von allen Werten, in diesem Vektor, den Mittelwert bestimmen. Nun möchte ich aber eine Grenze für den Mittelwert vorgeben und er soll möglichst viele Werte aus meinem Vektor nehmen.

Folgendes habe ich bereits:

Code:
RPZ=[20,30,45,10,50,70,15,5,65,25];

maxRPZ=15;
kk=0;
StartRPZ=0;
meanRPZ=0;
ii=0;
jj=[];
dd=[];
while ii<length(RPZ)

    if meanRPZ>maxRPZ  
        kk=kk-1;
       StartRPZ=StartRPZ-RPZ(ii);
       meanRPZ=(StartRPZ)/(kk);
       dd=vertcat(dd,ii);
    else
       ii=ii+1;
        kk=kk+1;
        StartRPZ=StartRPZ+RPZ(ii);
        meanRPZ=(StartRPZ)/kk;
        if meanRPZ>maxRPZ  
        else
        jj=vertcat(jj,ii);
        end
    end
end


In jj schreibt er die Zeilen rein, der Werte, die er zum berechnen benutzt hat und in dd alle nicht benutzten. Problem ist, wenn ich jetzt als maxRPZ=20 eingebe, bekomme ich auch einen Wert, das ist aber nicht der beste, da wenn er bestimmte Werte erst später benutzt zum ausrechnen des Mittelwerts, der Mittelwert nicht das Maximum überschreitet und die Anzahl der benutzten Werte wird größer.

Gibt es für so eine Optimierung, vllt sogar schon etwas vorgefertigtes von matlab, wo man nur die Werte und die Grenze eingibt?

Ich hoffe mein Problem ist klar geworden.
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


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

ich würde den Algorithmus so anpassen, dass iterativ das Maximum des verbleibenden Vektors eliminiert wird.

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 66
Anmeldedatum: 05.04.17
Wohnort: ---
Version: R2016b
     Beitrag Verfasst am: 05.05.2017, 10:30     Titel:
  Antworten mit Zitat      
Moin,

ich habe eine Lösung gefunden. Ein bisschen habe ich mich an deiner Idee orientiert.

Hier ist der Code, mit einem Beispiel.

Code:
RPZ=[20,30,45,10,50,70,15,5,65,25,30,45,100,150,5,6,11,13];

maxRPZ=25;
kk=0;
StartRPZ=0;
meanRPZ=0;
jj=[];
dd=[];

for ii=1:length(RPZ)
if RPZ(ii)<=maxRPZ
kk=kk+1;
StartRPZ=StartRPZ+RPZ(ii);
meanRPZ=StartRPZ/kk;
jj=vertcat(jj,ii);
else
    dd=vertcat(dd,ii);
    ff=1;
    while ff<=length(dd)
        if maxRPZ>=(StartRPZ+RPZ(dd(ff)))/(kk+1)
            kk=kk+1;
            StartRPZ=StartRPZ+RPZ(dd(ff));
            meanRPZ=StartRPZ/kk;
            jj=vertcat(jj,dd(ff));
            dd(ff,:)=[];
            ff=ff+1;
        else
         ff=ff+1;
        end
   
    end
end
end


Vielleicht geht das auch noch eleganter und effizienter, denn im Moment geht er den Vektor dd immer durch, wenn die erste if Bedingung nicht stimmt.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

möchtest du nun
a) den Mittelwert beschränken und schauen, welche Werte du dazu verwenden kannst, oder
b) den Mittelwert aller Werte unterhalb eines Werts berechnen?

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 66
Anmeldedatum: 05.04.17
Wohnort: ---
Version: R2016b
     Beitrag Verfasst am: 05.05.2017, 10:45     Titel:
  Antworten mit Zitat      
Moin Harald,

ich möchte den Mittelwert beschränken und dann schauen, welche Werte ich dazu benutzen kann. Und die Anzahl der Werte, die ich benutzen kann soll maximal sein.

Wie ich es gesehen habe, macht er das bisher auch. Sieht nur nicht so schön aus.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

vielleicht verstehe ich die Aufgabenstellung ja nicht.

Ich würde es so versuchen:
Code:
RPZ=[20,30,45,10,50,70,15,5,65,25,30,45,100,150,5,6,11,13];

maxRPZ=25;
jj2 = 1:numel(RPZ);
while mean(RPZ(jj2)) > maxRPZ
    [~, biggest] = max(RPZ(jj2));
    jj2(biggest) = [];
end
mean(RPZ(jj2))


jj2 enthält dabei mehr Werte als dein jj, und man kommt genau auf den Zielmittelwert.

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 66
Anmeldedatum: 05.04.17
Wohnort: ---
Version: R2016b
     Beitrag Verfasst am: 05.05.2017, 11:58     Titel:
  Antworten mit Zitat      
Moin Harald,

vielen Dank für deine Antwort und Code. Der Code macht das was ich will ja sogar noch viel besser und schneller.

Damit ist meine Frage, erstmal beantwortet.

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