Approximation



  • Ach ich glaub ich weiß es so bissl ich probiere mal und schreib dann mal was rein. bis .. DANKE



  • Da habe ich nicht genau genug hingesehen - wenn in der Aufgabe ein Array gefordert wird, mußt du natürlich auch ein (bzw. zwei) Array verwenden:

    double x[1000],y[1000];
    for(int i=0;i<n;++i)
      cin>>x[i]>>y[i];
    

    (und anschließend läufst du noch einmal über deine Arrays, um die einzelnen Summen ∑xi etc berechnen zu können)



  • CStoll schrieb:

    Da habe ich nicht genau genug hingesehen - wenn in der Aufgabe ein Array gefordert wird, mußt du natürlich auch ein (bzw. zwei) Array verwenden:

    double x[1000],y[1000];
    for(int i=0;i<n;++i)
      cin>>x[i]>>y[i];
    

    (und anschließend läufst du noch einmal über deine Arrays, um die einzelnen Summen ∑xi etc berechnen zu können)

    ohh. ja aber des mit dem sxx,syx und so kann ich doch alles lassen weilso hat es unser prof auch erklärt. also die felder kann ich ja gleich hinter die if else hägen dass ist klar und wenn ichs richtig verstehe wird mir dem cin[i] dann der wert in die felder geschrieben

    EDIT

    oder muss ich dann vorher ne for schleife machen und Sx+=x[i] machen??

    bisher:

    #include <iostream>
    #include <cmath>
    using namespace std;
    void main (void)
    { 
    	double A,B,n,s,i,x;
    	cout<<"Anzahl der Messpunkte eingeben:"<<endl;
    	cin>>n;
    	if(n<=2)
    	{
    		cout<<"Der Wert muss groesser/gleich 2 sein!! Bitte erneut eingeben!!"<<endl;
    		cin>>n;
    	}
    	else
    	{
    		cout<<"Bitte die Messpunkte eingeben"<<endl;
    double Sx=0,Sy=0,Sxy=0,Sxx=0,x[1000],y[1000];
    for(int i=2;i<n;++i)
      cin>>x[i]>>y[i];
    {
    	Sx+=x;
    	Sy+=y;
    	Sxy+=y*x;
    	Syy+=x*x;
    }
    A=(Sxx*Sy-Sx*Sxy)/(Sxx-Sx*Sx);
    cout<<A;
    


  • Ein ganzes Array auf einmal aufsummieren beherrscht C++ leider nicht - das mußt du schon in einer Schleife erledigen.

    (bei der Variante dort oben habe ich mir das Array gespart und die Eingaben direkt summiert)



  • CStoll schrieb:

    Ein ganzes Array auf einmal aufsummieren beherrscht C++ leider nicht - das mußt du schon in einer Schleife erledigen.

    (bei der Variante dort oben habe ich mir das Array gespart und die Eingaben direkt summiert)

    würde also heißen ich muss vor meine

    {
    	Sx+=x;
    	Sy+=y;
    	Sxy+=y*x;
    	Syy+=x*x;
    }
    

    eine for schleife hängen oder?
    moment ich machs mal und zeig es dann noch mal.

    so oder??

    for(int i=2,i<n,++1)
    {
    	Sx+=x[i];
    	Sy+=y[i];
    	Sxy+=y[i]*x[i];
    	Syy+=x[i]*x[i];
    }
    


  • Mach aus dem unteren Part folgendes:

    for(int i=2;i<n;++i){
      cin>>x[i]>>y[i];
        Sx+=x[i];
        Sy+=y[i];
        Sxy+=y[i]*x[i];
        Syy+=x[i]*x[i];
    }
    

    Ich weiß jetzt nicht ob dir Formeln so richtig sind, aber so hast du am Ende folgendes:
    - 2 Arrays, x in dem alle X-Werte stehen und y in dem alle Y-Werte stehen
    - Sx in dem die Summe aller X-Werte steht
    - Sy in dem die Summe aller Y-Werte steht
    - Sxy in dem die Summe aller Produkte der jeweiligen X- und Y-Werte stehen
    - Syy in dem die Summe aller Quadrate der jeweiligen X-Werte stehen



  • Jo genau so habe ichs ja auch gemacht. Bin doch nit ganz so dumm:D Naja wohl doch. Wir ham nicht viel Info in dem Semester da sollen wir/ und sind sehr dankbar über so ein Forum hier.



  • So meine mal gesamt:

    #include <iostream>
    #include <cmath>
    using namespace std;
    void main (void)
    { 
    	double A,B,n,s,i,x;
    	cout<<"Anzahl der Messpunkte eingeben:"<<endl;
    	cin>>n;
    	if(n<=2)
    	{
    		cout<<"Der Wert muss groesser/gleich 2 sein!! Bitte erneut eingeben!!"<<endl;
    		cin>>n;
    	}
    	else
    	{
    		cout<<"Bitte die Messpunkte eingeben"<<endl;
    	}
    double Sx=0,Sy=0,Sxy=0,Sxx=0,x[1000],y[1000];
    for(int i=2;i<n;++i)
      cin>>x[i]>>y[i];
    for(int i=2;i<n;++1)
    {
    	Sx+=x[i];
    	Sy+=y[i];
    	Sxy+=y[i]*x[i];
    	Sxx+=x[i]*x[i];
    }
    A=((Sxx*Sy)-(Sx*Sxy))/(n*(Sxx-(Sx*Sx)));
    cout<<A<<endl;
    B=(n*Sxy-(Sx*Sy))/(n*Sxx-(Sx*Sx));
    cout<<B<<endl;
    	}
    

    Sind noch 7 Fehler drin. Die meisten sind bei dem Sx,Sy, ... da meint er:"Index erfodert ein Array oder ein Zeigertyp"! Was heißt das?

    1>------ Erstellen gestartet: Projekt: Aufgabe_05, Konfiguration: Debug Win32 ------
    1>Kompilieren...
    1>Approximation.cpp
    1>d:\dokumente und einstellungen\niklas\eigene dateien\visual studio 2005\projects\informatikpraktikum i\aufgabe_05\approximation.cpp(18) : error C2040: 'x': 'double [1000]' unterscheidet sich von 'double' in Bezug auf die Anzahl vorgenommener Dereferenzierungen
    1>d:\dokumente und einstellungen\niklas\eigene dateien\visual studio 2005\projects\informatikpraktikum i\aufgabe_05\approximation.cpp(20) : error C2109: Index erfordert ein Array oder einen Zeigertyp
    1>d:\dokumente und einstellungen\niklas\eigene dateien\visual studio 2005\projects\informatikpraktikum i\aufgabe_05\approximation.cpp(21) : error C2105: '++' muss ein L-Wert sein
    1>d:\dokumente und einstellungen\niklas\eigene dateien\visual studio 2005\projects\informatikpraktikum i\aufgabe_05\approximation.cpp(23) : error C2109: Index erfordert ein Array oder einen Zeigertyp
    1>d:\dokumente und einstellungen\niklas\eigene dateien\visual studio 2005\projects\informatikpraktikum i\aufgabe_05\approximation.cpp(25) : error C2109: Index erfordert ein Array oder einen Zeigertyp
    1>d:\dokumente und einstellungen\niklas\eigene dateien\visual studio 2005\projects\informatikpraktikum i\aufgabe_05\approximation.cpp(26) : error C2109: Index erfordert ein Array oder einen Zeigertyp
    1>d:\dokumente und einstellungen\niklas\eigene dateien\visual studio 2005\projects\informatikpraktikum i\aufgabe_05\approximation.cpp(26) : error C2109: Index erfordert ein Array oder einen Zeigertyp
    1>Das Buildprotokoll wurde unter "file://d:\Dokumente und Einstellungen\Niklas\Eigene Dateien\Visual Studio 2005\Projects\InformatikPraktikum I\Aufgabe_05\Debug\BuildLog.htm" gespeichert.
    1>Aufgabe_05 - 7 Fehler, 0 Warnung(en)
    ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========



  • 1. Du hast 'x' oben noch einmal definitiert, hast also eine doppelte Definition.
    2. Deine Schleifen fangen bei 2 an zu zählen, dadurch läßt du die ersten beiden Punkte weg, ließt also nur n-2 Punkte ein. Gewollt?

    EDIT:

    3. In der zweiten Schleife hast du ++1 stehen, müsste aber ++i heißen.



  • Fellhuhn schrieb:

    1. Du hast 'x' oben noch einmal definitiert, hast also eine doppelte Definition.
    2. Deine Schleifen fangen bei 2 an zu zählen, dadurch läßt du die ersten beiden Punkte weg, ließt also nur n-2 Punkte ein. Gewollt?

    EDIT:

    3. In der zweiten Schleife hast du ++1 stehen, müsste aber ++i heißen.

    hmm unser Prof hatte das mal gesagt die schleifen erst ab 2 zu zählen weil die eingeaben ja auch größer wie 2 sein müssen. aber ich kanns ja mal ändern und gucken was dann passiert



  • #include <iostream>
    #include <cmath>
    using namespace std;
    void main (void)
    { 
    	double A,B,n,s,i;
    	cout<<"Anzahl der Messpunkte eingeben:"<<endl;
    	cin>>n;
    	if(n<2)
    	{
    		cout<<"Der Wert muss groesser/gleich 2 sein!! Bitte erneut eingeben!!"<<endl;
    		cin>>n;
    	}
    	else
    	{
    		cout<<"Bitte die Messpunkte eingeben"<<endl;
    	}
    double Sx=0,Sy=0,Sxy=0,Sxx=0,x[1000],y[1000];
    for(int i=2;i<n;++i)
    cin>>x[i]>>y[i];
    for(int i=2;i<n;++i)
    {
    	Sx+=x[i];
    	Sy+=y[i];
    	Sxy+=y[i]*x[i];
    	Sxx+=x[i]*x[i];
    }
    A=((Sxx*Sy)-(Sx*Sxy))/(n*(Sxx-(Sx*Sx)));
    cout<<A<<endl;
    B=(n*Sxy-(Sx*Sy))/(n*Sxx-(Sx*Sx));
    if
    (n*Sxx-(Sx*Sx)==0 ||(n*Sxx-(Sx*Sx))==0 )
    {	
    		cout << " Mathematischer Widerspruch bei der Berechnung von b!!! Bitte schließen Sie das Fenster" <<endl;
    	}
    cout<<"y="<<A<<"+"<<B<<"*"<<"x"<<endl;
    	}
    

    Also danke schonmal. So läuft das Programm schon mal aber es funktioniert noch nit so ganz. woher weiß ich denn eigentlich welche zahl in y feld und welche in x feld muss



  • Eigentlich ist es egal was du machst, solange du an dem selben Punkt anfängst die Arrays zu beschreiben, wie du sie auch bearbeitest. Nur da du bei 2 anfängst und bis 1000 gehst, beschränkst du dich auf 998 Punkte.
    Kannst natürlich auch bei 2 anfangen und die Abfrage auf < 1002 ändern. Dann hast wieder 1.000 Elemente. 😉



  • Fellhuhn schrieb:

    Eigentlich ist es egal was du machst, solange du an dem selben Punkt anfängst die Arrays zu beschreiben, wie du sie auch bearbeitest. Nur da du bei 2 anfängst und bis 1000 gehst, beschränkst du dich auf 998 Punkte.
    Kannst natürlich auch bei 2 anfangen und die Abfrage auf < 1002 ändern. Dann hast wieder 1.000 Elemente. 😉

    hmm achso weil er hat uns ein tipp gegeben da hat er gemeint die ersten 2 in der Summe muss man erst
    Sx=x[0]+x[1];
    rechnen dann fängt die schleife ab 2 an weiß aber nit warum

    wenn ich dann die Felder eingebe. Schreib ich dann erst alle x und dann alle y hin oder ist des abwechseln immer ein x mit passendem y?



  • Vermutlich weil die da sein müssen. Klingt natürlich für einen "Nicht-Programmierer" logisch die fixen Parameter so zu berechnen und den Rest über eine dynamische Schleife laufen zu lassen. 😉



  • Fellhuhn schrieb:

    Vermutlich weil die da sein müssen. Klingt natürlich für einen "Nicht-Programmierer" logisch die fixen Parameter so zu berechnen und den Rest über eine dynamische Schleife laufen zu lassen. 😉

    Häää was meinst du jetzt? Muss ich doch noch was ausbessern? Sxx=x[0]*x[1];Sx=x[0]+x[1],....???

    Sx=x[0]+x[1];
    Sy=y[0]+y[1];
    Sxy=x[0]*y[0]+x[1]*y[1];
    Sxx=x[0]*x[0]+x[1]+x[1];
    for(int i=2;i<n;++i)
    	{
    	Sx+=x[i];
    	Sy+=y[i];
    	Sxy+=y[i]*x[i];
    	Sxx+=x[i]*x[i];
    	}
    

    danke



  • wog schrieb:

    wenn ich dann die Felder eingebe. Schreib ich dann erst alle x und dann alle y hin oder ist des abwechseln immer ein x mit passendem y?

    Das ist dir überlassen - du mußt nur die Eingabe entsprechend regeln (momentan liest du abwechselnd einen x-Wert und den zugeöhrigen y-Wert ein)



  • Wenn Sx etc das sein soll, was ich auf der letzten Seite geschrieben habe, ist es richtig so wie es momentan ist. Ich kann nur den Programmierkram kontrollieren, nicht die Mathematik dahinter. Dafür ist es zu spät. 😉



  • Fellhuhn schrieb:

    Wenn Sx etc das sein soll, was ich auf der letzten Seite geschrieben habe, ist es richtig so wie es momentan ist. Ich kann nur den Programmierkram kontrollieren, nicht die Mathematik dahinter. Dafür ist es zu spät. 😉

    das sollte stimmen unterhttp://wog-sen.de/a_5.JPG

    habe ich ja mal die aufgabe geuppt.

    mein programm sieht so aus: Es läuft ja aber wenn ich die werte eingebe der er uns gegeben hat dann kommt was anderers raus wie seine ausgabe

    #include <iostream>
    #include <cmath>
    using namespace std;
    void main (void)
    { 
    	double A,B,n,s,i;
    	cout<<"Anzahl der Messpunkte eingeben:"<<endl;
    	cin>>n;
    	if(n<2)
    	{
    		cout<<"Der Wert muss groesser/gleich 2 sein!! Bitte erneut eingeben!!"<<endl;
    		cin>>n;
    	}
    		cout<<"Bitte die Messpunkte eingeben - Immer abwechselnd ein X und ein Y"<<endl;
    double Sx=0,Sy=0,Sxy=0,Sxx=0,x[1000],y[1000];
    for(int i=0;i<n;++i)
    cin>>x[i]>>y[i];
    
    Sx=x[0]+x[1];
    Sy=y[0]+y[1];
    Sxy=x[0]*y[0]+x[1]*y[1];
    Sxx=x[0]*x[0]+x[1]+x[1];
    for(int i=2;i<n;++i)
    	{
    	Sx+=x[i];
    	Sy+=y[i];
    	Sxy+=y[i]*x[i];
    	Sxx+=x[i]*x[i];
    	}
    A=((Sxx*Sy)-(Sx*Sxy))/(n*Sxx-(Sx*Sx));
    B=(n*Sxy-(Sx*Sy))/(n*Sxx-(Sx*Sx));
    if
    (n*Sxx-(Sx*Sx)==0 ||(n*Sxx-(Sx*Sx))==0 )
    	{	
    		cout << " Mathematischer Widerspruch bei der Berechnung von b!!! Bitte schließen Sie das Fenster" <<endl;
    	}
    cout<<"y="<<A<<"+"<<B<<"*"<<"x"<<endl;
    }
    


  • Ok danke es geht jetzt ich habe wieder das:
    Sx=x[0]+x[1];
    Sy=y[0]+y[1];
    Sxy=x[0]*y[0]+x[1]*y[1];
    Sxx=x[0]*x[0]+x[1]+x[1];

    entfernt und es geht. Naja hauptsach unser Prof hat uns des als Tip gegeben:) Schlechter Tip..
    😃

    DANKE

    Ich schaue die Tage noch mal vorbei habe noch eine schöne Aufgabe im Gepäck, da werde ich sicher eure Hilfe brauchen:)

    lg und frohe Weihnachten falls man sich nicht mehr schreibt

    WOG



  • CStoll schrieb:

    Ein ganzes Array auf einmal aufsummieren beherrscht C++ leider nicht

    Wasn mit std::accumulate 😉


Anmelden zum Antworten