2016-08-09 18 views
-4

我一直在工作了幾個小時,試圖弄清楚我做錯了什麼。我所需要做的就是使用牛頓法從數組中表示一個多項式的根。這兩個函數(polyval和polyder)似乎給了我正確的答案,我覺得主要代碼正確地執行了牛頓的方法。我希望有人經歷可以給我一些建議。我是一個初學者,試圖編寫一個函數來查找數組函數的根

#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); 
    } 
} 
+0

如果一切都給你正確的答案,你有什麼問題? – Rakete1111

+0

那麼polyder和polyva函數給了我數值上正確的答案。但問題出在主函數的某處,因爲x和f的值在我輸入多項式時保持指數增長。 – Christian

+1

除了使用C++之外,這個C代碼中的C++包含在哪裏? –

回答

1

您對polyval(dp,n,x)通話將訪問超出分配的空間爲dp,其中有n條目,而不是requred n+1

+0

非常感謝你!我已經工作了大約3個小時,試圖找出它,現在我終於可以睡一覺:) – Christian

+0

使用'std :: vector'和'std :: vector :: at()'而不是c-數組和原始指針算術會讓你的睡眠早得多。 –

相關問題