Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Rätselecke » Integration

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
04.07.2003, 10:46 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


zu schreiben ist folgende funktion

C++:
double trapez_integr(double u,double o,int s,double(*f)(double));



u:untergrenze
o:oberegrenze
s: anzahl stützstellen
f: funktionspointer der zu integrierenden funktion

wie nicht schwer zu erraten soll die funktion nach der trapezregel integrieren

hier noch mal die Formel dafür
Teilintegral = (b-a) * (f(a)+f(b))/2
b-a repäsentiert hierbei den streckenabschnitt auf der x-achse und
(f(a)+f(b))/2 ist die gemittelte höhe der beiden funktionswerte;

zum testen könnt ihr z.B: das hier nehmen:


C++:
double x_quadrat(double x){return x*x;}
int main(){
printf("%f\n",trapez_integr(0,3,10000,x_quadrat));
}


da sollte dann so 9 rauskommen wenn ihr die stüztstellenzahl hoch genug wählt.
weil x^2 intgriert x^3/3 +c ist . Dies in den Grenzen von 0 bis 3 ergibt dann 27/3=9;

Viel Spass Heiko
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
04.07.2003, 11:03 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


Ach so hab noch ne kleine erweiterung.
wer will kann ja auch noch

C++:
double simpson_integr(double u,double o,int s,double(*f)(double));


schreiben.
Das ist genauer und konvergiert damit schon bei weniger stützstellen stärker zu dem richtigen wert.

Die Formel für die Teilintegrale ist dann wie folgt:

Teilintegral=(b-a)*(f(a)+f(b)+4*f((a+b)/2)) )/6
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
04.07.2003, 12:40 Uhr
daredevil
Speicherteufel


kannst du mir ne seite übers integrieren empfehlen?
--
tschüss,
DareDevil
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
04.07.2003, 13:13 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


leider nein.
vielleicht hat ja jemand anders ne idee?

Ich mal versuchen das in einfachen worten zu erklären.
Also:
Beim Integrieren versuchst du die Fläche unter einer Funktion zu berechenen.
Nehmen wir mal vereinfacht an, das die Funktion nur postive Funktionswerte hat, also keine kleiner Null und damit gibt es dann auch keine negativen Flächen.


mal dir mal auf nem Zettel die funktion f(x) = 4 auf.
Die Funktion ist konstant.
Wenn du nun als untere Grenze 0 und als obere grenze 3 nimmst, willst du also den Flächeninhalt unter der Funktion von x=0 bis x=3 ausrechnen. Wie man sieht ergibt sich ein Rechteck. Du musst also nur 3*4 rechnen und hast den Flächeninhalt unter der kurve.

Wenn du nun eine Funktion hast die nicht linear ist, ist es nicht so leicht möglich diese einfach zu intgerieren. Mal dir mal x^2 auf. Wenn du nun den Flächen inhalt zwischen 0 und 3 errechenn willst ist das nicht so einfach.
Wenn du dies nun integrieren willst kannst du das nach mathematischen regeln machen. Diese sind aber schwer dem rechner beizubringen. Was aber besonders leicht ist, ist es numerisch zu intgerieren.

Das geht dann so. du zerlegst das ganze in viele kleine intervalle und errechnest von diesen die Flächeninhalte der Teilstücke.

Um das nun mit deiner x^2 aufgabe zu machen:

mal eine senkrechte bei x=0 , 1 ,2 und 3.

nun verbindest du immer nebeneinander liegende Fuktionswerte mit einer geraden. Du hast nun drei kleinere Flächen (Trapeze) die schon nahe am Flächeninhalt den du suchst sind. Du musst nur die flächen der drei trapeze aufsummieren. Wenn du das noch kleiner unterteilst wird das noch genauer usw.

genau das solltst du impelmentieren. Mals dir einfach auf dann peilst du das bestimmt.

Gruss heiko
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
04.07.2003, 14:31 Uhr
daredevil
Speicherteufel


ja, habs verstanden. dankeschön für die erklärung
aber das scheint mir zu aufwendig zu sein
--
tschüss,
DareDevil
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
04.07.2003, 14:33 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


wie aufwendig?
ist nur eine schleife in der du aufsummierst.
Und fläche eines Trapezes errechnet sich wie oben angegeben
(b-a) * (f(a)+f(b))/2
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 04.07.2003 um 14:33 Uhr von Heiko editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
04.07.2003, 14:35 Uhr
daredevil
Speicherteufel


ja, aber du musst ja die fläche am schluss in sehr kleine trapeze unterteilen...
--
tschüss,
DareDevil
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
04.07.2003, 14:39 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


das kann dir doch egal sein, das macht der rechner für dich.
du übergibst ihm doch die anzahl der stützstellen.
du hast dann demenstprechend stützstellen-1 trapeze

Flächeninhalt eines trapzes ist dann abstand zwischen zwei benachbarten stützstellen * funktionswert.

wobei du den funktionswert halt durch (f(a)+f(b))/2 aproximierst.

Gruss Heiko
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
04.07.2003, 14:43 Uhr
daredevil
Speicherteufel


Danke für die Erklärungen,
aber das ist keine aufgabe nach meinem Geschmack...
--
tschüss,
DareDevil
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
08.07.2003, 18:05 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


Da das Rätsel anscheinend keiner lösen will:
hier meine Lösung dazu


C++:
double trapez_integr(double u,double o,int s,double(*f)(double)){
double i=0,r=0,d=(o-u)/--s;
    while(i<s) r+=d/2*(f(u+i*d)+f(++i*d+u));
return r;}



Gruss Heiko
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ Rätselecke ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: