Cómo interpolar n números usando el método de interpolación de Newton usando Fortran
El libro de Peng tiene procedimientos ya preparados. Incluyendo el dibujo con sgl, la función se puede convertir a forma polinómica por sí misma. Puede consultar:
Módulo Interpolation_Utility
Usar sgl
Ninguno implícito p >
Punto de escritura
X real, y
Tipo final
Número real, parámetro::PI=3.14159
Número real, parámetros::xmin = 0.0, xmax = PI*3.0
Entero, parámetros::N = 10, NP = 100
Tipo (punto), guardar::datos (N )
Escriba (punto), guarde::interpolación (NP)
real, guarde::tabla(N, N), ancho
contiene
p>
! Secuencia generada
Datos generados por subrutina(func)
Número real, externo::func
Número real r
Entero I p >
Ancho = (xmax-xmin)/(N-1)
r = 0
hacer i=1, N
Datos ( i )%x = r
Datos(i)%y = función(r)
r = r+ancho
Fin do
Finalizar subrutina
! Crear tabla de diferencias
Subrutina BuildTable()
Fila entera, columna, I
! tabla real(N, N)
tabla = 0
hacer i=1, N
tabla(i, 1) = datos(i)%y
Fin do
do col=2, N
do fila=1, N-col+1
Tabla (fila, columna) = tabla (fila + 1, columna - 1) - tabla (fila, columna - 1)
Fin de do
Fin de do
Fin de subrutina
Función real Newton (x, th, num)
X real
Entero th, num
Número real, suma, coeficiente
Enteros f, I, j
si (th+num-1>n) entonces
Escribe (*, *) "Puntos de datos insuficientes" p>
Retorno
Terminará si...
Newton = tabla(th, 1)
s = (x-data(th )% x)/ancho
f = 1
Coeficiente = 1.0
do i=1, num-1
f = f*i
coeff = coeff*(s-i+1)
Newton = Newton + coeficiente * tabla (th, I+1)/número real (f) p >
Finalizar do
Finalizar función
! Función de dibujo
Visualización de subrutina()
real, parámetro :: tamaño = 0.1
Entero I
Llamar a sglClearBuffer()
p>¡Llame a sglColor3i(255, 255, 255)
! Conecte todos los puntos de interpolación con segmentos de línea.
hacer i=1, NP-1
Llamar a sglLineV( interpolar(i)%x, interpolar(i)%y, & amp
Interpolación( i+1)%x, interpolación (i+1)%y
Fin do
Llamar a sglColor3i(255, 0, 0)
¡Dibujar! posición de n puntos de datos
hacer i=1, N
Llamar a sglLineV( datas(i)%x-size, datas(I)% y-size & amp;< / p>
datos(I)% x+tamaño, datos(I)% y+tamaño)
Llamar a sglLineV( datas(i)%x+tamaño, datos(I)% tamaño y & amp;
Datos(i)%x tamaño, datos(I)%y+tamaño)
Fin de hacer
Llamar a sglUpdateBuffer()
Finalizar subrutina
Finalizar módulo
Programa principal
Usar herramienta de interpolación
Ninguno implícito
real, intrínseco::sin
Verdadero xinc, x
Entero I
¡Llame a GenerateData(sin)!
Llame a BuildTable()
x=0
xinc = (xmax-xmin)/(NP-1)
hacer i=1, NP p>
Interpolación (i)%x = x
Interpolación (i)%y = Newton (x, 1, N)! Interpola el valor de f(x)
x = x+ xinc
Fin do
Llamar a sglDisplaySub(display)
Llamar a sglSetVirtual(xmin, 2.0, xmax, -2.0)
Llamar a sglCreateWindow (100, 100, 400, 400, 1)
Llamar a sglMainLoop()
Detener
Finalizar el programa