Registrierung Kalender Mitgliederliste Teammitglieder Suche Häufig gestellte Fragen Zur Startseite

Informatiker Board » Themengebiete » Informatik in der Schule » fehler in c++ programm für newton » Hallo Gast [Anmelden|Registrieren]
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen
Neues Thema erstellen Antwort erstellen
Zum Ende der Seite springen fehler in c++ programm für newton
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
errorfunction
unregistriert
fehler in c++ programm für newton Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Folgendes Programm zur iterativen Nullstellenberechnung einer bestimmten Funktion liefert mit den Fehler

"error C2064: Ausdruck ergibt keine Funktion, die 1 Argumente übernimmt"

Der Fehler geht wohl von folgender Zeile aus: "wertneu = wert - (11.0 * (zwei) + 6.0 * (vier)) / (1.0 - 22.0 * (wert) + 24.0 (drei));

Könnt Ihr mir sagen, wo ich es verhauen habe?

Lg,

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
#include <iostream>
#include <math.h>

using namespace std;

int main(){

	long double  wert=0.0 , wertneu = 0.0;
	long double vier = pow (wert, 4);
	long double drei = pow (wert, 3);
	long double zwei = pow (wert, 2);

	cout << "Das Programm berechnet die Nullstellen der Funktion. x-> x - 11x^2 +6x^4 mit dem Newotn-Verfahren. \n Startwert eingeben: " << endl;
	cin >> wert ; //Startwert abfragen
	getchar();


	
	while ( (wertneu - wert) > 0.0001 || (wertneu - wert) < -0.0001){ // solange der Wert wahr ist, soll weitergerechnet werden
		
		wertneu =  wert - (11.0 * (zwei) + 6.0 * (vier)) / (1 - 22.0 * (wert) + 24.0 (drei)); // die eigentliche Funktion
		cout << wertneu << endl;
	}


	cout << "Die Arbeit ist getan.";
	getchar();
	return 0;
}

09.01.2012 15:24
Karlito Karlito ist männlich
Kaiser


Dabei seit: 11.04.2011
Beiträge: 1.461

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Hallo,

der Fehler beim kompilieren lag am fehlenden "*" vor "(drei)". Es fehlte also die Multiplikation.

Im Quelltext sind aber weitere Fehler... Ich habe dir mal ein paar kommentare angefügt.

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
#include <iostream>
#include <math.h>
#include <stdio.h>

using namespace std;

int main(){

	long double  wert=0.0 , wertneu = 0.0;
	long double vier = pow (wert, 4); //wert wird hier mit 0 initialisiert und bleibt den rest des Programms auf 0
	long double drei = pow (wert, 3);
	long double zwei = pow (wert, 2);

	cout << "Das Programm berechnet die Nullstellen der Funktion. x-> x - 11x^2 +6x^4 mit dem Newotn-Verfahren. \n Startwert eingeben: " << endl;
	cin >> wert ; //Startwert abfragen
	getchar();


	//schleife läuft, wenn wertneu dann richtig berechnet wird wahrscheinlich unendlich
	//da wertneu sich immer weiter von wert entfernt. wert wird ja nicht angepasst...
	while ( (wertneu - wert) > 0.0001 || (wertneu - wert) < -0.0001){ // solange der Wert wahr ist, soll weitergerechnet werden
	
		//hier fehlte das Zeichen * vor "(drei)"
		//wertneu = wert - 0, wegen der deklaration oben
		wertneu =  wert - (11.0 * (zwei) + 6.0 * (vier)) / (1 - 22.0 * (wert) + 24.0 * (drei)); // die eigentliche Funktion
		cout << wertneu << endl;
	}


	cout << "Die Arbeit ist getan.";
	getchar();
	return 0;
}



Gruß,

Karlito
09.01.2012 20:29 Karlito ist offline E-Mail an Karlito senden Beiträge von Karlito suchen Nehmen Sie Karlito in Ihre Freundesliste auf
errorfunction
unregistriert
Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Hallo,

vielen Dank für dein Antwort. Ich habe probiert, die Variable wert zu aktualisieren. Leider rasen die Werte der Ausgabe jetzt immer weiter nach oben....

Ich habe jetzt mal das mathematische überprüft:

Die Newton Formel lautet:
[latex]<br />
x_ {n+1} = x_n + \frac{f(x_n)}{f'(x_n)}[/latex]

Meine Funktion ist [latex] f(x)=x-11x^2+6x^4[/latex] mit der reellen Nullstelle 0, die erste Ableitung lautet [latex]f'(x)=1-22x+24x^3[/latex].

Das müsste also stimmen.

Auch im Programm sehe ich keinen logischen Fehler.

Zuerst wird der Startwert "wertneu" eingelesen. Anschließend gehts in die Schleife. Dort wird "wert" auf "wertneu" gesetzt. Dies hat den Zweck, dass vor dem nächsten Schleifendurchlauf die Abbruchbedingung richtig überprüft werden kann.

Anschließend wird "wertneu" nach der Newton-Formel berechnet und die Schleife beginnt von vorne.

Vllt sieht ja jemand von Euch den Fehler.


Hier die aktuelle Version des Programms:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
#include <iostream>
#include <math.h>
#include <stdio.h>

using namespace std;

int main(){

	long double  wert=0.0 , wertneu = 0.0;
	long double vier = pow (wert, 4); //wert wird hier mit 0 initialisiert und bleibt den rest des Programms auf 0
	long double drei = pow (wert, 3);
	long double zwei = pow (wert, 2);

	cout << "Das Programm berechnet die Nullstellen der Funktion. x-> x - 11x^2 +6x^4 mit dem Newotn-Verfahren. \n Startwert eingeben: " << endl;
	cin >> wertneu ; //Startwert abfragen
	getchar();


	while ( (wertneu - wert) > 0.0001 || (wertneu - wert) < -0.0001){ // solange der Wert wahr ist, soll weitergerechnet werden
		
		wert = wertneu; // wert wird aktualisiert, damit beim nächsten Durchlaufen der Schleife die Abbruchbedingung richtig überprüft wird.
		
		wertneu =  wert - (wert - 11.0 * (zwei) + 6.0 * (vier)) / (1 - 22.0 * (wert) + 24.0 * (drei)); // die eigentliche Funktion

		cout << wertneu << endl;
	}


	cout << "Die Arbeit ist getan.";
	getchar();
	return 0;
}



schöne grüße
15.01.2012 11:42
Karlito Karlito ist männlich
Kaiser


Dabei seit: 11.04.2011
Beiträge: 1.461

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Hallo,

deine zuweisung wertneu funktioniert nicht, da vier=zwei=drei=0!
Somit ist wertneu = wert - (wert - 0 + ... / 1 + 0 +...)

Eine Variable ist keine Funktion!! Deshalb wird vier, zwei, drei nicht immer neu berechnet sondern bleibt von Anfang an 0!

VG,

Karlito
15.01.2012 14:15 Karlito ist offline E-Mail an Karlito senden Beiträge von Karlito suchen Nehmen Sie Karlito in Ihre Freundesliste auf
Baumstruktur | Brettstruktur
Gehe zu:
Neues Thema erstellen Antwort erstellen
Informatiker Board » Themengebiete » Informatik in der Schule » fehler in c++ programm für newton