Las sumas de Riemann izquierda y derecha son aproximaciones a integrales definidas . Por supuesto, en matemáticas necesitamos ser muy precisos, por lo que nuestro objetivo es calcularlos con una serie de subdivisiones que se acercan al infinito, pero eso no es necesario para los propósitos de este desafío. En su lugar, debe intentar escribir el programa más corto, tomar entradas y proporcionar salidas a través de cualquiera de los métodos predeterminados , en cualquier lenguaje de programación , que haga lo siguiente:
Tarea
Dados dos números racionales y (los límites de la integral definida), un entero positivo , un booleano que representa izquierda / derecha y una función de recuadro negro , calcula la suma de Riemann izquierda o derecha (dependiendo de ) de , usando subdivisiones iguales .f
Especificaciones de E / S
y pueden ser números racional / de punto flotante o fracciones.
puede ser representado por dos valores distintos y consistentes, pero tenga en cuenta que no se le permite tomar funciones completas o parciales como entrada.
es una función de recuadro negro. Citando la meta respuesta vinculada anteriormente,no se puede acceder al contenido (es decir, el código) de las funciones de recuadro negro, solo puede llamarlas (pasar argumentos si corresponde) y observar su salida. Si es necesario, incluya la información necesaria sobre la sintaxis que usa su idioma para que podamos probar su envío.
Como salida, debe proporcionar una fracción / punto flotante / racional que represente la suma de Riemann que se le solicita. Como se discutió en el pasado , la imprecisión de punto flotante puede ignorarse, siempre que su salida sea precisa al menos con tres decimales cuando se redondea al múltiplo más cercano de 1/1000 (por ejemplo, 1.4529999
está bien en lugar de 1.453
).
Especificaciones de matemáticas
se garantiza que sea continua entre y(sin saltos, sin agujeros, no hay asíntotas verticales).
Hay tres casos posibles que debe manejar: (El resultado debe ser o sus equivalentes), o .
Si , la integral cambia su signo. Además, el sentido correcto de la integral en este caso es hacia .
Las áreas debajo del gráfico son negativas y las que están arriba del gráfico son positivas.
Ejemplos / Casos de prueba
La resolución no es óptima, porque tuve que reducirlos un poco, pero aún son legibles.
, k = derecha:
El resultado debe ser , porque el ancho de cada rectángulo es y el correspondiente las alturas son .
, k = izquierda:
La salida debe ser .
, k = derecha:
El valor de salida esperado es , porque la integral cambia de signo al voltear los límites ( ) .
, k = izquierda:
Calculando nuestra suma de Riemann, obtenemos .
, k = derecha - Salida: .
, k = izquierda - Salida: .
f(x) = x * sin(1 / x); a = 0; b = 1; n = 50; k = right — Output: 0.385723952885505. Note that sine uses radians here, but feel free to use degrees instead.
Ahora que f (x) es un cuadro negro, ¿por qué es importante?Respuestas:
R ,
69656357 bytesPruébalo en línea!
Toma las
k=FALSE
sumas de la mano derecha, aunque el enlace TIO ahora incluye alias para "izquierda" y "derecha" para facilitar su uso.a+w*(1:n-k)
genera puntos apropiados para la mano izquierda o derecha.Luego se
sapply
aplicaf
a cada elemento del resultado, que luegosum
subimos y multiplicamos por el ancho del intervalo(b-a)/n
para obtener el resultado. Esto último también se ocupa de cualquier problema de señalización que podamos tener.fuente
SNOBOL4 (CSNOBOL4) , 127 bytes
Pruébalo en línea!
Suponiendo que la función
p
se define en alguna parte, esto tomaa,b,n,k,(name of p)
, conk=0
para derecha el=1
izquierda.catspaw's
SNOBOL4+
admiteREAL
s pero no tiene funciones trigonométricas integradas. Sin embargo, supongo que uno podría llegar a unasin
función razonable utilizando una serie de Taylor.No estoy 100% seguro de que esta sea la forma "correcta" de pasar una función de recuadro negro en SNOBOL (que, que yo sepa, no tiene funciones de primera clase), pero me parece razonable.
Supongo que suponiendo que la función se defina como
f
sería más corta, ya que la líneal
podría serpero luego no se pasa como un argumento, que se siente un poco como "trampa".
Tenga en cuenta que el enlace TIO tiene una declaración
:(e)
posteriorDEFINE
, de modo que el código realmente se ejecutará correctamente.fuente
Julia 0.6 , 50 bytes
Pruébalo en línea!
Se construye un rango normalizado, se recoge en un vector y luego se escala. Es necesario recopilar el rango en un vector
[X...]
para evitar elinexact error
al multiplicar el rango directamente por 0 cuandoa=b
. Del mismo modo, construir un rango directamente con:
orange()
no es posible cuandoa=b
.El uso de k es muy similar a la solución de Guiseppe , con
k=1
forright
yk=0
forleft
.fuente
f.
vectorizaf
sobre sus argumentos?f.
es una aplicación de elemento inteligentef
.Haskell ,
7367 bytes¡Gracias a H.PWiz y Bruce Forte por los consejos!
Pruébalo en línea!
Solución bastante sencilla.
k
es0
para izquierda y1
para derecha.fuente
b
Python 2 ,
9994 bytesUn poco de una solución ingenua.
Pruébalo en línea!
fuente
JavaScript (Node.js) ,
737159 bytesPruébalo en línea!
fuente
Jalea , 21 bytes
Pruébalo en línea!
Tomar
a,b
de argumentos, yde stdin.
Si no está familiarizado con Jelly, puede usar Python para escribir la función de cuadro negro
f
:f (x) = 2x + 1 ; a = 5; b = 13; n = 4; k = derecha
f (x) = √x ; a = 1; b = 2.5; n = 3; k = izquierda
f (x) = -3x + 4 + 1/5 * x 2 ; a = 12,5; b = 2.5; n = 10; k = derecha
f (x) = 9 - 4x + 2/7 * x 2 ; a = 0; b = 15; n = 3; k = izquierda
f (x) = 6 ; a = 1; b = 4; n = 2; k = derecha
f (x) = x * sin (1 / x) ; a = 0; b = 1; n = 50; k = derecha
Explicación:
fuente
Perl 6 , 65 bytes
Pruébalo en línea!
Relativamente sencillo. La única complicación es manejar el
a > b
caso, lo que hago al cambiar el indicador de entrada$^k
con0 > d
, que lo invierte cuandoa > b
.fuente
APL (Dyalog Classic) , 37 bytes
Pruébalo en línea!
APL NARS, 37 caracteres
La función tiene el argumento a la izquierda de la función, en el argumento numérico a la derecha abn k. En la pregunta k = izquierda aquí significa k = ¯1; k = aquí significa k = 0. Prueba:
fuente