<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[SIMPSON Verfahren Genauigkeit]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>Ich hab das SIMPSON Verfahren zur numerischen Annäherung eines Integrals in C++ versucht zu programmieren.<br />
Ein vergleichbares Programm hatte ich bereits auf meinem Taschenrechner(TI Voyage 200) programmiert. Dieser hat eine Genauigkeit von 12 Stellen, welche alerdings nicht ausgeschöpft werden können, da das Teil einfach zu langsam rechnet.<br />
Nun wollte ich das Programm halt portieren und um eine höher Genauigkeit zu erzielen.</p>
<p>Zunächst mal der wichtige Teil von Quellcode:</p>
<pre><code class="language-cpp">#include&lt;iostream.h&gt;
#include&lt;math.h&gt;
#include&quot;Numerik.h&quot; //Da ist die Klasse SIMPSON drin

double SIMPSON::f(double x){return exp(x);} //f(x) = e^x

double SIMPSON::Berechne(double a, double b, int n)	//Hauptfunktion(a = Untere Grenze, b = Obere Grenze, n = Zerlegungszahl) 
{
	int i=0;	//Laufvariable
	double su=0,sg=0,x=0;	//Hilfsvariablen

	if(n%2==1){ cout &lt;&lt; &quot;n muss durch 2 teilbar sein!&quot; &lt;&lt; endl; return 0;}
	if(f==0){ cout &lt;&lt; &quot;ERROR: Funktion f nicht definiert!&quot; &lt;&lt; endl; return 0;}

	h = (b-a)/n;	//Schrittweite festlegen

	for(i=1;i&lt;n-1;i++)
	{
		x = a+i*h;	//x Wert aus Startpunkt a und i*Schrittweite berechnen
		if(i%2==0)	sg += f(x);		//Fktwerte mit geradem Index i in sg summieren
		else		su += f(x);		//Fktwerte mit ungerad. Index i in su summieren
	}

	return (f(a) + 4*su + 2*sg + f(b))*h/3;	//Rückgabe des Endwertes mit SIMPSON Gewichtung
}

double SIMPSON::Fehler_Ergebnis(double a, double b, int n)
{
	return ((Berechne(a,b,n) - Berechne(a,b,n/2))/15);	//SIMPSON Fehlerformel für Delta n
}
</code></pre>
<p>Mein Problem ist die Zerlegungszahl n. Je größer sie ist desto genauer wird das Ergebnis. Allerdings steigt dabei auch gleichzeitig der Rechenaufwand.<br />
Das Phänomen was ich nun beobachten konnte ist, dass wenn ich z.B auf meinem TI ∫e^x dx von 0 bis 1 berechne, ich bereits mit n = 40 eine Genauigkeit auf 9 Stellen erhalte. Um eine Vergleichbare Genauigkeit mit meinem C++ Programm zu erhalten muss ich etwa n = 10000000 setzen.<br />
Die beiden Programme unterscheiden sich wirklich nur in der Programmiersprache nicht in der Funktionsweise.<br />
Im Endeffekt funktionier das Programm ja auch. Allerdings nicht mit der Effizient die ich mir erhofft hatte.</p>
<p>Sieht jemand vlt den Fehler wodurch ich die Genauigkeit verliere. Mein Ziel war es eigentlich eine Ganuigkeit von 12 Stellen zu erreichen. Sollte doch mit den doubles kein Problem geben oder? Ansonsten bin ich für alle Kritiken und Vorschläge offen!</p>
<p>Dankeschön!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/205929/simpson-verfahren-genauigkeit</link><generator>RSS for Node</generator><lastBuildDate>Sat, 04 Apr 2026 01:54:34 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/205929.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 19 Feb 2008 15:21:49 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to SIMPSON Verfahren Genauigkeit on Tue, 19 Feb 2008 15:21:49 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>Ich hab das SIMPSON Verfahren zur numerischen Annäherung eines Integrals in C++ versucht zu programmieren.<br />
Ein vergleichbares Programm hatte ich bereits auf meinem Taschenrechner(TI Voyage 200) programmiert. Dieser hat eine Genauigkeit von 12 Stellen, welche alerdings nicht ausgeschöpft werden können, da das Teil einfach zu langsam rechnet.<br />
Nun wollte ich das Programm halt portieren und um eine höher Genauigkeit zu erzielen.</p>
<p>Zunächst mal der wichtige Teil von Quellcode:</p>
<pre><code class="language-cpp">#include&lt;iostream.h&gt;
#include&lt;math.h&gt;
#include&quot;Numerik.h&quot; //Da ist die Klasse SIMPSON drin

double SIMPSON::f(double x){return exp(x);} //f(x) = e^x

double SIMPSON::Berechne(double a, double b, int n)	//Hauptfunktion(a = Untere Grenze, b = Obere Grenze, n = Zerlegungszahl) 
{
	int i=0;	//Laufvariable
	double su=0,sg=0,x=0;	//Hilfsvariablen

	if(n%2==1){ cout &lt;&lt; &quot;n muss durch 2 teilbar sein!&quot; &lt;&lt; endl; return 0;}
	if(f==0){ cout &lt;&lt; &quot;ERROR: Funktion f nicht definiert!&quot; &lt;&lt; endl; return 0;}

	h = (b-a)/n;	//Schrittweite festlegen

	for(i=1;i&lt;n-1;i++)
	{
		x = a+i*h;	//x Wert aus Startpunkt a und i*Schrittweite berechnen
		if(i%2==0)	sg += f(x);		//Fktwerte mit geradem Index i in sg summieren
		else		su += f(x);		//Fktwerte mit ungerad. Index i in su summieren
	}

	return (f(a) + 4*su + 2*sg + f(b))*h/3;	//Rückgabe des Endwertes mit SIMPSON Gewichtung
}

double SIMPSON::Fehler_Ergebnis(double a, double b, int n)
{
	return ((Berechne(a,b,n) - Berechne(a,b,n/2))/15);	//SIMPSON Fehlerformel für Delta n
}
</code></pre>
<p>Mein Problem ist die Zerlegungszahl n. Je größer sie ist desto genauer wird das Ergebnis. Allerdings steigt dabei auch gleichzeitig der Rechenaufwand.<br />
Das Phänomen was ich nun beobachten konnte ist, dass wenn ich z.B auf meinem TI ∫e^x dx von 0 bis 1 berechne, ich bereits mit n = 40 eine Genauigkeit auf 9 Stellen erhalte. Um eine Vergleichbare Genauigkeit mit meinem C++ Programm zu erhalten muss ich etwa n = 10000000 setzen.<br />
Die beiden Programme unterscheiden sich wirklich nur in der Programmiersprache nicht in der Funktionsweise.<br />
Im Endeffekt funktionier das Programm ja auch. Allerdings nicht mit der Effizient die ich mir erhofft hatte.</p>
<p>Sieht jemand vlt den Fehler wodurch ich die Genauigkeit verliere. Mein Ziel war es eigentlich eine Ganuigkeit von 12 Stellen zu erreichen. Sollte doch mit den doubles kein Problem geben oder? Ansonsten bin ich für alle Kritiken und Vorschläge offen!</p>
<p>Dankeschön!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1458929</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1458929</guid><dc:creator><![CDATA[Playsi]]></dc:creator><pubDate>Tue, 19 Feb 2008 15:21:49 GMT</pubDate></item><item><title><![CDATA[Reply to SIMPSON Verfahren Genauigkeit on Tue, 19 Feb 2008 15:47:24 GMT]]></title><description><![CDATA[<p>War ein doofer Denkfehler von mir.<br />
Muss nämlich in Zeile 17 heißen:</p>
<pre><code class="language-cpp">for(i=1;i&lt;=n-1;i++)
</code></pre>
<p>Deshalb benötigte man auch dieses hohe n, da der am Ende immer einen Summanden weggelassen hat, was das Ergebnis natürlich verfälschte.<br />
Jetzt funktioniert es wie es soll.<br />
Sorry für den überflüssigen Post hier <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
<p><strong>/closed</strong></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1458946</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1458946</guid><dc:creator><![CDATA[Playsi]]></dc:creator><pubDate>Tue, 19 Feb 2008 15:47:24 GMT</pubDate></item></channel></rss>