Witam,
Napisałem taki o to programik:
#include <cstdio>
#include <cstdlib>
inline double DifProduct(double x,double x0[],int n)
{
double result;
result=1.0;
for(int i=0;i<n;++i)
result*=(x-x0[i]);
return result;
}
double silnia( double n){
if(n==0){
return 1;
}else{
return n*silnia(n-1);
}
}
double potega(double a, double b) {
double wynik = 1;
for (int i = b; i > 0; i--) {
wynik *= a;
}
return wynik;
}
double LagrangeInterp(double x,double x0[],double y0[],int n)
{
double result,a;
a = DifProduct(x,x0,n);
n--; // uwaga! zmiejszenie n
result = 0.0;
for(int i=0;i<=n;++i)
{
if(x==x0[i])
return y0[i];
result += a*y0[i]/((x-x0[i])*DifProduct(x0[i],x0,i)*DifProduct(x0[i],x0+i+1,n-i));
}
return result;
}
double NewtonInterp(double x, double x0[], double y0[],int n)
{
int degree = n;
double iloczyn;
double wynik = 0;
double h = x0[1] - x0[0];
double ile;
wynik = y0[0];
for(int ile=1;ile<degree;ile++) {
for(int j=0;j<(degree-ile);j++) {
y0[j] = y0[j+1] - y0[j];
}
iloczyn = 1;
for(int j=0;j<ile;j++) {
iloczyn = iloczyn * (x - x0[j]);
}
wynik += (y0[0]*iloczyn)/silnia(ile)*potega(h, ile);
}
return wynik;
}
int main (void)
{
int n,i,h;
double x;
printf ("Podaj ilosc elementow: ");
scanf ("%d", &n);
double x0[n], y0[n];
for (i = 0; i < n; i++)
{
printf ("Podaj x[%d]: ", i);
scanf ("%f", &x0[i]);
printf ("Podaj y[%d]: ", i);
scanf ("%f", &y0[i]);
}
printf ("Podaj wartosc x : ");
scanf ("%f", &x);
for(int i=0;i<n-1;i++) {
if (i==0) {
h = x0[i+1] - x0[i];
}
else {
if (h!=(x0[i+1] - x0[i])) {
printf("Roznica miedzy poszczegolnymi X-ami nie jest stala - wybieram metode interpolacji Lagrange`a");
return LagrangeInterp(x,x0,y0,n);
}
else {printf("Roznica miedzy poszczegolnymi X-ami jest sta³a - wybieram metode interpolacji Newtona");NewtonInterp(x,x0,y0,n);}
}
}
system("pause");
}
Niestety wynik jego działania przedstawia się następująco:
Wielokrotnie przeczesywałem kod w próbie znalezienia błędu i nic. Niestety sam sobie z tym nie poradzę więc proszę o pomoc lub chociaż naprowadzenie na właściwy trop...