C integral berechnung implementierung?

2 Antworten

Die Schleife ist an sich komplett falsch;

1. toleranz wird in der adaptanpassung unnötigerweise überschrieben, dadurch kann die schleife eventuell unendlich laufen

2. deine Variablen sind außerdem nicht global deklariert bzw. werden auch nicht als Parameter übergeben

3. die step funktion wird nicht aktualisiert

Ich würde die Funktion komplett erneuern

Woher ich das weiß:Hobby – Programmierer
kabik334 
Fragesteller
 20.12.2023, 16:43

dein 3 punkt wieso ist es nicht mit dieser zeile möglcih: neues_ergnis=integrate(float start,float end,float step/2);

dadurch wird doch mein integral bzw das ergebnis der funktion integrate kleiner. Und weshalb muss ich die restlichen Variablen als Paramter angeben ? Die sind doch für einen nutzer irrelevant

0
JulianOnFire  20.12.2023, 16:53
@kabik334

in c sollte man nicht float start, float end und float step direkt in einem Funktionsaufruf verwenden. Das sind Datentypen, die solltest du bei Deklarationen von Variablen oder Funktionsparametern verwenden, aber nicht als Argumente in den Funktionsaufrufen selbst 

probier es mal so:

float integrate(float start, float end, float step) {
    float flaeche = 0;
    float x = start;
    while (x < end) {
        flaeche += step * func(x);
        x += step;
    }
    return fabs(flaeche);
}




float adaptanspassung(float start, float end, float initial_step, float toleranz) {
    float step = initial_step;
    float ergebnis = integrate(start, end, step);
    float neues_ergebnis;


    do {
        step /= 2;
        neues_ergebnis = integrate(start, end, step);
    } while (fabs(ergebnis - neues_ergebnis) > toleranz);


    return neues_ergebnis;
}


int main() {
    float start = 0;
    float end = 2;
    float initial_step = 0.02;
    float toleranz = 0.01;


    float ergebnis = adaptanspassung(start, end, initial_step, toleranz);
    printf("Integrations-Ergebnis mit adaptiver Anpassung: %f\n", ergebnis);


    return 0;
}

ich kann dir nicht garantieren dass der code funktioniert, ich konnte ihn nicht testen.

1
kabik334 
Fragesteller
 20.12.2023, 17:03
@JulianOnFire

okay aber bei rekursiven funktionen kann ich sowas machen oder verstehe ich da etwas falsch?

0

Anstatt von float würde ich double nehmen und mir ist nicht klar weshalb der Rückgabewert positiv sein muss also den letzte Befehl fabs halte ich für fraglich.

Woher ich das weiß:Berufserfahrung – Seit 20 Jahren
kabik334 
Fragesteller
 20.12.2023, 16:25

weil ein integral auch negativ sein kann . Gesucht wird aber nach einer fläche und flächen sind immer positiv. Und in wie fern hilft mir wenn ich statt float double nehme?

0
m1chak  20.12.2023, 17:19
@kabik334

Double haben doppelte Genauigkeit (und werden schneller berechnet weil alle Prozessoren Double aber kein float können). Die Anzahl der gültigen Stellen ist in c weit schlechter als in Python.

Wenn dein Algorithmus die Fläche liefern soll, dann muss er eigentlich calcArea ind nicht intrgrate heißen;)

1