2016-08-09 1 views
-4

Я работаю пару часов, пытаясь понять, что я делаю неправильно. Все, что мне нужно сделать, это найти один корень из полинома, представленного массивом, используя метод Ньютона. Кажется, что две функции (поливал и полидер) дают мне правильные ответы, и я чувствую, что основной код правильно выполняет метод Ньютона. Я надеялся, что кто-то испытает, может дать мне несколько советов.Я новичок, пытаясь написать функцию, которая находит корень функции массива

#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

Ну, полидерные и поливальные функции дают мне числовые правильные ответы. Но проблема лежит где-то в основной функции, так как значения для x и f продолжают экспоненциально возрастать, когда я вхожу в многочлен. – Christian

+1

Где находится C++ в этом C-коде наряду с использованием C++? –

ответ

1

Ваш призыв к polyval(dp,n,x) будет доступ за пределы выделенного пространства для dp, который имеет n записи, а не из милиции n+1.

+0

Спасибо вам большое! Я работаю около 3 часов, пытаясь понять это, теперь я могу наконец поспать :) – Christian

+0

Использование 'std :: vector' и' std :: vector :: at() 'вместо c-массивов и Арифметика raw-указателя дала бы вам сон намного раньше. –

Смежные вопросы