Funktionswerte in Tabelle übergeben



  • Also meine Aufgabe besteht darin, die Funktion:

    y=exp(-x2)

    im Intervall

    -1<=x<=1

    mit einer Schrittweite von 0,01 zu berechnen und alle Ergebnisse in tabellarischer Form zu präsentieren.

    Die Funktion selber ist ja denke ich so schon richtig:

    z = pow(-x,2);
    y = exp(z);
    

    Bin mir da selber nur über die Potenz innerhalb der Expotentialfunktion im Unklaren, aber so dürfte es wohl auch gehen.

    Die Schleife für diesen Vorgang dürfte in der Art ja auch schon fertig sein:

    for (i=-1/*Indexanfang*/;i<=1/*Indexende*/;i=i+1)
    
        {
            y=i+1;
            printf("%.2f\n",i,y);
    }
    

    Hauptproblem: Ganz klar, wie baue ich die Schrittweise ein. Mein erster Veruch lautet gesamt gesehen:

    #include <stdio.h>
    #include <math.h>
    
    int main ()
    {
        int ianf,iend,i;
        float x,y,z;
    
        ianf = -1;
        iend = 1;
    
        i=0,01;/*Geht das so?*/
        x = i;
        z = pow(-x,2);
        y = exp(z);
    
        for (i=ianf;i<=iend;i=i+1)
    
        {
            y=i+1;
            printf("%.2f\n",i,y);/*??Da stecke ich auch noch fest,siehe unten*/
    }
    
        getchar();
        getchar();
        return(0);
    
    }
    

    Wegen

    printf("%.2f\n",i,y);
    

    habe ich halt noch Verständnis-Probleme, Ansatz kann natürlich völlig falsch sein??.

    Insgesamt kriege ich jetzt 3*die "null" ausgegeben, logisch nach mienem Schema, weil stehend für die unter Grenze, Schritt 1, ober Grenze, aber irgendwie stecke ich wohl fest.
    Weiß jemand einen Ansatz??



  • for (i=ianf;i<=iend;i=i+1)
    

    Wenn du 0.01'er Schritte haben willst, ist das falsch. Da wird ja gleich nach dem ersten mal 0.01 rauskommen.

    mach mal eher so:

    for (float z = ianf;z<= iend; z+= i)
    ...
    

    Hier wird eine neue Variable eingeführt, die einfach zum zählen da ist. Hier wird dann nach jedem Schritt i dazugezählt.

    EDIT:
    Da du i als Integer erzeugst, wird ein 0.01 zu zu 0 abgeschnitten. Also als float erstellen.



  • #include <iostream>
    #include <cmath>
    using namespace std;
    
    float Function(float x)
    {
      float tmp = pow(-x,2);
      return exp(tmp);
    }
    
    int main ()
    {   
        for (float x = -1.0f; x <= 1.0f; x += 0.01f)
        {
          float y = Function(x);
          cout << "x = " << x << '\t' << "f(x) = " << y << endl;
        }
    
        cin.get();
        return 0;
    
    }
    

    So koennte es zum Bsp. aussehen.



  • Hi und Danke euch beiden.
    @DeSoVoDaMu:

    DeSoVoDaMu schrieb:

    using namespace std;

    Was macht dieser Aufruf genau?

    float Function(float x)
    {
    float tmp = pow(-x,2);
    return exp(tmp);
    }

    Hätte ich wohl erwähnen sollen: Wir sollen das ganze ohne Funktionsaufruf gestalten.

    Was heisst genau

    cout

    .
    Danke für die Hilfe.



  • Am besten wäre es wohl, wenn du dich richtig mit C++ befassen würdest, diese Fragen werden in jedem guten Tutorial oder Buch erklärt. 🙄

    Aber ich will ja mal nicht so sein 😉

    using namespace std; bedeutet, dass ab da der Namensraum std verwendet wird, d.h. du musst z.B. nicht mehr std::cout, sondern nur noch cout schreiben.

    Du willst es also ohne Funktionsaufruf machen. Kopier doch einfach die Anweisungen in Function(float x) in die Stelle des Quelltextes, wo die Funktion aufgerufen wird.

    Mit cout kann man Streams auf der Konsole anzeigen lassen. Der Operator << trennt dabei die einzelnen Teile, z.B. Zeichenketten und Integer.



  • boenz666 schrieb:

    Hi und Danke euch beiden.
    @DeSoVoDaMu:

    DeSoVoDaMu schrieb:

    using namespace std;

    Was macht dieser Aufruf genau?

    float Function(float x)
    {
    float tmp = pow(-x,2);
    return exp(tmp);
    }

    Hätte ich wohl erwähnen sollen: Wir sollen das ganze ohne Funktionsaufruf gestalten.

    Was heisst genau

    cout

    .
    Danke für die Hilfe.

    Ich habe das Gefühl, das du im falschen Forum bist. 😉 Du machst doch C..

    Egal. In C++ gibt es sogenannte namespace, den du entweder so:

    std:: ...
    

    oder so

    using namespace std;
    

    bekannt machst.

    cout ist ein solches Objekt, dass sich im Namensraum von std befindet, also kann man

    std::cout << "Hallo, Welt.";
    

    schreiben oder so:

    ... using namespace std;
    ...
    cout << "Hallo, Welt.";
    

    Im übrigen gibt cout etwas auf dem Screen aus. Vergleichbar mit printf.



  • Ich würde das so mit Cplusplus machen:

    #include <iostream>
    #include <cmath>
    #include <iomanip>
    
    using namespace std;
    
    int main()
    {
        double sample = -1.0;
    
        while(sample <= 1.0)
        {
            std::cout   << std::fixed << std::setprecision(3)
                        << sample
                        << std::setprecision(8)
                        << std::setw(14) << std::exp(std::pow(-sample, 2)) << std::endl;
            sample += 0.01;
        }
        return 0;
    }
    


  • man sollte eine gleitkommazahl wegen dem rundungsfehler nicht als schleifenvariable verwenden.

    for (int i = -100; i != 100; ++i)
    {
       float x = i / 100.0f;
       float y = Function(x);
       cout << "x = " << x << '\t' << "f(x) = " << y << endl;
    }
    


  • Ich habe das Gefühl, das du im falschen Forum bist. 😉 Du machst doch C..

    Hab das wohl tatsächlich falsch verstanden, weil in meinem Tool steht dev-c++
    und der Prof. meinte immer irgendwas von c++, aber in Anbetracht dessen, dass mir eure Befehle völlig fremd sind haste wohl recht 😉
    Also gehe ich damit mal rüber, trotzdem Danke an alle, die sich daran versucht haben, sehr freundlich. ➡



  • Abgesehen von allem anderen glaube ich, dass eher -pow(x, 2) als pow(-x,2) gemeint ist, weil (-x)² = x². Außerdem ist pow() beim Quadrieren unnötig, x*x sollte schneller oder genau gleich schnell gehen.


Anmelden zum Antworten