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

Iteration optimieren

 

Mamachacka
Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 21.05.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.05.2015, 17:00     Titel: Iteration optimieren
  Antworten mit Zitat      
Hallo,

ich habe mittels Profiler den Bottleneck meines Programms identifiziert und möchte mir nun Tipps geben lassen, um den Code zu beschleunigen:
Code:
tic;
for i=1:100000
   
    Pi_1 = integral(funct1, 0 , c1_0);
    Pi_2 = integral(funct2, 0 , c2_0);
   
    if abs(Pi_1-Pi_2) >= 0.005 && Pi_1-Pi_2 < 0      % große Differenz = größere Schritte, um Rechenzeit zu sparen              
        c1_0 = c1_0 + 0.005;
    elseif abs(Pi_1-Pi_2) <= 1E-4   % Abbruchbedingung
        toc;
        disp(i)
        break;
    elseif Pi_1-Pi_2 > 0
        c1_0 = c1_0 - 5E-6;
    else
        c1_0 = c1_0 + 5E-5;
    end

    c2_0 = c2/(1-(c1/c1_0));
end

c0 = [c1_0, c2_0];                  % Ergebnisse speichern und zurückgeben


Kurze Erklärung:
Ich muss die Werte c1_0 (und damit c2_0) ermitteln, bei dem die Integrale Pi_1 und Pi_2 gleich groß sind. Also die Differenz von Pi_1-Pi_2 beträgt 0.
Gibt es eine Funktion in MATLAb, mit der man das ganz einfach berechnen kann? Ich habe schonmal an fzero gedacht, allerdings bekomme ich die Integrale nicht vernünfig implementiert.

Danke!
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: 21.05.2015, 17:04     Titel:
  Antworten mit Zitat      
Hallo,

ja, fzero ist eine gute Idee. Auf den ersten Blick:

Code:
fzero(@(c1_0) integral(funct1, 0 , c1_0) -  integral(funct2, 0 , c2/(1-(c1/c1_0)), c1_0_start);


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

Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 21.05.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.05.2015, 19:28     Titel:
  Antworten mit Zitat      
Hab es mal so gemacht und durchrechnen lassen. Ergebnisse mit fzero gelangen in ähnliche Bereiche, sind aber nicht identisch. Außerdem kommt diese Warnung:
Zitat:
Warning: Reached the limit on the maximum number of intervals in use. Approximate bound on error is 1.0e+00. The integral may not
exist, or it may be difficult to approximate numerically to the requested accuracy.


Die Nullstellensuche ist ja auch stark vom Startwert abhängig. Variiere ich diesen nur geringfügig, so ändert sich schon das Ergebnis.
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: 21.05.2015, 21:56     Titel:
  Antworten mit Zitat      
Hallo,

ein reproduzierbares Code-Beispiel wäre hilfreich.

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

Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 21.05.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.05.2015, 11:46     Titel:
  Antworten mit Zitat      
Code:
c1 = 5.0;
c2 = 2.0;
c1_0_start = c1*2;
a = [9.371;34.0041];
b = [0.0366;0.0085];

funct1 = @(c1_0) a(1,1).*(b(1,1).*c1_0)./(c1_0.*(1+b(1,1).*c1_0));
funct2 = @(c1_0) a(2,1).*(b(2,1).*(c2./(1-(c1./c1_0))))./((c2./(1-(c1./c1_0))).*(1+b(2,1).*(c2./(1-(c1./c1_0)))));

c1_0 = fzero(@(c1_0) integral(funct1,0,c1_0) - integral(funct2,0, (c2/(1-(c1/c1_0)))), c1_0_start);

c2_0 = c2/(1-(c1/c1_0));
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: 22.05.2015, 15:41     Titel:
  Antworten mit Zitat      
Hallo,

weißt du denn, in welchem Bereich c1_0 sinnvollerweise liegt?
Die Funktionen haben ja Unendlichkeitsstellen, und da ist es natürlich schwierig bis unmöglich, das Integral zu bestimmen.

Am besten wird fzero arbeiten, wenn du statt eines Startpunktes ein Intervall mit Vorzeichenwechsel angeben kannst.

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

Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 21.05.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.05.2015, 13:56     Titel:
  Antworten mit Zitat      
Leider kann man keine Vorraussage machen, in welchem engeren Bereich der Wert liegt.

Ich hab es nochmal mit der option
Code:
fzero(@(c1_0) integral(funct1,0,c1_0) - integral(funct2,0, (c2/(1-(c1/c1_0)))), c1_0_start, optimset('TolX',1E-4));

probiert. Leider kommt die gleiche Fehlermeldung.
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: 26.05.2015, 14:39     Titel:
  Antworten mit Zitat      
Hallo,

die Option hilft nur, eine bereits gefundene Nullstelle genauer zu bestimmen.

Es muss kein engerer Bereich vorgegeben werden; ungefähre Anhaltspunkte reichen.
Ist z.B. c1_0 < 0 sinnvoll? Wenn über Unendlichkeitsstellen einer Funktion hinweg integriert wird, ist es jedenfalls nicht verwunderlich, wenn es zu Problemen kommt.
Code:
f = @(c1_0) integral(funct1,0,c1_0) - integral(funct2,0, (c2/(1-(c1/c1_0))));
fplot(f, [-100, 100])


Code:
x = -100:0.001:100;
subplot(2, 1, 1), plot(x, funct1(x))
subplot(2, 1, 2), plot(x, funct2(x))


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

Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 21.05.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.05.2015, 15:30     Titel:
  Antworten mit Zitat      
Okay, genau das ist das Problem. Die Funktion 2 hat eine Polstelle im Intervall.
Damit scheint fzero wohl auszuscheiden, oder?

PS: c1_0 > c1 muss immer gelten
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.