Red de conocimiento informático - Conocimiento de Internet de las cosas - Cómo interpolar n números usando el método de interpolación de Newton usando Fortran

Cómo interpolar n números usando el método de interpolación de Newton usando Fortran

F95.

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

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

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"

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)

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

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