# C /  Numerische Integration nach der Trapezregel



## köln (17. Mai 2007)

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


----------



## Matthias Reitinger (17. Mai 2007)

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


----------



## köln (17. Mai 2007)

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:


----------



## köln (17. Mai 2007)

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


----------



## LukeS (17. Mai 2007)

```
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


----------



## köln (18. Mai 2007)

jau supi setz mich morgen direkt dran!! vielen dank und gute nacht


----------



## LukeS (18. Mai 2007)

Ich glaube die for-Schleife stimmt nicht.
Sollte so sein:

```
for (int i=0; i++; i<=100)
```
Bin mir aber nicht sicher!


Bitte gib mir Bescheid, ob dein Programm funktioniert.

Gruss LukeS


----------



## köln (31. Mai 2007)

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


----------



## LukeS (31. Mai 2007)

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


----------



## köln (1. Juni 2007)

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


----------



## LukeS (1. Juni 2007)

Sory ich kann dir mit der Ein- und Ausgabe unter C nicht helfen.
Ich programmiere in C++ und dort hat man cin/cout. (Obwohl die "alte" C-Befehle auch funktionieren müssten).

Aber ich habe das Gefühl, dass du Probleme mit den Kommentaren hast. Ich glaube in C gibts die Kommentarzeichen // nicht. Statt dessen musst du /* vor dem Kommentar und */ nach dem Kommentar verwenden. Im Vergleich zu den C++ Kommentaren (//) können die C Kommentare mehrere Zeilen umfassen.

Gruss LukeS


----------



## köln (3. Juni 2007)

ok, danke luke meld mich wenn ich das ding abgeschlossen hab schönen sonntag noch


----------

