Integral

X-zelent

Cadet 1st Year
Registriert
Mai 2013
Beiträge
12
Hallo Leute.
Ich hoffe ich werde hier jetzt nicht sofort zerissen oder blöd angemacht.
Ich hab angefangen mir ein bisschen programmieren beizubringen.
Ich wollte ein Programm schreiben das mit Hilfe der Trapezformel und Simpsonregel ein Integral ausrechnet,
nur irgendwie klappt das nicht so ganz. Evtl hat ja jemand die Lösung des Problems.
Ich bin auf diesem Gebiet noch ziemlich unerfahren.
 
Zuletzt bearbeitet:
also ich kann nicht auf die Datei zugreifen.

"Error403 - seems you dont belong here."

Was ist denn dein Problem? Hats mit der Mathe oder mit dem Programmieren zu tun?:)
 
Ja du musst n bisschen mehr Infos geben.

Selber kompilieren tu ich das so nicht.


Wie sieht die Error Message aus? Stimmt einfach das Resultat nicht?
Debuggen ist ein (sehr) grosser Teil vom Programmieren. Wenn das Resultat nicht stimmt, kannst du das z.B mit prints (oder logs) selber nachprüfen...

Generell solltest du sowieso immer noch Sprache/ Framework /benutzte Libraries angeben...

EDIT: Und kennst du die seite stackoverflow? Wenn du Probleme beim Programmieren hast, dann musst du dort hin :) Aber die Leute werden selten deinen Code ausbügeln. Du kannst nur Antworten zu grundsätzlichen Problemen erwarten... ala Wie modifiziere ich blablabla, so dass es blablabla macht in Sprache blablabla.
 
Zuletzt bearbeitet:
Also wenn ich das Debugging starte läuft es schon. Nur die Ergebnisse sind verschieden und beide leider falsch.

Da ich eben n ziemlicher Neuling bin fällt mir das alles ziemlich schwer. Ich hoff ich bin nicht zu anstrengend.. :D
 
Zuletzt bearbeitet:
Ich finde es extrem anstrengend die mathe dahinter zu verstehen. Ich vermute da aber leider auch den fehler. Und um den programmiererischen Fehler zu finden, muss man die mathe leider erst mal verstehen. Um ein integral zu berechnen benötigt man doch irgendwo eine formel oder? Wo zur hölle ist die bei dir versteckt?

Falls du c verstehst
http://darkleo.com/IT/amathematik/simpsonregel.htm
Ist für mich deutlich besser zu lesen.
Func liefert im 2. Beispiel immer y von f (x).
 
Zuletzt bearbeitet:
Ja da bleibt dir wohl nur übrig ein Resultat von Hand nachzurechnen, und die Zwischenergebnisse auszugeben.
Am besten testets du immer einzelne Funktionen seperat.

Was du auch tun kannst, ist dir die Startparameter ausgeben zu lassen und dann von Hand jeden Schritt überprüfen.
Vorzugsweise mit dem einfachst möglichen Input.

Gib einfach überall Zwischenergebnisse aus.
 
Sind a und b nicht die Eckpunkte der Grundlinie eines Trapezes?
Wäre dann f(a) und f(b) nicht 0?

Und Sowieso ist die Simpsonregel ja deutlicher Overkill :D - aber ist ja nur eine Übung :)
 
Habs mal in schönes C umgeschrieben. Ich finde deinen Fehler gleich :D

Code:
double f(double x)
{
	double res;
	res = x*x;  //x² funktion
	return res;
}

void trapez(int N, double a, double b)
{
int I;
double sum = (f(a)+f(b))/2.0;
for(I=1; I<=N-1; I++)
{
	sum += f(a+(I*(b-a)/N));
}

sum = sum*(b-a)/N;
printf("Die %.2i-te iterierte Trapez-Naeherung lautet: %f\n",N,sum);
}

void simpson(int N, double a, double b)
{
int I;
double sum = (f(a)+f(b))/3.0;

for(I=0;I<=N-1;I++)
{
	sum += (4.0*f(a+((2.0*I+1.0)*(b-a)/(2.0*N)))/3.0);
}
for(I=1;I<=N-1;I++)
{
	sum += (2.0*f(a+(2.0*I*(b-a)/(2.0*N)))/3.0);
}

sum *= (b-a)/(2.0*N);
printf("Die %.2i-te iterierte Simpson-Naeherung lautet: %f\n",N,sum);
}

int main()
{
	simpson(100,0,3);
	trapez(100,0,3);
	
	system("pause");
	return 0;
}
Ergänzung ()

Code:
private void button1_Click(object sender, EventArgs e)  //trapezformel
{
	double a, b, n, S1=0;
	Parser.term = textBox1.Text;

	a = Convert.ToDouble(textBox2.Text);
	b = Convert.ToDouble(textBox3.Text);
	n = Convert.ToDouble(textBox4.Text);

	S1 = (Parser.f(a) + Parser.f(b)) / 2.0;
	for (int i = 1; i <= (n-1); i++)
	{
		S1 = S1+Parser.f(a+(i*(b-a)/n));
	}
	S1 = S1*(b-a)/n;

	label4.Text = S1.ToString();
}
 
Zuletzt bearbeitet:
Code:
private void button2_Click(object sender, EventArgs e)  //simpsonformel
{
	double a, b, n, x, S1;
	Parser.term = textBox1.Text;

	a = Convert.ToDouble(textBox2.Text);
	b = Convert.ToDouble(textBox3.Text);
	n = Convert.ToDouble(textBox4.Text);

	S1 = (Parser.f(a) + Parser.f(b))/3.0;

	int i;
	for (i=1; i<=n-1; i++)
	{
		x = a+((2.0*i+1.0)*(b-a)/(2.0*n));
		S1 = S1+(4.0*Parser.f(x)/3.0);
	}
	for(i=1; i<=n-1; i++)
	{
		x = a+(2.0*i*(b-a)/(2.0*n));
		S1 = S1+(2.0*Parser.f(x)/3.0);
	}
	
	S1 = S1*((b-a)/(2.0*n))
	label6.Text = S1.ToString();
}



Ich habe das jetzt von c nur in deinen Syntax umgeschrieben, keine Ahnung obs geht aber schätze schon ;). Ich habe keine ahnung von der Mathematik. Ist das Java oder was? Als Anfänger empfehle ich das nicht. Ist zu kompliziert und man verliert schnell die lust.
 
Zuletzt bearbeitet:
Nachwievor, verwende verdammt nochmal Decimal anstatt Double. Ich würde am Algorithmus selbst nichts verändern, solange ein "Rundungs"problem nicht ausgeschlossen ist.
 
Decimal erweitert von 64 auf 128 bit oder wie habe ich das verstanden? Ist nicht mein Problem, kann er ja ändern. Teile mir lediglich dann mit ob es geht.
Ist das C#?

LG Tigerass
 
Zuletzt bearbeitet:
I think you have this backwards. Floating point numbers are intended for scientific use where the range of numbers is more important than absolute precision. Decimal numbers are an exact representation of a number and should always be used for monetary calculations. Decimal fractions do not necessarily have an exact representation as a floating point number.

http://social.msdn.microsoft.com/Fo...l/thread/921a8ffc-9829-4145-bdc9-a96c1ec174a5

Stelle dir das anders vor:
Double und Float decken einen Zahlenbereich ab, der durch Min- und Maxvalue abgegrenzt wird. Dieser ist durch die Anzahl der Möglichkeiten geteilt, die durch Double bzw. Float geteilt werden können. Auf diese Treppen wird dann gerundet bzw. mit diesen wird gerechnet. Das geschieht binär.
Decimal hingegen ist eine exakte Interpretation der Zahl, genauer geht es nicht, ist aber dafür dementsprechend bei Weitem langsamer.
 
Zuletzt bearbeitet:
Eben, ist wie in C. Nur dass es in C kein Decimal gibt und ich es deshalb auch nicht kenne. Ist ein 128bit datentyp. Wenn er kann sollte er es der genauigkeit zuliebe verwenden.
 
Für iterative numerische Verfahren sind doubles scho recht.
Decimals passen da gar nicht rein, da es sich sowieso um eine Annäherung handelt.
 
Danke für die Antowrten (:
@ Tigerass 2.0: ja dein Programm scheint mir einiges effizienter und kompakter :D
ich hab mich da anscheinend an einigen Stellen geirrt^^
 
Zuletzt bearbeitet:
Probier jetzt nochmal die simpsonformel aus oder tausche unten einfach die N variable durch ein kleines n.
 
Das hab ich schon gemacht.
Top! (:
 
Zuletzt bearbeitet:
Zurück
Oben