Zum Inhalt springen

Schon wieder ein Problem


Anel

Empfohlene Beiträge

Hallo!

jetzt hab ich schon wieder ein Problem. :(

und zwar sollen wir jetzt mit Hilfe des Mittelwertsatzes die Nullstellen einer Funktion berechnen.

der Mittelwertsatz besagt im Grunde: wenn zwei Funktionswerte unterschiedliche Vorzeichen haben, muss dazwischen eine Nullstelle sein.

das sollen wir wie folgt machen:

- Eingegeben wird: die Funktionsnummer fn, die Intervallgrenzen a und b und die Genauigkeit g

- eine Funktion fct berechnet den Funktionswert

- die Prozedur nullstelle bestimmt unter Ausnutzung des Mittelwertsatzes durch fortgesetzte Bisektion (k.a. was das bedeutet) des Intervalls bis zur Größe g eine Näherung der Nullstelle von f

- die Prozedur gibt folgende Informationen an den Aufrufer zurück:

Eine Erfolgsanzeige ok mit dem Wert 1, bzw. 0, wenn eine, bzw. keine Nullstelle gefunden wurde

Den Näherungswert x0 der Nullstelle

Die Anzahl der Iterationsschritte anzit

- das Ergebnis soll mit 15 Nachkommastellen ausgegeben werden

Wenn ich mein Programm ablaufen lasse, kommt immer eine falsche Nullstelle heraus.

Sieht da jemand den (oder die) Fehler? :confused:

Also ich hab das folgendermaßen geschrieben (wahrscheinlich viel zu kompliziert, aber vielleicht könntet ihr mir sagen, wie ichs einfacher schreiben kann):

#include <stdio.h>

#include <stdlib.h>

#include <math.h>

float fct(float x,int fn);

void nullstelle(int fn, int a, int b, double g);

int vz(float wert);

int main()

{

int fn; //Funktionsart

int a; //Intervallgrenze a

int b; //Intervallgrenze b

double g; //Genauigkeit

while(fn != 0)

{ //Funktionsarten:

printf("(1) f(x) = sin(x)\n");

printf("(2) f(x) = exp(x) - 5x + 1\n");

printf("(3) f(x) = (x * x) -2\n");

printf("(4) f(x) = 1.0/7 + 1/x\n");

printf("(5) f(x) = 2x - 2\n");

printf("(0) Beenden\n");

printf("Geben Sie die Funktion an: ");

scanf("%d",&fn);

if(fn != 0)

{

printf("a < b\n");

printf("Grenze a: ");

scanf("%d",&a);

printf("Grenze b: ");

scanf("%d",&B);

printf("Genauigkeit: ");

scanf("%lf",&g);

if(a < B)

{

nullstelle(fn,a,b,g);

}

else

{

printf("A muss kleiner als B sein\n");

}

}

}

return 0;

}

void nullstelle(int fn, int a, int b, double g)

{

int ok, anzit;

float vorne; //entspricht dem a bzw. dem neuen a

float mitte; //entspricht der Mitte von a und b

float hinten; //entspricht dem b bzw. dem neuen b

float x0; //Nullstelle

x0 = 0.0;

ok = 0; //Erfolgsanzeige

anzit = 1; //Anzahl der Iterationsschritte

vorne = a;

if (fct(a,fn) == 0) //Falls a der Nullstelle entspricht

{

x0 = a;

ok = 1;

}

else if (fct(b,fn) == 0) //Falls b der Nullstelle entspricht

{

x0 = b;

ok = 1;

}

else if (vz(fct(a,fn)) != vz(fct(b,fn))) //Falls die Vorzeichen der Funktionswerte unterschiedlich sind

{

printf("Nullstelle Gefunden!\n");

ok = 1;

vorne = a;

hinten = b;

mitte = (a+b)/2.0;

while ((mitte - vorne) > g) //Solange die Genauigkeit nicht erreicht ist

{

anzit++;

printf("Suche zwischen %.15f und %.15f\n",vorne,mitte);

if (fct(vorne,fn) == 0) //Falls das neue a der Nullstelle entspricht

{

x0 = vorne;

}

else if (fct(hinten,fn) == 0) //Falls das neue b der Nullstelle entspricht

{

x0 = hinten;

}

else if (fct(mitte,fn) == 0) //Falls die Mitte von a und b der Nullstelle entspricht

{

x0 = mitte;

}

else if (vz(fct(vorne,fn)) != vz(fct(mitte,fn))) //Falls die Vorzeichen der neuen Funktionswerte ungleich sind

{

vorne = vorne;

hinten = mitte;

mitte = vorne + (( hinten-vorne)/2.0);

}

else

{

vorne = mitte;

hinten = hinten;

mitte = vorne + (( hinten-vorne)/2.0);

}

}

}

else

{

printf("Keine Nullstelle im Intervall %d bis %d gefunden\n",a,B); ok = 0;

}

if ((x0 != vorne || x0 != mitte || x0 != hinten || x0 != a || x0 != B) && ok == 1) //Falls keine Intervallgrenze der Nullstelle entspricht

{

x0 = vorne + (mitte-vorne)/2.0;

}

else

{

x0 = x0;

}

printf("Nullstelle bei: %.15f\n",x0);

printf("f(%.15f) = %.15f\n",x0,fct(x0,fn));

printf("Anzahl der Iterationsschritte: %d\n",anzit);

}

int vz(float wert) //Überprüfung des Vorzeichens

{

int vz;

if(wert < 0)

{ vz = 0; }

else

{ vz = 1; }

return vz;

}

float fct(float x, int fn) //Berechnung des Funktionswertes

{

float ergebnis;

switch (fn)

{

case 1: ergebnis = sin(x);

break;

case 2: ergebnis = exp(x)-(5.0*x)+1.0;

break;

case 3: ergebnis = pow(x,2)-2.0;

break;

case 4: ergebnis = (1.0/7.0)+(1.0/x);

break;

case 5: ergebnis = 2.0 * x - 2.0;

break;

default: ergebnis = 0.0;

break;

}

return ergebnis;

}

Hoffe, es war nicht zu verwirrend

MfG Anel

Bearbeitet von Anel
Link zu diesem Kommentar
Auf anderen Seiten teilen

  • Bitte überleg dir aussagekräftige Titel für deine Threads. "Schon wieder ein Problem" ist keiner.
  • Benutz Code-Tags, damit die Einrückung deines Codes nicht verlorengeht
  • Liefere eine ordentliche Fehlerbeschreibung. Bei welcher Eingabe wird welches falsche Ergebnis angezeigt? Wie ist das erwartete Ergebnis?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...