Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Schon wieder ein Problem

Empfohlene Antworten

Veröffentlicht

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

  • 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?

Jetzt hab ich, während ich diese Antwort schreiben wollte, meine Fehler selbst gefunden! :D

Aber trotzdem danke für die Mühen!

Lg Anel

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.