C integral berechnung implementierung?
Alles passt außer die funktion adaptanpassung ich versthe nicht wo der Fehler ist . Die funktion ist da um das integral geanuer zu machen bis die veränderung des Ergebnises nicht mehr um 0.01 abweicht. In Python hab ich es eignetlich genau so gemacht und es hat geklappt. Ich weiß das Python und C ganz andere Prog.Sprachen sind ,dennoch verstehe ich nicht warum es nicht will
#include <stdio.h>
#include <math.h>
// Aufgabe 1
float func(float x){
return x*x*x-2*x*x+x-3;
}
float integrate(float start, float end, float step){
float flaeche=0;
while (start<end){
flaeche+=step* func(start);
start=start+step;
}
return fabs(flaeche);
}
void adaptanspassung(float toleranz){
toleranz=0.01;
float ergebnis= integrate(float start,float end,float step);
float neues_ergnis= integrate(float start,float end,float step/2);
while ((ergebnis - neues_ergnis) > toleranz){
ergebnis=neues_ergnis;
neues_ergnis=integrate(float start,float end,float step/2);
}
int main() {
printf("%f\n", func(0)) ;
adaptanspassung(0.01);
printf("%f\n", integrate(0,2,0.02));
return 0;
}
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
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.
okay aber bei rekursiven funktionen kann ich sowas machen oder verstehe ich da etwas falsch?
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.
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?
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;)
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