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

Trapez- und Simpsonformel mit Fehlerbetrachtung

 

dielea310
Forum-Newbie

Forum-Newbie


Beiträge: 1
Anmeldedatum: 04.05.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.05.2017, 13:00     Titel: Trapez- und Simpsonformel mit Fehlerbetrachtung
  Antworten mit Zitat      
Guten Tag,

für eine Hausarbeit muss ich folgende Aufgaben für diese Grundfunktion lösen:

g(x) = (sin(3x)/(x+1))*(e^(cos(x)²))

- Integral im Intervall 0 bis pi bestimmen mit Hilfe der
1) Trapezformel
2) Simpsonformel

Eingabeparameter sollen die Integraionsgrenzen (0,pi) und die Anzahl der Stützstellen sein. Für eine feste Anzahl an Stützstellen bekomme ich das auch hin, siehe folgender Code:

Code:

>> format long;
G = inline ('((sin(3.*x))./(x+1)).*exp((cos(x).^2))');    %Integrand
a=0;
b=pi;                  %Integrationsgrenzen
nS=100;             %Anzahl der Stützstellen

%abgeleitete Größen
n  = nS-1 ;                       % Anzahl der Abschnitte
h  = (b-a) / n ;               % Breite eines Abschnitts
xS = a : h : b ;                  % Koordinaten der Stuetzpunkte
yS = G(xS) ;                      % Funktionswerte an den Stuetzstellen
>>
>> %Trapezformel
>> Trapez = ((yS(1)+yS(nS))/2 + sum (yS(2:n)))*h
Trapez =
   1.073317382695062
>>
>> %Simpsonformel
>> I = (yS(1)+yS(nS)) ;             % Erster und letzer Wert der Formel
faktor = 4 ;
for i = 2:n
   I = I + yS(i)*faktor ;      
   if  (faktor == 4) faktor = 2 ;
   else              faktor = 4 ;
   end ;
end
Simpson = I*h/3
Simpson =
   1.073836791357476
>>
>> %MATLAB Integralfunktion quad()
>> MATLABquad       = quad (G , a , b)
MATLABquad =
   1.074167030680355
>>
 


Nun muss ich in einem zweiten Schritt allerdings den absoluten Fehler der Methoden (im Vergleich zur Matlab quad()-Funktion) in Abhängigkeit der Anzahl der Stützstellen angeben. Hierzu möchte ich nS als Vektor z.B. nS = [2 : 1 : 1000] übergeben und als Ergebnis ebenfalls einen Trapez-Vektor bzw. einen Simpson-Vektor erhalten. Damit könnte ich dann weiterrechnen und den absoluten Fehler als Differenz zum quad()-Ergebnis in Abhängigkeit der Anzahl Stützstellen angeben.

Leider ist es mir nicht gelungen die Formeln so umzubauen, dass ich nS als Vektor eingeben kann. Ich bekomme immer wieder Fehlermeldungen, die ich nicht lösen kann.
Code:

>> format long;
>> G = inline ('((sin(3.*x))./(x+1)).*exp((cos(x).^2))');    %Integrand
>> a=0;
b=pi;                  %Integrationsgrenzen
>> nS = [2 : 1 :1000];      %Anzahl Stützstellen ale Vektor zwischen 2 und 1000

>> n=nS-1;                  %Anzahl der Abschnitte
>> h = (b-a) ./ n;        
>> xS = a : h : b;
>> yS = G(xS);
>>
>> %Trapezformel
>> Trapez = ((yS(1)+yS(nS))/2 + sum (yS(2:n)))*h
Index exceeds matrix dimensions.
>> Trapez = ((yS(1)+yS(nS))./2 + sum (yS(2:n))).*h
Index exceeds matrix dimensions.
 


Ich hoffe mir kann jemand helfen? Auch eine komplett neue Lösung wäre nicht schlimm, da es ja sein kann, dass mein Vorschlag nicht auf Vektoreneingabe umstellbar ist...
Vielen lieben Dank, ich benötige hier wirklich Hilfe.
Gruß, Lea
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 05.05.2017, 14:36     Titel: Re: Trapez- und Simpsonformel mit Fehlerbetrachtung
  Antworten mit Zitat      
Hallo dielea310,

Wenn Du ein Script schreibst, statt die Befehle im Command-Window einzugeben, wird der Code übersichtlicher und leichter zu editieren.

inline ist seit langem "outdated". Verwende lieber eine "anonymous function":
Code:
g = @(x) (sin(3x) ./ (x+1)) .* (e .^ (cos(x) .^ 2));


Zitat:
Eingabeparameter sollen die Integraionsgrenzen (0,pi) und die Anzahl der Stützstellen sein.

Das klingt nach einer Funktion, nicht nach einem Skript.

Code:
nS = [2 : 1 :1000];      %Anzahl Stützstellen ale Vektor zwischen 2 und 1000
n=nS-1;                  %Anzahl der Abschnitte

Man kann den Vektor einfach "2:1000" schreiben. Das ":1" ist der Default-Wert und die eckigen Klammern sind der "Concatenation operator", der den Inhalt als Vektor zusammenfasst. 2:1000 is aber bereits ein Vektor, so gibt es nichts zusammen zu fassen.

Wenn nS ein Vektor ist, ist nS-1 ebenfalls einer. Vielleicht meinst Du:
Code:


Wenn Du ein Skript oder eine Funktion verwendest, kannst Du den Debugger benutzen um Problemen wie "Index exceeds matrix dimensions" zu untersuchen. Du kannst entweder Zeile für Zeile durch den Code gehen, oder zunächst dbstop if error im Command window eingeben. Dann stoppt Matlab automatisch, wenn ein Fehler auftritt.
Die Fehlermeldung bedeutet, dass Du versuchst auf ein Element eines Vektors zuzugreifen, das außerhalb des definierten Vektors liegt. Vielleicht hat yS nicht nS Werte oder weniger als n.

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