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

Routine integral und Toleranzen

 

math75
Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 23.09.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.08.2018, 15:06     Titel: Routine integral und Toleranzen
  Antworten mit Zitat      
Ich möchte ein Integral mit teurer Berechnung des Integranden mit Hilfe von integral bestimmen und dazu eine Fehlervorgabe machen. Wenn ich (wie im Beispiel der Matlab-Hilfe) ein uneigentliches Integral verwende, funktioniert dies auch tadellos. Beim normalen Riemann-Integral scheint Matlab jedoch die Fehlervorgabe zu ignorieren und immer mit den Standardeinstellungen zu arbeiten (und dann auch viele Funktionswerte zu benötigen). Das Minimalbeispiel

Code:

f = @(t) log(t);
I_true1 = -1;
I_true2 = 3*log(3)-2*log(2)-1;
for k = 2:2:12
  epsi = 10^(-k);
  I1 = integral(f,0,1,'RelTol',0,'AbsTol',epsi);
  I2 = integral(f,2,3,'RelTol',0,'AbsTol',epsi);
  fprintf('%1.1e    %1.4e   %1.4e\n', epsi, abs(I1-I_true1), abs(I2-I_true2))
end
 


erzeugt z.B. bei mir die Ausgabe

1.0e-02 1.7536e-07 1.1102e-16
1.0e-04 1.7536e-07 1.1102e-16
1.0e-06 1.0960e-08 1.1102e-16
1.0e-08 1.7124e-10 1.1102e-16
1.0e-10 6.6880e-13 1.1102e-16
1.0e-12 1.0214e-14 1.1102e-16

Hat jemand eine Idee, ob und wie man das Verhalten ändern kann? Mir scheint ein Bug vorzuliegen; aus dem Quelltext bin ich aber nicht wirklich schlau geworden.
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


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

Zitat:
Beim normalen Riemann-Integral scheint Matlab jedoch die Fehlervorgabe zu ignorieren und immer mit den Standardeinstellungen zu arbeiten

Wie kommst du darauf, dass die Vorgabe ignoriert wird? Bei unterschiedlichen Einstellungen bekommst du ja unterschiedliche Ergebnisse.

Als relative Toleranz 0 vorzugeben ist m. E. für ein numerisches Verfahren nicht sinnvoll. Mich wundert lediglich, dass integral da keine entsprechende Fehlermeldung oder Warnung ausgibt.

Wenn du exakte Ergebnisse haben möchtest, sind symbolische Berechnungen eine Alternative.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
math75
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 23.09.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.08.2018, 16:49     Titel:
  Antworten mit Zitat      
Wenn die relative Toleranz Null gesetzt wird, wertet das Matlab m.E. als "keine Vorgabe".
Genauso wurde es auch im Beispiel in der Matlab-Hilfe gemacht. Ersetzt man die 0 durch epsi ergibt sich aber ein ähnliches Verhalten.

Die zweite Spalte meiner Ausgaben zeigt die Fehler für das uneigentliche Integral von 0 bis 1; dort gehen die Fehler wie gewünscht nach unten.

Die letzte Spalte zeigt die Fehler für das Integral von 2 bis 3, also ein gewöhnliches Riemann-Integral. Dort wird auch bei niedrigen Genauigkeitsanforderungen immer
Maschinengenauigkeit erreicht (immer der gleiche Fehler) mit den entsprechenden Konsequenzen für die Anzahl von Funktionsauswertungen. In diesem Fall scheint Matlab also die Vorgaben zu ignorieren. Oder habe ich Dich falsch verstanden?

Symbolische Berechnungen sind keine Option - mein Integrand ist wirklich teuer zu berechnen, und es geht mir konkret darum, die Anzahl von Auswertungen herunterzudrücken. Die veralteten quad-Routinen erledigen die Aufgabe übrigens korrekt.

Beste Grüße
Mario
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

mir ist die Doku an der Stelle nicht klar. Wenn RelTol = 0 eine besondere Bedeutung hat, sollte das bei der Beschreibung von RelTol erwähnt werden.

Ich habe festgestellt, dass die Funktion bei dem 2. Integral jeweils nur einmal aufgerufen wird, aber mit einem Vektor von x-Werten. Meine Interpretation wäre, dass die Funktion noch wiederholt aufgerufen werden würde, falls das bisherige Ergebnis nicht genau genug ist - was in dem Fall unzutreffend ist.
Unterstützt deine tatsächliche Funktion denn überhaupt vektorwertige Eingaben?

Code:
%f = @(t) log(t);
I_true1 = -1;
I_true2 = 3*log(3)-2*log(2)-1;
for k = 2:2:12
  epsi = 10^(-k);
  clear f
  I1 = integral(@f,0,1,'RelTol',0,'AbsTol',epsi);
  [~, count1] = f(1);
  clear f
  I2 = integral(@f,2,3,'RelTol',0,'AbsTol',epsi);
  [~, count2] = f(1);

  fprintf('%1.1e    %1.4e  %i    %1.4e   %i\n', epsi, abs(I1-I_true1), count1, abs(I2-I_true2), count2)
end

function [y, num] = f(x)
persistent count
if isempty(count)
    count = 0;
end
count = count + 1;
if nargout== 2
    num = count-1;
end

y = log(x);


Mehr kann ich dazu auch nicht sagen. Bei einem vermuteten Bug ist auch immer der Technische Support ein guter Ansprechpartner.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
math75
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 23.09.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.08.2018, 20:08     Titel:
  Antworten mit Zitat      
Das ist in der Tat eigenartig. Ich habe mir mal die Länge des Vektors der Funktionswerte ausgeben lassen und siehe da: genau 150, exakt wie in meinem völlig anders gearteten Originalbeispiel (dort ist der Integrand selbst vektoriell und die Funktion wird mit skalarem t 150 mal aufgerufen). Das sieht irgendwie sehr nach einer Unterschranke an die Anzahl von Funktionswerten aus, die allerdings bei uneigentlichen Integralen nicht implementiert ist. Ich werde morgen im Quelltext mal nach einer 150 suchen - vielleicht kann ich die ja durch eine kleinere Zahl ersetzen oder so Smile.

Jedenfalls herzlichen Dank für Deine Hilfe - der Tipp hat mich weitergebracht.
Private Nachricht senden Benutzer-Profile anzeigen
 
math75
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 23.09.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.08.2018, 20:22     Titel:
  Antworten mit Zitat      
Nachtrag: ja, das scheint's zu sein. Ich habe mal einen schwierigeren Integranden eingebaut, wo man verfeinern muss und lasse die Länge des Arguments ausgeben. 150 ist tatsächlich die initiale Länge und dann wird verfeinert. Jetzt muss ich nur noch die Stelle im Code finden, wo ich das abstellen kann Wink.

Code:

I_true1 = 2/1001;

for k = 2:2:12
  epsi = 10^(-k);
  clear f
  I1 = integral(@f,0,1,'RelTol',0,'AbsTol',epsi);
  [~, count1] = f(1);  

  fprintf('%1.1e    %1.4e    %i\n', epsi, abs(I1-I_true1), count1)
end

function [y, num] = f(x)
persistent count
if isempty(count)
    count = 0;
end
count = count + 1;
if nargout== 2
    num = count-1;
end

y = sin(1001*x);
disp(length(y))
end
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

alternativ mal MathWorks kontaktieren. Wenn man nur eine grobe Abschätzung des Integrals braucht, sind 150 Auswertungen doch recht viele.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

Berichtigung dessen, was ich zu RelTol geschrieben habe:

Unter Tips findet sich die Formel:
abs(q - Q) <= max(AbsTol,RelTol*abs(q))

Für RelTol = 0 bedeutet das
abs(q - Q) <= AbsTol
d.h. es wird nur eine absolute Toleranz verwendet.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
math75
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 23.09.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.08.2018, 13:27     Titel:
  Antworten mit Zitat      
Hallo noch mal,

ich habe mir das Ganze heute vormittag intensiver angeschaut. Der Quelltext für integral ist ja offen. Die Routine integral scheint auf einer adaptiven Gauß-Quadratur (offene Formeln) zu beruhen (Gauß7Konrod15).

Initial fallen wohl pro Teilintervall 15 Funktionsauswertungen an, und die Anzahl dieser Teilintervalle wird mit 10 initialisiert. Grund ist vermutlich, dass lokale Konzentrationen des Integranden sicher erfasst werden sollen. In den von mir als kritisch betrachteten Fällen liefert also bereits das initiale Setting Maschinengenauigkeit, was das beobachtete Verhalten auch erklärt.

Ich habe mir jetzt eine lokale Kopie aller vier beteiligten Matlab-Routinen angelegt
und in der Funktion integralParseArgs.m die Zeile

Code:

s.InitialIntervalCount = 10;
 


entsprechend modifiziert. Dann läuft alles wie von mir erwartet.
Ich denke, damit sollte das Thema dann auch abschließend beantwortet sein.

Vielen Dank für Deine Mühen und beste Grüße
Mario
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.