El objetivo de este desafío es utilizar el método de Euler para aproximar la solución de una ecuación diferencial de la forma f (n) (x) = c. †
La entrada será una lista de números enteros en la que el n º valor representa el valor de f (n) (0). El primer entero es f (0), el segundo es f '(0), y así sucesivamente. El último entero en esta lista es la constante y siempre seguirá siendo el mismo.
También se proporcionará como entrada un número entero positivo (distinto de cero) x , que representa el valor objetivo (está intentando estimar f (x)). El tamaño del paso para el método de Euler siempre será 1. Por lo tanto, deberá realizar un total de x pasos.
Si no está familiarizado con el método de Euler, aquí hay un ejemplo detallado con una explicación para la entrada [4, -5, 3, -1]
, x = 8.
x f(x) f'(x) f''(x) f'''(x)
0 4 -5 3 -1
1 4-5 = -1 -5+3 = -2 3-1 = 2 -1
2 -1-2 = -3 -2+2 = 0 2-1 = 1 -1
3 -3+0 = -3 0+1 = 1 1-1 = 0 -1
4 -3+1 = -2 1+0 = 1 0-1 = -1 -1
5 -2+1 = -1 1-1 = 0 -1-1 = -2 -1
6 -1+0 = -1 0-2 = -2 -2-1 = -3 -1
7 -1-2 = -3 -2-3 = -5 -3-1 = -4 -1
8 -3-5 = -8
Esencialmente, cada celda en la tabla generada es la suma de la celda arriba de ella y la celda arriba y a la derecha. Entonces, f (a) = f (a-1) + f '(a-1); f '(a) = f' (a-1) + f '' (a-1); y f '' (a) = f '' (a-1) + f '' '(a-1). La respuesta final es f (8) ≈ -8. ††
La lista de entrada siempre contendrá 2 o más elementos, todos los cuales tendrán valores absolutos inferiores a 10. x ≥ 1 también está garantizado. La salida es un entero único, la aproximación de f (x). La entrada puede tomarse en cualquier orden (la lista antes de x o x antes de la lista). x también puede ser el primer o el último elemento de la lista, si lo desea.
Casos de prueba:
[4, -5, 3, -1], x = 8 => -8
[1, 2, 3, 4, 5, 6], x = 10 => 3198
[1, 3, 3, 7], x = 20 => 8611
[-3, 3, -3, 3, -3, 3, -3, 3, -3], x = 15 => -9009
[1, 1], x = 1 => 2
†: es notable que usar un método de aproximación en esta situación es, de hecho, estúpido. sin embargo, se eligió la función más simple posible para los propósitos de este desafío.
††: el valor real es -25⅓, lo que calificaría esta aproximación como "no muy buena".
fuente
Respuestas:
Haskell , 38 bytes
Pruébalo en línea!
Mejorado de 39 bytes:
Expresa recursivamente la salida
l%n
. Mover hacia arriba corresponde a disminuirn
, y moverse hacia la derecha corresponde a tomartail l
para cambiar todos los elementos de la lista un espacio a la izquierda. Entonces, la salidal%n
es el valor anteriorl%(n-1)
, más el valor anterior y a la derecha(tail l)%(n-1)
El caso base
n==0
es tomar el primer elemento de la lista.Idealmente, la entrada se rellenaría con infinitos ceros a la derecha, ya que las derivadas de un polinomio eventualmente se convierten en cero. Simulamos esto agregando un
0
cuando tomamos eltail
.Extraño alt 41:
fuente
MATL , 9 bytes
Pruébalo en línea! O verificar todos los casos de prueba .
Explicación
fuente
Jalea ,
65 bytesPruébalo en línea!
-1 byte gracias a @Doorknob
Explicación
fuente
Brachylog ,
1312 bytesPruébalo en línea!
Cómo funciona
Solución anterior de 13 bytes
Pruébalo en línea!
Cómo funciona
fuente
Mathematica, 32 bytes
fuente
Python ,
8058 bytesMe encantan las matemáticas para este desafío.
Cómo funciona (solo funciona con python 2):
Pruébalo en línea!
100 bytes alternativos con el uso del triángulo pascal
Cómo funciona (funciona para python 2 y 3):
Esta fórmula funciona mapeando los coeficientes de la fila
x
del triángulo de pascales en la matriz. Cada elemento del triángulo pascal está determinado por la función elegir de la fila y el índice. La suma de esta nueva matriz es equivalente a la salida enx
. También es intuitivo, ya que el proceso iterado del método de newtons (que se muestra en el ejemplo) actúa exactamente como la construcción del triángulo de pascales.Pruébalo en línea!
Muchas gracias a los ovs por reducir 22 bytes al convertir el bucle en una función recursiva
fuente
Haskell,
5245 bytesEjemplo de uso:
[-3,3,-3,3,-3,3,-3,3,-3] # 15
->-9009
. Pruébalo en línea!Cómo funciona
Editar: @xnor guardó 7 bytes. ¡Gracias!
fuente
zipWith(+)=<<tail.(++[0])
, es decir, arreglar la lista de antemano en lugar de después.=<<
aquí, esto es una locura :)=<<
se utiliza en contexto función y se define como:(=<<) f g x = f (g x) x
. Aquí usamos=<<
infijo:(f =<< g) x
conf = zipWith(+)
yg = tail
, que se traduce enzipWith(+) (tail x) x
.CJam , 12 bytes
Pruébalo en línea!
Explicación
El código implementa directamente el procedimiento descrito en el desafío.
fuente
Pyth , 10 bytes
Banco de pruebas.
Cómo funciona
fuente
APL (Dyalog) , 29 bytes
Pruébalo en línea!
Este es un dfn recursivo, pero resulta ser demasiado detallado. Golf en progreso ...
fuente
En realidad , 7 bytes
Pruébalo en línea!
Cómo funciona
fuente
Octava , 42 bytes
Esto define una función anónima. Pruébalo en línea!
Explicación
La solución podría calcularse convolviendo repetidamente la matriz de entrada y las matrices resultantes con
[1, 1]
. Pero convolucionar dos veces, o tres, o ... con[1, 1]
corresponde a convolucionar una vez con[1, 2 ,1]
, o[1, 3, 3, 1]
, o ...; es decir, con una fila del triángulo de Pascal. Esto se obtiene como la anti-diagonal de la matriz de orden Pascalx+1
.fuente
JavaScript (ES6), 41 bytes
La excelente respuesta de Haskell de @xnor. Solución previa de 47 bytes.
fuente
Python 3 con Numpy , 82 bytes
Similar a mi respuesta MATL , pero usando convolución de tamaño completo, y por lo tanto el resultado es el
x
entrada enésima de la matriz final.Pruébalo en línea!
fuente
Python , 51 bytes
Pruébalo en línea!
Este es un puerto de mi respuesta de Haskell .
fuente