Berechnung der n-ten Wurzel mit Iterationsverfahren
-
Hallo, die Überschrift sagt ja schon worum es geht, ich hab leider überhaupt keine Ahnung und würde mich um Hilfe jeder Art freuen...
Aufgabe:
Schreiben Sie ein C-Programm zur Berechnung der n-ten Wurzel einer vorgegebenen Zahl a unter der Verwendung des Iterationsverfahrens
xi+1 = 1/n ((n-1)xi + a/xin-1)
für
i = 1,2,...Iterationsschritt
Dabei sei n ganzzahlig. Als Startwert xi soll der Wert 1 verwendet werden.
Das Iterationsverfahren soll abgebrochen werden, wenn die absolute Differenz zweier Iterationswerte xi+1 und xi kleiner als 10-8 ist.
Das Programm soll die Werte von a und n einlesen und die dazugehörige Wurzel wieder ausgeben.
Hinweis:
Die Berechnung von xin-1 soll durch (n-1)-maliges Multiplizieren von xi durchgeführt werden.
Das hier ist mein aktueller Stand ab dem ich leider überhaupt nicht weiter weiß, da ich totaler Anfänger bin, trotz dessen muss ich das Programm bereits am Montag abgeben...
#include <stdio.h> #include <math.h> #include <conio.h> main () { int n, a, potenz, i, zaehl=0; float x1=1, x2=0, absdiff=0, genau=0,00000008; printf("Wert für n: "); scanf("%i", &n); printf("Wert für a: "); scanf("%i", &n); while (absdiff>genau) { x2=1/n((n-1)*x1+(a/(x1 hoch n-1?)); absdiff=x1-x2; } printf("x1= %f", x1); printf("zaehl= %f", zaehl); }
-
Also erstmal:
10^-8 ist 0.00000001 und nicht 0.00000008
Wo liegen deine Probleme?
Gruß,
Andreas
-
2. Außerdem Dezimalpunkt statt Dezimalkomma.
3. Du liest a nicht richtig ein, da steht n.
Was soll "hoch" berechnen?
Mal zu compilieren versucht?
-
Meine Probleme ist alles was jetzt noch fehlt.... mit dem hoch -8 is klar, jab ich wohl gepennt, wie lese ich denn a richtig ein?
hoch hab ich nur so hingeschrieben, weiß nichwie das geht, siehe aufgaben stellung. beim compilieren natürlich nur fehlermeldungen, aber mit denen kann ich nix anfangen...
-
Du liest a auf &n ein. Typischer copy & paste Fehler
pow heißt die "hoch" Funktion in C . Steht in math.h
Die Klammern stimmen auch nicht, du machst mehr auf als zu.
Und die Compiler Fehler musst du dann schon mal posten.
Da steht doch dann in welchen Zeilen noch Syntax-Fehler sind.
-
Die hoch-Funktion muss ich laut aufgabenstellung mit ner schleife machen, dazu ist die zaehl variable da.... weiß aber nicht wie die schleife geht...
-
Hi @Follfosten,
ich hab mal sowas ähnliches gemacht. Habe die 3.Wurzel aus einer Zahl a mit annährung gerechnet. Ich schicke dir den code mal:
/* Zusammenfassung: Die 3.Wurzel aus einer Zahl a mit einen nährungsverfahren berechnen. Die Iteration abbrechen wenn |Xneu - Xalt| >= eps ist. Xneu = ist der errechnete Wert Xalt = der Wert in der Formel eps = für die Genauigkeit Formel: Xneu = ( 1/3 (2Xalt + (a/X²alt)) ) */ #include <stdio.h> #include <math.h> int main(void) { double a = 0; double eps = 0.00001; double xneu = 1; double xalt = 1; double erg[50]; int i = 0; int j = 0; fflush(stdin); printf("Geben Sie eine Zahl ein: "); scanf("%lf", &a); //Zahl einlesen fflush(stdin); printf("\nGenauigkeit, z.B. 0.00001: "); //Wenn [ENTER] gedrückt wird, dann soll der Vordefinierte //Wert genommen werden. Wenn was eingegeben wird, dann bitte //den eingegebenen Wert zur Berechnung nehmen if(getchar() == '\n') eps = eps; else scanf("%lf", &eps); do { //Xalt auf Xneu setzen xalt = xneu; //Xneu berechnen xneu=( (1.0/3.0) * ( (2*xalt) + (a/(pow(xalt,2)) ) ) ); //Xneu in Array speichern erg[i] = xneu; i++; } //Solange ausführen, bis absolutbetrag >= eps ist while( fabs(xneu - xalt) >= eps ); i--; printf("\n\n"); //das Erg ausgeben printf("Die 3. Wurzel aus N\x84herung: %lf \n", erg[i]); //Erg mit der Pow() Funktion ausgeben printf(" Berechnung mit der pow()-Funktion: %f \n", pow(a,(1.0/3.0)) ); //Anzahl der Iterationsschritte ausgeben printf(" Es wurden %d Iterationen ben\x94tigt\n", i+1); //Iterationsschritte ausgeben (verlauf) printf(" Verlauf der Iteration:\n\n"); for(j=0; j<=i; j++) printf("Iterationsschritt %d: %lf\n",j+1 ,erg[j]); printf("\n\n"); return 0; }
Habe hier aber auch pow() benutzt. Du kannst es ja für die n-Wurzel für dich anpassen.
Hoffe es hilft dir ein bisschenGruß
Manda
-
So hier der aktuelle Programmcode + Fehlermeldungen, hoffe mich bringt hier bald jemand ans Ziel, die Zeit läuft mir davon...
#include <stdio.h> #include <math.h> #include <conio.h> main () { int n, a, potenz, i, zaehl=0; float x1=1, x2=0, absdiff=0, genau=0.00000001; printf("Wert für n: "); scanf("%i", &n); printf("Wert für a: "); scanf("%i", &a); while (absdiff>genau) { x2=1/n((n-1)*x1+(a/(x1 hoch n-1?))); absdiff=x1-x2; } printf("x1= %f", x1); printf("zaehl= %f", zaehl); }
1>------ Erstellen gestartet: Projekt: p4_a1, Konfiguration: Debug Win32 ------ 1>Kompilieren... 1>p4_a1.c 1>e:\dokumente und einstellungen\willi\desktop\c testat\p4_a1.c(7) : warning C4305: 'Initialisierung': Verkürzung von 'double' in 'float' 1>e:\dokumente und einstellungen\willi\desktop\c testat\p4_a1.c(10) : warning C4996: 'scanf' wurde als veraltet deklariert 1> f:\programme\microsoft visual studio 8\vc\include\stdio.h(295): Siehe Deklaration von 'scanf' 1> Meldung: "This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details." 1>e:\dokumente und einstellungen\willi\desktop\c testat\p4_a1.c(12) : warning C4996: 'scanf' wurde als veraltet deklariert 1> f:\programme\microsoft visual studio 8\vc\include\stdio.h(295): Siehe Deklaration von 'scanf' 1> Meldung: "This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details." 1>e:\dokumente und einstellungen\willi\desktop\c testat\p4_a1.c(16) : error C2063: 'n': Keine Funktion 1>e:\dokumente und einstellungen\willi\desktop\c testat\p4_a1.c(16) : error C2146: Syntaxfehler: Fehlendes ')' vor Bezeichner 'hoch' 1>Das Buildprotokoll wurde unter "file://e:\Dokumente und Einstellungen\Willi\Desktop\C Testat\p4_a1\p4_a1\Debug\BuildLog.htm" gespeichert. 1>p4_a1 - 2 Fehler, 3 Warnung(en) ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========
-
#include <stdio.h> #include <math.h> #include <conio.h> main () { int n, a, potenz, i, zaehl=0; float x1=1, x2=0, absdiff=0, genau=0.00000001; printf("Wert für n: "); scanf("%i", &n); printf("Wert für a: "); scanf("%i", &a); while (absdiff>genau) { x2=1/n((n-1)*x1+(a/(x1 hoch n-1?))); /* <--- hoch == pow ( (double)x1, (double)n-1 ) */ absdiff=x1-x2; } printf("x1= %f", x1); printf("zaehl= %f", zaehl); }
-
Du hast doch noch bis Montag Zeit.
Zeige mal etwas Initiative.
Wo hast du pow benutzt?
Der Klammerfehler ist auch noch drin.
While ist deine Schleife.
Du erhöhst deinen Zähler nicht.
Die Variable i benutzt du gar nicht, ist also überflüssig.
-
Darfst du jetzt die pow() Funktion benutzen oder musst du diese selber schreiben?
Falls du sie benutzen darfst, dann siehe meinen Code!
Du müsstest da ja nur deine Formel für die n-te Wurzel benutzen.Gruß
Manda
-
MandaJohn schrieb:
Darfst du jetzt die pow() Funktion benutzen oder musst du diese selber schreiben?
steht doch im ersten posting. er soll diesen algo programmieren: http://en.wikipedia.org/wiki/Nth_root_algorithm
also, nix mit 'pow'
-
Schau mal hier:
http://www.matheboard.de/archive/16457/thread.html
Ist zwar C++, aber in C wirds wohl nicht ganz so anders sein.Für deine "hoch" funktion:
double hoch(double a, double b) { double i = 0; double result = 1; // a^0 == 1 for (i = 0; i < b; ++i) result = result * a; return result; }
Ist aber in dem oberen link mit enthalten. Dein Problem sollte jetzt geklärt sein, oder?
Gruß
Manda
-
MandaJohn schrieb:
Für deine "hoch" funktion:
double hoch(double a, double b) { double i = 0; double result = 1; // a^0 == 1 for (i = 0; i < b; ++i) result = result * a; return result; }
inner schleife immer draufmultiplizieren ist ja doof, mach's doch so:
// nur ganzzahlige exponenten double my_pow (double x, unsigned int n) { double z; if (!n) return 1; if (n & 1) return x * my_pow(x, n-1); z = my_pow (x, n/2); return z*z; }
frei nach: http://en.wikipedia.org/wiki/Exponentiation_by_squaring#Squaring_algorithm
^^ sind übrigens weniger rekursionen als du schleifendurchläufe hast *fg*
-
also ich hab den code eingebunden aber da funktioniert immer noch nix, echt kein plan wie das gehen soll, würd mich echt um weitere (konkrete) hilfe freuen....hier der aktuelle code:
#include <stdio.h> #include <math.h> #include <conio.h> main () { int n, a, potenz, i, zaehl=0; float x1=1, x2=0, absdiff=0, genau=0.00000001; double my_pow (double x, unsigned int n) printf("Wert für n: "); scanf("%i", &n); printf("Wert für a: "); scanf("%i", &a); while (absdiff>genau) { x2=1/n((n-1)*x1+(a/(x1 { double z; if (!n) return 1; if (n & 1) return x * my_pow(x, n-1); z = my_pow (x, n/2); return z*z; } ))); absdiff=x1-x2; } printf("x1= %f", x1); printf("zaehl= %f", zaehl); }
-
Also sorry, dass ich hier weiternerven muss aber ich hab immer noch keine ahnung wie ich das programm schreiben muss, kann mir nicht BITTE jemand konkret helfen???
-
Du musst schon schreiben was nicht funktioniert.
Kannst du das Prog. compilieren?
Wenn nein: Poste die Fehlermeldungen.
Wenn ja: Was wird berechnet. Evtl Testausgaben machen.
-
Follfosten schrieb:
also ich hab den code eingebunden aber da funktioniert immer noch nix, echt kein plan wie das gehen soll, würd mich echt um weitere (konkrete) hilfe freuen....hier der aktuelle code:
#include <stdio.h> #include <math.h> #include <conio.h> main () { int n, a, potenz, i, zaehl=0; float x1=1, x2=0, absdiff=0, genau=0.00000001; double my_pow (double x, unsigned int n) printf("Wert für n: "); scanf("%i", &n); printf("Wert für a: "); scanf("%i", &a); while (absdiff>genau) { x2=1/n((n-1)*x1+(a/(x1 { double z; if (!n) return 1; if (n & 1) return x * my_pow(x, n-1); z = my_pow (x, n/2); return z*z; } ))); absdiff=x1-x2; } printf("x1= %f", x1); printf("zaehl= %f", zaehl); }
^^ das in der schleife sieht sehr seltsam aus. diese my_pow-funktion musste aufrufen und nicht da mit reinquetschen. das geht etwa so:
... // startwerte: x = 1, k = wurzelexponent, a = zahl aus der die k-te wurzel gezogen wird rechne: double x2 = ((k-1)*my_pow(x,k)+a)/k/my_pow(x,k-1); // eine näherung berechnen if (fabs(x2-x) < 1e-8) // ausreichend genau? { // fertig, ergebnis in x2 } else // nicht genau genug? { // nächste runde x = x2; goto rechne; } ...
-
Ich werd bekloppt, das sieht jetzt i-wie so aus aber mit den hinweisen kann ich so richtig auch nix anfangen
#include <stdio.h> #include <math.h> #include <conio.h> main () { int n, a, potenz, i, zaehl=0; float x1=1, x2=0, absdiff=0, genau=0.00000001; double my_pow (double x, unsigned int n) printf("Wert für n: "); scanf("%i", &n); printf("Wert für a: "); scanf("%i", &a); while (absdiff>genau) { double x2 = ((k-1)*my_pow(x,k)+a)/k/my_pow(x,k-1); if (fabs(x2-x) < 1e-8) { // fertig, ergebnis in x2 } else // nicht genau genug? { // nächste runde x = x2; goto rechne; } } printf("x1= %f", x1); printf("zaehl= %f", zaehl); }
1>------ Erstellen gestartet: Projekt: p4_a1, Konfiguration: Debug Win32 ------ 1>Kompilieren... 1>p4_a1.c 1>c:\dokumente und einstellungen\willi.super-acer\desktop\c-testat\p4_a1.c(7) : warning C4305: 'Initialisierung': Verkürzung von 'double' in 'float' 1>c:\dokumente und einstellungen\willi.super-acer\desktop\c-testat\p4_a1.c(10) : error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner 'printf' 1>c:\dokumente und einstellungen\willi.super-acer\desktop\c-testat\p4_a1.c(17) : error C2065: 'k': nichtdeklarierter Bezeichner 1>c:\dokumente und einstellungen\willi.super-acer\desktop\c-testat\p4_a1.c(17) : error C2065: 'x': nichtdeklarierter Bezeichner 1>c:\dokumente und einstellungen\willi.super-acer\desktop\c-testat\p4_a1.c(25) : warning C4244: '=': Konvertierung von 'double' in 'int', möglicher Datenverlust 1>Das Buildprotokoll wurde unter "file://c:\Dokumente und Einstellungen\Willi.SUPER-ACER\Desktop\C-Testat\p4_a1\p4_a1\Debug\BuildLog.htm" gespeichert. 1>p4_a1 - 3 Fehler, 2 Warnung(en) ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========
-
Follfosten schrieb:
aber mit den hinweisen kann ich so richtig auch nix anfangen
*schluck* du tappst ja völlig im dunklen. ich glaub, du solltest unbedingt mal ein c-tutorial durcharbeiten, sonst wird das nix. tut mir leid für diese direkte antwort, aber mir kommt's so vor, als wenn du von C noch keinen blassen schimmer hast.