Informatiker Board (http://www.informatikerboard.de/board/index.php)
- Themengebiete (http://www.informatikerboard.de/board/board.php?boardid=1)
-- Informatik in der Schule (http://www.informatikerboard.de/board/board.php?boardid=21)
--- fehler in c++ programm für newton (http://www.informatikerboard.de/board/thread.php?threadid=1124)


Geschrieben von errorfunction am 09.01.2012 um 15:24:

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




Geschrieben von Karlito am 09.01.2012 um 20:29:

 

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



Geschrieben von errorfunction am 15.01.2012 um 11:42:

 

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



Geschrieben von Karlito am 15.01.2012 um 14:15:

 

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


Forensoftware: Burning Board, entwickelt von WoltLab GmbH