Autor Beitrag
kili
Hält's aus hier
Beiträge: 13



BeitragVerfasst: Sa 24.10.09 00:29 
moin moin,
hätte da nochmal eine frage :-) und zwar möchte ich mit einem iterativen Berechnungsverfahren (das ergebnis der berechnung, ist der ausgangswert der nächsten berechnung bis das ergebnis zufrieden stellt) den kehrwert einer zahl berechnen bzw. wie unser prof sagen würde: den reziproken Wert einer
rationalen Zahl.
naja wie auch immer, also ich hab da schon was probiert, aber ich vermute das mein fehler darin besteht das meine methode immer wieder den gleichen wert berechnet was auch die ausgabe erklärt: nämlich gar keine. z.b geb ich 4 ein und anstatt 0,25 raus zu geben passiert gar nichts (die bedingung wird halt nicht erfüllt). also weiß jemand wie ich die berechnung schreiben muss damit das ergebnis der berechnung der ausgangswert der nächsten berechnung wird. ich hoffe mein problem ist verständlich,..... :-)
schon mal ganz vielen dank im voraus

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
Console.WriteLine("Bitte geben Sie eine Zahl ein");
      double a = Convert.ToDouble(Console.ReadLine());
        Console.WriteLine("TEST" + berechnung (a));
          Console.ReadLine();

    }
     
     static double berechnung (double a)
      {
          
      double zahl = 0.00000001;
      double x0 = 2 / a - zahl;
      double xn =x0;
      double xa;
        do {
            xa = xn;
          xn = 2 * x0 - a * (x0 * x0);
        
        } while (xn - xa < zahl);
     return xn;
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Sa 24.10.09 11:33 
Zum Algorithmus kann ich nichts sagen, denn das Verfahren ist mir vollkommen unbekannt... wozu überhaupt den Kehrwert annähern, wenn man für die Berechnung von x(0) die Division verwenden darf :gruebel: ? Für ein iteratives Verfahren fehlt aber auf jeden Fall die Berechnung von x(n) aus x(n-1)! Bei der Zuweisung von xn sollte auf der rechten Seite ebenfalls xn, nicht x0, stehen.

PS: Sicher, dass die Formel stimmt? Wenn ich das "zahl"-Epsilon vernachlässige, ist x(1) immer 0 :!:

_________________
>λ=
kili Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: Sa 24.10.09 11:48 
also die formel soll lauten:

Xn+1= 2 * Xn - a * Xn^2 wobei halt der erste x wert vom programm selbst zu errechnen ist, in diesem fall halt [X0= 2/a - 0,00000001]
und das programm ist zu stoppen wenn Xn+1 - Xn kleiner als 0,00000001 ist (also quasi wenn xn+1 und xn gleich sind). also die formel ist richtig sagt zumindest mein taschenrechner,....
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Sa 24.10.09 12:06 
Oh, das funktioniert ja wirklich :mrgreen: . Dann musst du wie gesagt nur noch wirklich iterativ berechnen.

_________________
>λ=
kili Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: Sa 24.10.09 12:14 
ja genau da liegt ja mein problem hab wohl grad wieder nen brett vorm kopf läufts bei dir?
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Sa 24.10.09 12:19 
user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
Für ein iteratives Verfahren fehlt aber auf jeden Fall die Berechnung von x(n) aus x(n-1)! Bei der Zuweisung von xn sollte auf der rechten Seite ebenfalls xn, nicht x0, stehen.
Damit meinte ich diese Zeile ;) :
ausblenden C#-Quelltext
1:
xn = 2 * x0 - a * (x0 * x0);					

_________________
>λ=
kili Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: Sa 24.10.09 12:24 
ahhhh :-)
so in etwa? da kommt nur mist raus :-)

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
 double zahl = 0.00000001;
      double x0 = 2 / a - zahl;
      double xn =x0;
      double xa;
        do {
            xa = xn;
          xn = 2 * xn - a * (xn * xn);
        
        } while (xn - xa < zahl);
     return xn;


Moderiert von user profile iconChristian S.: C#-Tags hinzugefügt
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Sa 24.10.09 13:06 
Die Mathematik stimmt, also kommt jetzt der Computer dran: Debugging ist angesagt ;) . Wenn du die Abbruchbedingung weglässt, kommen offensichtlich korrekte Werte raus:
Zitat:
0,99999999
1,99999998784506E-08
3,99999989569012E-08
7,99999947138025E-08
1,59999976627607E-07
3,19999902055228E-07
6,39999599310582E-07
1,27999837942219E-06
2,55999348205268E-06
5,1199738569721E-06
1,02398952856796E-05
2,04795808604483E-05
4,09583228944321E-05
8,19132906204356E-05
0,000163813161666511
0,000327572653829151
0,000654930699971229
0,00130900353149893
0,0026145800825069
0,00521548810699812
0,0103765735816078
0,0205378006046265
0,0402319987019022
0,0772267699647047
0,142525591931047
0,244424095151503
0,369361913721744
0,46586738082711
0,497669928616797
0,499989141534698
0,499999999764187
0,5

Mit der Abbruchbedingung kann also etwas nicht stimmen. Die Berechnung soll doch wohl abbrechen, wenn die Differenz zweier Folgenglieder unter ein Epsilon fällt. Dann hast du die Relation aber exakt vertauscht, es muss ein ">" sein :zwinker: . Außerdem sehen wir, dass x(1)-x(0) negativ ist, also nehmen wir lieber
ausblenden C#-Quelltext
1:
while (Math.Abs(xn - xa) > zahl);					

So sollte es dann endlich stimmen :D .

_________________
>λ=
kili Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: Sa 24.10.09 13:29 
also erstmal vielen dank für deine geduld (ich dreh hier nämlich gleich durch ;-) ) aber er kennt den befehl für den betrag einer zahl nicht:

Fehler 1 Der Typ- oder Namespacename "Abs" ist im Namespace "Math" nicht vorhanden. (Fehlt ein Assemblyverweis?) kannst du mir das vielleict auch noch erklären?

kann das sein das ich die vollversion benötige? ohh man
Gabe
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 39



BeitragVerfasst: Sa 24.10.09 13:34 
Hi,

interessante Aufgabe :-)

Vollversion brauchst nicht.
Math ist im namespace System.

Einfach oben

ausblenden C#-Quelltext
1:
using System;					


hinzufügen. Dann sollt es klappen.

Gruß gabe

Edit: System hast du doch schon eigentlich für die Console eingebunden, oder?
kili Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: Sa 24.10.09 13:47 
ahhh alles klar,.. omg schwere geburt aber es wird, vielen dank euch beiden :-) :-)


Zuletzt bearbeitet von kili am Sa 24.10.09 14:05, insgesamt 1-mal bearbeitet
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Sa 24.10.09 14:03 
Zitat:
Fehler 1 Der Typ- oder Namespacename "Abs" ist im Namespace "Math" nicht vorhanden.

Hmm. Math ist eigentlich eine Klasse und kein Namespace. Kann es sein das du zufällig(oder eher absichtlich :) ) einen Namespace für dein Programm gewählt hast das den Namensbestandteil Math enthält? Dann wird zuerst dort gesucht und Abs natürlich nicht gefunden.
Sicherheitshalber solltest du erstmal die Math Klasse vollqualifizieren heißt mit kompletten Namesspace ansprechen. Also

ausblenden C#-Quelltext
1:
while (System.Math.Abs(xn - xa) > zahl);					
kili Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: Sa 24.10.09 14:06 
an ralf: ja das war mein fehler,...