fehler in c++ programm für newton

Neue Frage »

Auf diesen Beitrag antworten »
errorfunction fehler in c++ programm für newton

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;
}

 
Auf diesen Beitrag antworten »
Karlito

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
Auf diesen Beitrag antworten »
errorfunction

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
Auf diesen Beitrag antworten »
Karlito

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
 
 
Neue Frage »
Antworten »


Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »