Wpis z mikrobloga

Hej mirki. Mam problem w kodzie liczącym interpolację metodą Newtona. Na wyjściu wychodzą mi jakieś ogromne wartości. Dla wyjaśnienia:
n-ilość węzłów,
x-węzły równoodległe,
f-wartości funkcji dla węzłów (w tym wypadku abs(sin(x)) ),
xp – punkty które chce policzyć (jest ich 150),
np – ilość powyższych punktów,
L – wartości obliczone dla xp.
// Funkcja obliczająca wartość parametru 'a' we wzorze newtona
float iloraz_roznicowy(int n, float *x, float *f)
{
if ((n >= 0) && (x != NULL) && (f != NULL)) {
float suma = 0, iloczyn = 1;
suma = f[0]; //iloraz 0 rzedzu oparty na punkcie xi ma wartosc funkci w tym punkcie

for (int i = 1; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if (j != i)
iloczyn *= (x[i] - x[j]);
}
suma += (f[i] / iloczyn);
iloczyn = 1;
}
return suma;
}
}
// Obliczanie wartości omegi
float omega(int i, float *x, float xp)
{
if ((i > 0) && (x != NULL)) {
float iloczyn = 1;
for (int j = 0; j < i - 1; j++)
{
iloczyn *= xp - x[j];
}
return iloczyn;
}
else if (i == 0) {
return 1; // wynika to z definicji wielomianu czynnikowego
}
}
// Funkcja obliczająca wartości ze wzoru Newtona
float *wypelnij_L(int n, int np, float *x, float *xp, float *f)
{
if ((n > 0) && (np > 0) && (x != NULL) && (xp != NULL) ){
float *L = new float[np];
float temp = 0;
float temp1, temp2;

for (int i = 0; i < np; i++) {
for (int j = 0; j < n; j++)
{
temp1 = iloraz_roznicowy(j, x, f);
temp2 = omega(j, x, xp[i]);
temp += (temp1 * temp2);
}
L[i] = temp;
temp = 0;
}
return L;
}
}

#programowanie
  • 2