Error de interpolación de Lagrange depende del número de nodos.
Mi tarea es calcular una estimación del error en función del número de nodos (n). Como estimación de la norma del error tengo que calcular el máximo módulo de la diferencia en el conjunto de puntos t=j/M (j=1…M), donde M es un número relativamente grande. Escribí un programa, pero no estoy seguro de por qué esta estimación es correcta. ¿O tal vez no lo es?
(En el programa f(x)=sin(x), pero podría ser cualquier otra función)
“`c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
double func(double x) {
return sin(x);
}
double lagr(double *x, double *f, double t, int n);
int main(void) {
int n, k, M=100000;
double *x, *f, t, maxr=0, L, a=0, b=1;
<pre><code> printf("n=");
scanf("%d", &n);
x = (double*)malloc(n*sizeof(double));
f = (double*)malloc(n*sizeof(double));
x[0] = a;
x[n-1] = b;
for(k=1;k<n-1;k++) {="" x[k]="a" +="" ((b-a)*k)/n;="" f[k]="func(x[k]);" }="" for(k="0" ;=""></n-1;k++)><m ;="" k++)="" {="" t="(double)" k/m;="" l="lagr(x,f,t,n);" if(fabs(l-func(t))=""> maxr)
maxr = fabs(L-func(t));
}
printf("Estimación del error= %le", maxr);
return 0;
</code></pre>
}
double lagr(double *x, double *f, double t, int n) {
int k, j;
double sum = 0, p;
for(k=0;k<n;k++) {="" p="1;" for(j="0;"></n;k++)><n; j++) {
if(j!=k) {
p <em>= (t-x[j]) / (x[k]-x[j]);
}<br />
}
sum += p</em>f[k];
}
<pre><code> return sum;
</code></pre>
}
“` j++)=”” {=”” if(j!=”k)” {=”” p=”” =”(t-x[j])” (x[k]-x[j]);=”” }=”” }=”” sum=”” +=”pf[k];” }=”” return=”” sum;=”” }=””></n; j++) {
if(j!=k) {
p = (t-x[j]) / (x[k]-x[j]);
}
}
sum += pf[k];
}
return sum;
}
“`></math.h></stdlib.h></stdio.h>
davy.ai
La estimación del error en la dependencia del número de nodos (n) es un problema común en los métodos numéricos. En este programa, el objetivo es estimar el módulo máximo de la diferencia entre la aproximación del polinomio de Lagrange y la función original en un conjunto de puntos t = j/M (j = 1…M), donde M es un número grande.
El programa utiliza el método del polinomio de Lagrange para aproximar la función. La función se define en el programa como
double func(double x)
, que puede ser reemplazada por cualquier otra función. El programa luego utiliza la funciónlagr
para calcular la aproximación del polinomio de Lagrange en un punto dadot
. La funciónlagr
utiliza los nodosx
y los valores de la funciónf
dados para calcular la aproximación del polinomio.Posteriormente, el programa recorre un conjunto de puntos
t
, calcula la aproximación del polinomio de LagrangeL
en cada punto y encuentra el módulo máximo de la diferencia entre la aproximación y la función originalfunc(t)
. Este valor se imprime como la estimación del error.La idea detrás de esta estimación del error es que, a medida que aumenta el número de nodos, mejora la precisión de la aproximación del polinomio de Lagrange y el error entre la aproximación y la función original disminuye. Al encontrar el error máximo en un conjunto de puntos, el programa puede estimar el error de la aproximación para un número dado de nodos
n
. Sin embargo, es importante tener en cuenta que esto es solo una estimación y puede no ser exacta.