Angewandte Mathematik

Newton-Horner Algorithmus

 

ein kleines Programm zur Simulation.
#include <stdio.h>
#include <math.h>

typedef double feld[11];
typedef double feldfeld[11][11];
void daten(void);
void divdif(void);
double newhor(double);
feld x,y;
feldfeld dd;
int n;

void daten(void)
{
/* Verzicht auf Einleseroutine und direkter Zugriff auf Aufgabendaten des Skripts */
n=2;
x[0]=-1.0;
x[1]=0.0;
x[2]=2.0;
y[0]=0.0;
y[1]=-1.0;
y[2]=3.0;
}

void divdif(void)
{
int k,l;
/* Initialisierung */
for(k=0;k<=n;k++) dd[0][k]=y[k];
/* Eigentliche Rechnung */
for(l=1;l<=n;l++)
{
for(k=0;k<=n-l;k++) dd[l][k]=(dd[l-1][k+1]-dd[l-1][k])/(x[k+l]-x[k]);
}
/* Ausgabe */
printf("Das Dividierte-Differenzen-Schema lautet:\n");
printf("\n");
for(k=0;k<=n;k++)
{
for(l=0;l<=n-k;l++) printf("% .12E",dd[l][k]);
printf("\n");
}
}

double newhor(double x0)
{
int k;
feld b;
b[n]=dd[n][0];
for(k=1;k<=n;k++) b[n-k]=b[n-k+1]*(x0-x[n-k])+dd[n-k][0];
return(b[0]);
}

/* Hauptprogramm */
int main(void)
{
int k;
double x0=-2.0,px0;
daten();
divdif();
px0=newhor(x0);
printf("\n");
printf("Auszuwerten ist ein Polynom p in Newton-Form vom Grad %i.\n",n);
printf("\n");
for(k=0;k<=n;k++)
printf("Der %i-te Newton-Koeffizient des Polynoms p lautet % .12E.\n",k,dd[k][0]);
printf("\n");
printf("Der Auswertungspunkt ist gegeben aus x0 = % .12E.\n",x0);
printf("\n");
printf("Der Newton-Horner-Algorithmus liefert p(x0) = % .12E.\n",px0);
return(0);
}