-         

Ergebnis 1 bis 6 von 6

Thema: Problem: Unterprogramme mit Nullstellensuche

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    23.11.2007
    Beiträge
    7

    Problem: Unterprogramme mit Nullstellensuche

    Anzeige

    Hallo,

    habe ein Problem mit meinem C-Code. Das Programm das ich geschrieben habe berechnet mir nicht die richtigen Nullstellen aus und ich weiss jetzt nicht wo das Problem liegen könnte.

    z. B.: für bei den Eingaben:
    - Auswahl der Funktion: 5
    - Intervallgrenze a: 0
    - Intervallgrenze b: 2
    - Genauigkeit: 0.001

    erscheint als Ausgabe folgendes:
    - Ergebnis d. ausgwaehten Funktion ist: 1.#QNAN0
    - f(x0)=-2.000000
    - Interationsschritte: 2293580

    Würd mich freuen, falls mir mal jemand da helfen könnte.

    Gruß
    wodka_cheery

    Hier mal den Code:


    Code:
    # include <stdio.h>
    # include <stdlib.h>
    # include <math.h>
    
    // TA a)
    
    int fn;            //globale Variable
    
    double f(double x)      //Funktion f mit reellen Parameter x 
    {         
        double ergebnis;
               
               switch (fn)
               {
                      case 1: ergebnis = sin(x);
                              break;
                              
                      case 2: ergebnis = ((double)exp(x))-(5*x)+1;
                              break;
                              
                      case 3: ergebnis = (x*x)-2;
                              break;
                              
                      case 4: ergebnis = (1/7)+(1/x);
                              break;
                              
                      case 5: ergebnis = (2*x)-2;
                              break;
                              
                     default: printf("Fehler bei der Eingabe.\n");
                              break;
               }     
    return ergebnis;
    }
    
    // TA b)
    
    double nullstelle(double a, double b, double g)  
    { 
           //Rueckgabeparameter
           int anzit=0;     //anzit steht für die Ausgabe der Iterationschritte
           int ok=1;     //Variable für Wahrheitswerte true and false
           double x0;    //später zur Berechnung von f(x0) falls ok = 1 ist
           
           double c=0;
           double ergebnis;
         
           do
           {
                c=(a+b)/2;
                
                if((f(a)<0 && f(b)>0) || (f(a)>0 && f(b)<0))
                {
                           if(f(c)>0)
                           {
                                     //a=a;
                                     c=b;
                           }
                           
                           if(f(c)<0)
                           {
                                    //b=b;
                                    c=a;          
                           }
                           
                           if(f(a)==0)
                           {
                                      c=b=a; //x0=a 
                                      ok==1;                                      
                           }
                           
                           if(f(b)==0)
                           {
                                      c=a=b; //x0=b  
                                      ok==1;                                 
                           }
                }                       
           }
           while(((f(a)-f(b))>(g)) && (ok!=1));       
           anzit++;
           x0=c;
    
    }
    
    // TA c)
    
    int main (void)
    {
        double x0, x;
        double a, b, g;
        int anzit;      //Anzahl der Iterationsschritte
        
        
        printf("Zur Auswahl einer Funktion f, geben Sie bitte eine Zahl zwischen 1 und 5 ein.\n");
    	scanf("%d", &fn);
    
    	printf("Geben Sie die Intervallgrenze a ein: ");
    	scanf("%lf", &a);
    
    	printf("Geben Sie die Intervallgrenze b ein: ");
    	scanf("%lf", &b);
    
    	printf("Geben Sie die Genauigkeit an: ");
    	scanf("%lf", &g);
    
        // Ergebnis:
        x=nullstelle(a, b, g); //Funktionsaufruf
        
           printf("Ergebnis der ausgewaehlten Funktion ist: %lf\n", f(x));
           printf("f(x0) = %lf\n", f(x0));
           printf("Anzahl der Iterationsschritte: %d\n", &anzit);
        
    	system ("pause");
    	return 0;
    }

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    29.07.2007
    Beiträge
    386
    welcher compiler, welches system, wie sieht die make aus, welche optimierung hast du eingschaltet?

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    23.11.2007
    Beiträge
    7
    benutze einen Bloodshed C/C++ compiler, BS Windows XP

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    21.12.2004
    Alter
    33
    Beiträge
    165
    schnapp dir endlich mal ein Buch ueber die Grundlagen von C, und lese insbesondere die Kapitel ueber die Gueltigkeit von Variablen, lokalen Variablen und globalen Variablen.
    Und wenn du schon dabei bist und deine naechste Frage sein wird wie du x0 und anzit aus der Funktion wieder herausbekommst lese am besten gleich die Kapitel ueber Zeiger (da findest du dann auch gleich die Erklaerung was das & eigentlich macht bzw in deinem Code nicht macht) und/oder structs gleich mit. Oder les am besten das ganze Buch von Seite 1 an.
    [EDIT]Und weil wir schon dabei sind, es ist oft unsinnig x=foo(); zu schreiben wenn in foo() nichts per return zurueckgegeben wird.
    Das sollten erstmal die groebsten "Syntax"-Fehler sein die mir beim ueberfliegen aufgefallen sind.[/EDIT]


    Hier mal ein auch fuer dich verstaendliches Stueck Code um das ganze zu demonstrieren.

    Code:
    #include <stdio.h>
    
    void test(void)
    {
      int a,b;
      a = 1;
      b = 2;
      printf("In der Funktion test a = %d, b = %d.\n",a,b);
    }
    
    int main(void)
    {
      int a,b;
      a = 111;
      b = 222;
      printf("vor dem Aufruf von test a = %d, b = %d.\n",a,b);
      test();
      printf("Nach dem Ablauf von test a = %d, b = %d.\n",a,b);
    }
    Und die Ausgabe dazu:
    Code:
    vor dem Aufruf von test a = 111, b = 222.
    In der Funktion test a = 1, b = 2.
    Nach dem Ablauf von test a = 111, b = 222.

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    24.10.2007
    Ort
    Loughborough
    Alter
    34
    Beiträge
    53
    Du bekommst zusaetzlich noch falsche Ergebnisse, da die Funktion nullstelle nichts zurueck gibt. Ich habe zumindest kein Return gefunden ...

    MfG,
    Kiraminh

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    23.11.2007
    Beiträge
    7
    Hab die Lösung auf das Problem schon gefunden.

    Gruß
    wodka_cheery

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •