Ich habe ein paar Stunden gearbeitet, um herauszufinden, was ich falsch mache. Alles, was ich tun muss, ist eine Wurzel aus einem Polynom zu finden, das durch ein Array mit Newtons Methode repräsentiert wird. Die beiden Funktionen (Polyval und Polyder) scheinen mir die richtigen Antworten zu geben, und ich denke, dass der Hauptcode Newtons Methode korrekt ausführt. Ich hatte gehofft, jemand könnte mir einen Rat geben.Ich bin ein Anfänger, versuche eine Funktion zu schreiben, die die Wurzel einer Array-Funktion findet
#include <iostream>
#include <cmath>
using namespace std;
float polyval(float*, int, float);
void polyder(float*, int, float*);
int main(void) {
int n;
float x=-1,f;
float tol=pow(10,-5);
cout << "Enter polynomial order:" << endl;
cin >> n;
float* p=new float[n+1];
float* dp=new float[n];
cout << "Enter coefficients, starting with the highest power:" << endl;
for (int k=0;k<n+1;k++) {
cin >> p[k];
}
polyder(p,n,dp);
f=polyval(p,n,x);
while (fabs(f)>tol) {
x=x-f/polyval(dp,n,x);
f=polyval(p,n,x);
cout << x << endl;
cout << f << endl;
}
cout << "A real root is at x= " << x << endl;
cout << "To verify: p(" << x << ") = " << polyval(p,n,x) << endl;
return 0;
}
float polyval(float* p, int n, float x) {
float px;
px=0;
for (int k=0;k<n+1;k++) {
px=px+p[k]*pow(x,n-k);
}
return px;
}
void polyder(float* p, int n, float* dp) {
for(int k=0;k<n;k++) {
dp[k] = p[k+1] * (k+1);
}
}
Wenn alles Ihnen die richtige Antwort gibt, mit was haben Sie Probleme? – Rakete1111
Nun, die Polyder- und Polyva-Funktionen geben mir numerisch korrekte Antworten. Aber das Problem liegt irgendwo in der Hauptfunktion, da die Werte für x und f immer exponentiell ansteigen, wenn ich ein Polynom betrete. – Christian
Wo ist das C++ in diesem C-Code neben der Verwendung von C++ enthalten? –