C / Numerische Integration nach der Trapezregel

köln

Grünschnabel
Hallo,

ich hab eine Aufgabe bekommen :

Numerische Integration nach der Trapezregel

Schreiben Sie ein Programm, welches das Integral

I=(Integralzeichen) f(x)*dx

der Funktion:

f(x)=(Wurzel von x) * sin x

nach der Trapezregel berechnet.
Die Anzahl der Stützstellen soll maximal 20 betragen und vom
Anwender vorgegeben werden können.
**************************************

ich habe nicht den geringsten Schimmer was hiermit gemeint sein könnte und bin absolut auf EURE Hilfe angewiesen, deshalb würde ich mich riesig freuen wenn ihr zahlreich antwortet.
Vielen Dank

Grüße Jenny
 
Hallo,

irgendwie fehlen beim Integralzeichen noch die Integrationsgrenzen, sonst kommt man mit numerischen Methoden nicht recht weit.

Ansonsten wäre interessant zu wissen, woran das Verständnis scheitert. Sagt dir der Begriff Integral was? Oder kannst du mit der Trapezregel was anfangen? Oder scheitert es nur an der Implementierung in C?

Grüße,
Matthias
 
Danke für die schnelle Antwort!!

Also über dem Integrationszeichen steht nur b und a unten...mehr ist nicht gegeben. Das grösste problem für mich ist definitiv C :suspekt:
 
hab das hier im netz gefunden hilft das

5.4.3 Anwendungsbeispiel

Bei der numerischen Integration (s. Abschnitt 5.3) von Polynomen können die Funktionswerte der Stützstellen mittels Hornerschema berechnet werden. Damit wird deren Eingabe überflüssig und Eingabefehler vermieden:





PTrapez.bas

REM Integration von Polynomen mittels Trapezregel

REM Polynomwertbestimmung mittels HORNER-Schema

REM M. Meiler, 20.01.2003



REM Hauptprogramm

CLS

GOSUB eingabe: GOSUB trapez: GOSUB ausgabe

END





REM Eingabe der obere und unteren Grenze

REM und Berechnung der Stuetzstellen

eingabe:

GOSUB polynomeingabe: PRINT

GOSUB grenzeneingabe: PRINT

GOSUB stuetzstellen: PRINT

RETURN





REM Eingabe des Grades und der Koeffizienten des Polynoms

polynomeingabe:

DO

INPUT "Grad des Polynoms(r > 0): ", r%

LOOP UNTIL r% > 0



REDIM a!(r%)

PRINT "Koeffizienteneingabe"

FOR i% = 0 TO r%

PRINT "a!("; i%; ")="; : INPUT " ", a!(i%)

NEXT i%

RETURN





REM Eingabe der obere und unteren Grenze

grenzeneingabe:

DO

INPUT "Untere Integrationsgrenze a= ", a!

INPUT "Obere Integrationsgrenze b ( b > a )= ", b!

LOOP UNTIL (b! - a!) > 0

RETURN





REM Berechnung der Stuetzstellen mittels HORNER

stuetzstellen:

DO

INPUT "Anzahl der Stuetzstellen (s > 1): ", s%

LOOP UNTIL s% >= 2



n% = s% - 1

h! = (b! - a!) / n%

REDIM y!(n%)



x! = a!

FOR i% = 0 TO n%

GOSUB horner1: y!(i%) = y!

x! = x! + h!

NEXT i%

RETURN





REM Berechnung des Polynomwertes mittels Horner

horner1:

b! = 0

FOR k% = r% TO 0 STEP -1

b! = a!(k%) + b! * x!

NEXT k%

y! = b!

RETURN





REM Berechnung des Integrals mittels Trapezregel

trapez:

y! = y!(0) + y!(n%)



FOR j% = 1 TO n% - 1

y! = y! + 2 * y!(j%)

NEXT j%



y! = y! * h! / 2

RETURN





REM Ausgabe des Ergebnisses

ausgabe:

PRINT "Ergebnis: "; y!

PRINT

RETURN
 
Code:
Pseudocode:

float integral(float a, float b)    // a, b: Integrationsgrenzen
{
float intervall = b-a;
float d = intervall / 100; // 100 Trapeze, d: Breite der Trapeze

float l = a;
float r = a+d;
float flaeche = 0;
for (int i=0; i++; i<100)
{
    flaeche += (f(l) + f(r)) / 2 * d;    // Trapezformel
    l = l + d;
    r = r + d;
}
return flaeche;
}

f(float x)
{
   return sqrt(x) * sin(x);
}

1. Ich garantiere für nichts. Ich hab mir das jetzt so aus dem Finger gesogen
2. Ich schlage dir vor den Code nicht 1:1 zu kopieren (funktioniert wahrscheinlich sowieso nicht auf Anhieb. Versuch den Code nachzuvollziehn und schreibe dann dein eigenes Programm. Dann lernst du auch was dabei.
3. Für die mathematischen Funktionen musst "math.h" oder eine ähnliche Header-Datei einbinden

Gruss LukeS
 
Ich glaube die for-Schleife stimmt nicht.
Sollte so sein:
Code:
for (int i=0; i++; i<=100)
Bin mir aber nicht sicher!


Bitte gib mir Bescheid, ob dein Programm funktioniert.

Gruss LukeS
 
Sorry fürs so lange nich melden!! nochmal veilen dank für eure Hilfe!!
hab mit deinem code weitergearbeitet und mit der Hilfe von Kollegen kam das dabei raus !

#include <math.h>

float f(float x)
{
return sqrt(x) * sin(x);
}

float integral(float a, float b) // a, b: Integrationsgrenzen
{
float intervall = b-a;
float d = intervall / 100; // 100 Trapeze, d: Breite der Trapeze

float l = a;
float r = a+d;
float flaeche = 0;
for (int i=0; i++; i<=100)
{
flaeche += (f(l) + f(r)) / 2 * d; // Trapezformel
l = l + d;
r = r + d;
}
return flaeche;
}

int main(void)


der code funktioniert nur weiß ich nich wie ich die Eingabe gestalte wär super wenn mir dabei nochmal jemand helfen könnte!!
Danke und viele grüße
 
vielleicht hilft das:
http://www.netzmafia.de/skripten/ad/thomas-c/conio.html

Normalerweise werden die eingelesenen Zeichen als char angesehen. Du musst sie dann noch in float umwandeln.
Ausserdem musst du schauen, dass keine sinnlosen Eingaben gemacht werden (z.B. Buchstaben, zwei mal die gleiche Zahl, zuerst die obere Grenze anstelle der unteren Grenze...)

Gruss LukeS
 
Zuletzt bearbeitet:
Danke dir

hab die eingabe jetzt gestaltet jedoch meckert er über viele Fehler, die ich einfach nicht weg bekomm. Wär super wenn mir da nochmal jemand helfen könnte...

#include <math.h>
#include <stdio.h>

float f(float x)
{
return sqrt(x) * sin(x);
}

float integral(float a, float b) // a, b: Integrationsgrenzen
{
float intervall = b-a;
float d = intervall / 100; // 100 Trapeze, d: Breite der Trapeze

float l = a;
float r = a+d;
float flaeche = 0;
for (int i=0; i++; i<=100)
{
flaeche += (f(l) + f(r)) / 2 * d; // Trapezformel
l = l + d;
r = r + d;
}
return flaeche;
}

int main(void)
{
float a, b, out;
printf("Geben Sie die untere Integrationsgrenze ein: ") ; //Ausgabe auf Bildschirm
30 scanf("%f", &a) ; //Einlesen der 1. Zahl in die Variable a
31printf("Geben Sie die oberere Integrationsgrenze ein: ") ; //Ausgabe auf Bildschirm
32scanf("%f", &b) ; //Einlesen der 2. Zahl in die Variable b
33out = integral(a,b);
34printf("Das Integral beträgt: %f\n", out); //Ausgabedes Ergebnisses auf den Bildschirm
35return 0; //Rückgabecode (0=kein Fehler)
}



Warning e:\fachhochschule\lcc\2323.c: 18 Statement has no effect
Error e:\fachhochschule\lcc\2323.c: 30 illegal statement termination
Error e:\fachhochschule\lcc\2323.c: 30 skipping `/' `/'
Error e:\fachhochschule\lcc\2323.c: 30 undeclared identifier 'Einlesen'
Warning e:\fachhochschule\lcc\2323.c: 30 Statement has no effect
Error e:\fachhochschule\lcc\2323.c: 30 Syntax error; missing semicolon before `der'
Error e:\fachhochschule\lcc\2323.c: 30 undeclared identifier 'der'
Warning e:\fachhochschule\lcc\2323.c: 30 Statement has no effect
Error e:\fachhochschule\lcc\2323.c: 30 Syntax error; missing semicolon before `1.'
Error e:\fachhochschule\lcc\2323.c: 30 Syntax error; missing semicolon before `Zahl'
Error e:\fachhochschule\lcc\2323.c: 30 undeclared identifier 'Zahl'
Warning e:\fachhochschule\lcc\2323.c: 30 Statement has no effect
Error e:\fachhochschule\lcc\2323.c: 30 Syntax error; missing semicolon before `in'
Error e:\fachhochschule\lcc\2323.c: 30 undeclared identifier 'in'
Warning e:\fachhochschule\lcc\2323.c: 30 Statement has no effect
Error e:\fachhochschule\lcc\2323.c: 30 Syntax error; missing semicolon before `die'
Error e:\fachhochschule\lcc\2323.c: 30 undeclared identifier 'die'
Warning e:\fachhochschule\lcc\2323.c: 30 Statement has no effect
Error e:\fachhochschule\lcc\2323.c: 30 Syntax error; missing semicolon before `Variable'
Error e:\fachhochschule\lcc\2323.c: 30 undeclared identifier 'Variable'
Warning e:\fachhochschule\lcc\2323.c: 30 Statement has no effect
Error e:\fachhochschule\lcc\2323.c: 30 Syntax error; missing semicolon before `a'
Warning e:\fachhochschule\lcc\2323.c: 31 Statement has no effect
Error e:\fachhochschule\lcc\2323.c: 31 Syntax error; missing semicolon before `printf'
Error e:\fachhochschule\lcc\2323.c: 32 illegal statement termination
Error e:\fachhochschule\lcc\2323.c: 32 skipping `/' `/'
Warning e:\fachhochschule\lcc\2323.c: 32 Statement has no effect
Error e:\fachhochschule\lcc\2323.c: 32 Syntax error; missing semicolon before `der'
Warning e:\fachhochschule\lcc\2323.c: 32 Statement has no effect
Error e:\fachhochschule\lcc\2323.c: 32 Syntax error; missing semicolon before `2.'
Error e:\fachhochschule\lcc\2323.c: 32 too many errors


danke für eure zeit grüße
 
Zurück