Programm: näherungsweise Bestimmung eines Wertes
-
Hallo!
Ich habe leider eine Hausaufgabe, die ich versucht habe zu machen, bei der ich wegen den Fehlermeldungen jedoch nicht weiterkomme und nicht rauskriegen kann, was ich da falsch habe.
Ich hoffe ihr könnt mir da weiterhelfen.
Ich hoffe, dass mein Ansatz nicht falsch ist, das würde ich ja dann sehen, ob es so hinhaut, wenn das Programm laufen würde, aber so weiß ich echt nicht weiter......
Hier die Aufgabenstellung:Gegeben sei eine stetige Funktion f: R->R mit f(a)<0, f(b)>0 und f monoton wachsend auf dem Intervall [a,b] element E mit a, b element R und a<b. Nach dem Zwischenwertsatz besitzt f dann eine Nullstelle in [a,b]. Die Nullstelle kann durch das Bisektionsverfahren angenähert werden: Solanfe (b-a) noch größer als die gewünschte Genaugkeit ist, berechne c=(a+b)/2. Ist f(c)<0, so ersetze a durch c, oder andernfalls b durch c und fahre fort.
Schreiben Sie ein C Programm, das mit diesem Verfahren dir dirtte Wurzel aus 6 auf 6 Dezimalstellen genau ausrechnet.
Hinweis: Benutzen Siue für die Berechnung die Funktion f(x)=x^3 -6Fehlermeldungen:
Zeile 5: warning: parameter names (without types) in function declaration
Zeile 6: warning: incompatible implicit declaration of built-in function 'pow'
Teile 6: error: lvalue required as left operand of assignment||=== Build finished: 1 errors, 2 warnings ===|
#include <stdio.h> int main() { double a,b,c,x,f(x); f(x)=(pow(x,3) -6); while((b-a)>0,000002) { c=((a+b)/2); if(f(c)<0) { a==c; } else { b==c; } } printf("Die Nullstelle ist bei x="); return 0; }
Mal abgesehen von den Fehlemeldungen, ist meine Herangehensweise auch richtig, zum Lösen dieses Problems???
-
Sollst du das in C programmieren?
Das ist mehr Pseudocode als C.
Aber der Algorithmus sollte bei den genannten Vorgaben funktionieren.
-
Wie schon gesagt wurde, ist der Code kein korrektes C, aber wenn man die Fehler korrigiert, scheint der Algorithmus zu funktionieren. Hier der verbesserte Code mit Kommentaren zu den Änderungen:
#include <stdio.h> #include <math.h> /* Funktionen müssen in C folgendermaßen definiert werden: */ double f(double x) { return pow(x, 3) - 6; } int main() { /* a und b sollten initialisiert werden, x ist überflüssig */ double a = 0, b = 6, c; /* Kommazahlen mit Punkt statt Komma notieren */ while((b-a) > 0.000002) { c = ((a+b) / 2); if(f(c) < 0) { /* Vergleichsoperator mit Zuweisungsoperator verwechselt */ a = c; } else { /* Vergleichsoperator mit Zuweisungsoperator verwechselt */ b = c; } } /* Ausgabe des Ergebnisses vergessen */ printf("Die Nullstelle ist bei x=%f", c); return 0; }
Die Variablen a und b mussten noch initialisiert werden. Da das ja die Intervallgrenzen sind und die 3. Wurzel aus 6 gezogen werden soll, habe ich sie spontan auf 0 und 6 gesetzt. Musst du dir nochmal angucken, ob das so gut ist.
-
Wooow
VIEELEN vielen DANK!!!
Ja genau, es sollte in C programmiert werden.
In meinem Algorithmus(als Flussdiagramm notiert(, hatte ich a auf -2 und b auf 2 gesetzt aber das macht kein Unterschied, kommt ja dasselbe raus, merke jetzt nur, dass ich das auch völlig vergessen habe bei der Programmierung auch zu machen!
Vielen Dank für die Korrekturen, das mit den Funktionen wusste ich garnicht, hatten wir so noch nicht genau, jetzt weiß ich es!!
Hat mir wirklich sehr geholfen!!!!
-
Der Algorithmus funktioniert nur, wenn es sich um einen Vorzeichenwechsel (Nulldurchgang) von - nach + im Startintervall handelt. Andersherum kommt murks raus, bzw. die linke Intervallgrenze.
-
knivil schrieb:
Der Algorithmus funktioniert nur, wenn es sich um einen Vorzeichenwechsel (Nulldurchgang) von - nach + im Startintervall handelt.
Und genau das waren auch die Bedingungen.