Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Bücher:

Elektrotechnik für Informatiker mit MATLAB und Multisim

Studierende:
weitere Angebote

Partner:


Vermarktungspartner


Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Adaptives Simpsonverfahren

 

hierrandomNameneinfügen
Forum-Newbie

Forum-Newbie


Beiträge: 1
Anmeldedatum: 14.05.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.05.2019, 14:56     Titel: Adaptives Simpsonverfahren
  Antworten mit Zitat      
Hallo!

Ich arbeite gerade an einer rekursiven Implementierung des adaptiven Simpsonverfahrens zur numerischen Integration. Einen ersten (erfolgreichen) Versuche hatte ich bereits, aber ich wollte noch die Anzahl an Aufrufen der gegebenen Funktion reduzieren. Mein Code lautet so:

Code:
function [F] = ad2Simpson(f,a,b,tol,f_alt)
%f : zu integrierende Funktion
%a : untere Grenze
%b : obere Grenze
%F : Integralwert
%tol : Toleranz
eps = tol*15; %Anpassung der Toleranz an Ungleichung
m = (b+a)/2; %mittlere Stützstelle
m_l = (3*a+b)/4;
m_r = (a+3*b)/4;

global numf;
sim = [1/6; 4/6; 1/6];
d = b-a;

%Berechnung der Funktionswerte
if nargin == 4
    fWerte = [f(a);f(m_l);f(m);f(m_r);f(b)];
    numf = 5;
else
    fWerte = [f_alt(1); f(m_l); f_alt(2); f(m_r);f_alt(3)];
    numf = numf + 2;
end

%Berechnung der Simpson-Integrale
S_ab = d*(transpose(sim)*[fWerte(1);fWerte(3);fWerte(5)]);
S_am = d*(transpose(sim)*[fWerte(1);fWerte(2);fWerte(3)]);
S_mb = d*(transpose(sim)*[fWerte(3);fWerte(4);fWerte(5)]);

%Berechnung der Abbruchbedingung und Rekursion
H = abs(S_ab-S_am-S_mb);
if H < eps
    F = S_am + S_mb;
else
    tol_new = tol/2;
    F = ad2Simpson(f,a,m,tol_new,[fWerte(1);fWerte(2);fWerte(3)]) + ad2Simpson(f,m,b,tol_new,[fWerte(3);fWerte(4);fWerte(5)]);
end
end


In dem ersten Aufruf wird f_alt noch nicht übergeben, weshalb es nur in dem Durchlauf 4 Argumente sind. Sicherlich gibt es auch dafür eine geschicktere Lösung... (ich code nicht so oft)
Leider konvergiert das Verfahren scheinbar schon für relativ geringe Toleranzen (etwa 0.01) nicht mehr.

Schon mal vielen Dank für Verbesserungsvorschläge! Smile
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
.


goMatlab ist ein Teil des goForen-Labels
goForen.de goMATLAB.de goLaTeX.de


 Impressum  | Nutzungsbedingungen  | Datenschutz  | Werbung/Mediadaten | Studentenversion | FAQ | goMatlab RSS Button RSS


Copyright © 2007 - 2020 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks
Partner: LabVIEWforum.de

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.