PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [Frage] wurzeln...


saddevil
2006-11-17, 00:30:55
hi

wir programmieren mit "C"

wir sollen mit hilfe des iterationsverfahrens die n-te wurzel aus a brechnen

das newtonsche iterationsverfahren oder das dazu verwendete Heron-Verfahren
hab ich mir schon x-mal angesehen ,...

nur steh ich irgendwie auf dem schlauch

kann mir dabei jemand mal helfen ?
oder hat gute tips ???

ergebniss soll die wurzel sein und die menge der iterationen ( laufvariable )


danke

Gnafoo
2006-11-17, 05:03:32
Im Prinzip ist das doch nicht so schwer. Zur Formel siehe Wikipedia (http://de.wikipedia.org/wiki/Heron-Verfahren), aber die hast du ja wohl sowieso schon.
Was du dann tun musst ist eigentlich recht einfach: du setzt einfach den Radikanten als Startwert für x und a ein und führst die Berechnung n mal durch, wobei x in jedem Schritt durch ein neues x ersetzt wird. Du setzt also in jedem Schleifendurchlauf x=(x+a/x)/2 und das so lange, bis deine gewünschte Genauigkeit erreicht ist.
Ich weiß nicht genau, ob dir das hilft, aber wenn ich noch mehr sage, dann ist die Aufgabe ja schon fast erledigt ;).

saddevil
2006-11-17, 13:14:55
hab jetzt eine idee dazu ...

IF schleife um die differenz abzufragen ...
innerhalb der IF schleife eine FOR schleife die die iterationen berechnet und dabei zählt
endbedingung ist eben die IF wenn die differenz erreicht ist bzw die genauigkeit von den gegebenen 10^-8

dann ausgabe von dem berechneten wert und ausgabe der gezählten iterationen


ist das eine halbwegs korrekte idee ?



ich könnte das ganze testat auch von einem anderen bekommen ..
nur nützt das herzlich wenig wenn man das verstehen will

Gnafoo
2006-11-17, 14:23:07
Es gibt keine IF-Schleife ;). Wenn du eine gegebene Genauigkeit brauchst, kannst du das in deiner for-Schleife nach jedem Durchlauf prüfen und gegebenenfalls mit "break" abbrechen. Fragt sich bloß, wie du die Differenz berechnen willst? Die Wurzel mit den C-Funktionen berechnen, oder wie? Dann ist das ja irgendwie reichlich sinnfrei :D.

Mein Tipp: wenn du eine bestimmte Genauigkeit garantieren willst, dann berechne nach jedem Schleifendurchlauf die A-posteriori-Fehlerabschätzung. *ImNumerikScriptNachseh* Wenn xn der neue in dem aktuellen Durchlauf berechnete Wert und xl der vorherige Wert ist, dann ist der Fehler kleiner gleich dem Betrag ihrer Differenz. Bzw. kleiner gleich L/(1-L)*|xn-xl| mit L=1/2 (Das Heron-Verfahren ist kontrahierend mit der Kontraktionszahl 1/2).

Der Fehler nimmt übrigens quadratisch, also ziemlich schnell ab.

saddevil
2006-11-18, 13:36:43
ich dachte mir so die for-schleife fürt die brechnung aus ...

in dem sinne das X2 berechnet wird aus dem ausganswert ( bzw dem x1 ( vorherige berchnung) was dann ja am ende eine schleife ergibt


also ausgabe am ende ist dann x2 also ergebniss , und z als anzahl der durchläufe


die IF bedingung prüft nur ob die differenz x2 - x1 = der genauigkeit enspricht

eine andere IF bedingung prüft ob das ganze nun eine positive zahl ist ...

if (<a=negative zahl>) printf("wurzel aus nagative zahl nicht möglich")
else
{
if (x2-x1=diff ) .....
else
{
for............
}
}


so ungefähr fängt das dann an ....

ok if ist eine bedingung .. stecke da ja noch nicht so im detail ....

wir sollen auch nur anweisungen nuzen die wir auch schon kennen
kein typisches "programmieren"

Gast
2006-11-18, 16:18:56
die IF bedingung prüft nur ob die differenz x2 - x1 = der genauigkeit enspricht
Das solltest du aber nach jedem Schleifendurchlauf machen. Außerdem wird es dir bei der Fehlerüberprüfung wenig bringen, auf Gleichheit zu prüfen. Du solltest schauen, ob der Fehler kleiner gleich deinem Grenzwert ist (Gleichheit ist bei Gleitkommazahlen sowieso ein schwieriges Thema).

Ich würde es so machen. Pseudo-Code:
wurzel(x, fehler)
{
if (x<0) fehlerUndAbbruch();

count = 0;
do
{
// heron-berechnung: xalt=...; x=...;
count++;
}
while(x-xalt >= fehler);

// ausgabe / rückgabe
}

saddevil
2006-11-18, 16:37:18
hi

mal bitte nicht so eng sehen ....
ich will mir erstmal einen überblick verschaffen ...
dazu muss ich das ding vestehen
ist eben etwas schwer wenn man noch nie was damit zu tun hatte


do while ist auch gut ... bermerk ich gerade ....
da dort die bedingung in jedem lauf abgefragt wird
.. stimmt :-D

saddevil
2006-11-20, 21:36:14
hi
ich bekomm die formel net zusammen :-(

kann mir jemand das ding etwas erklären ... ??


ich glaub der nachfolger bildet sich :

x2= 1/n((n-1)*x1+(a/x1) ...

x2 nachfolger ( folgende iteration )
x1 vorgänger ( erste iteration mit n= eingegebener wert für n ???)
a die zu wurzelnde zahl

Gast
2006-11-20, 22:30:44
x2 = (x1+a/x1)/2. Steht doch genau so bei Wikipedia drin. Im Zweifelsfall mal mit dem Taschenrechner durchprobieren.

saddevil
2006-11-20, 22:38:57
jo bin gerade am testen

der lässt die schleife raus ..irgendwie ...
muss nochmal durchsehen

so langsam wirds aber

Trap
2006-11-21, 13:33:35
double heron(double guess,double number)
{
if(abs(guess*guess-number)<SOMETHING) return guess;
else return heron((guess+number/guess)/2,number);
}
Achtung: Ungetestet

saddevil
2006-11-21, 16:00:42
hi

hmm wir sollen schon die formel dafür nutzen
ist unser erster beleg ....

also für leute die noch nie mit sowas hantiert haben

Trap
2006-11-21, 18:02:35
Das ist die Formel. Nur so hingeschrieben, dass es als Abgabe deutlich auffallen würde ;)

saddevil
2006-11-21, 18:07:17
hmmpf

ich muss es zudem verstehen wie das funzt ...
der fragt das ab :-(

naja
ich hab denke etwas fähiges gebastelt .. mal schauen ...

werd es mal reinstellen und könnt ihr mir sagen wenns net läuft wo der fehler ist ????

Gast
2006-11-22, 22:57:13
Ach komm. In dem Thread findest du eine rekursive Musterlösung und ein einmal den Pseudocode, der bis auf eine Zeile und ein paar Details auch schon de Lösung ist. So schwer kann es doch jetzt auch nicht mehr sein, oder? Aber von mir aus kannst du gerne reinstellen, was du hast.

saddevil
2006-11-23, 01:37:04
hmpf
es kann nicht jeder den programmierkram ...