Левая и правая римановы суммы являются приближениями к определенным интегралам . Конечно, в математике мы должны быть очень точными, поэтому мы стремимся вычислять их с помощью ряда подразделений, приближающихся к бесконечности, но это не требуется для целей этой задачи. Вместо этого вы должны попытаться написать самую короткую программу с вводом и выводом с помощью любого из методов по умолчанию на любом языке программирования , который выполняет следующие действия:
задача
Учитывая два рациональных числа и (пределы определенного интеграла), положительное целое число , логическое значение представляющее левый / правый и функцию черного ящика , вычисляют левую или правую сумму Римана (в зависимости от ) от , используя равных подразделений.
Спецификации ввода / вывода
и могут быть рациональными числами или числами с плавающей точкой или дробями.
может быть представлено любыми двумя различными и непротиворечивыми значениями, но имейте в виду, что вы не можете принимать полные или частичные функции в качестве входных данных.
- это функция черного ящика. Ссылаясь на мета-ответ, связанный выше, содержимое (то есть код) функций черного ящика может быть недоступно, вы можете только вызывать их (передавая аргументы, если применимо) и наблюдать за их выводом . При необходимости, пожалуйста, включите необходимую информацию о синтаксисе вашего языка, чтобы мы могли проверить вашу заявку.
В качестве вывода вы должны предоставить рациональную / с плавающей запятой / дробь, представляющую сумму Римана, о которой вы просили. Как обсуждалось в прошлом , неточность с плавающей запятой можно игнорировать, при условии, что ваши выходные данные с точностью не менее трех десятичных знаков при округлении до ближайшего кратного 1/1000 (например, 1.4529999
в порядке вместо 1.453
).
Математические характеристики
гарантированно будет непрерывным между и (без скачков, без дырок, без вертикальных асимптот).
Есть три возможных случая, которые вы должны обработать: (результат должен быть или его эквивалентами), или .
Если , интеграл меняет свой знак. Кроме того , право смысл интеграла в данном случае по отношению к .
Области под графиком отрицательные, а над графиком положительные.
Примеры / Тестовые случаи
Разрешение не является оптимальным, потому что мне пришлось немного уменьшить их, но они все еще читаемы.
, k = справа:
Результат должен быть , потому что ширина каждого прямоугольника равна и соответствующему высоты .
, k = слева:
Выход должен быть .
, k = справа:
Ожидаемое выходное значение составляет , потому что интеграл меняет знаки при переключении границ ( ) .
, k = слева:
Подсчитав нашу сумму Римана, мы получим .
, k = вправо - Выход: .
, k = слева - Выход: .
, k = вправо - Выход: . Обратите внимание, что здесь синус использует радианы, но вы можете использовать градусы.
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.
Теперь, когда f (x) черный ящик, почему это важно?Ответы:
R ,
69656357 байтПопробуйте онлайн!
Принимает
k=FALSE
для правых сумм, хотя ссылка TIO теперь включает псевдонимы для «левого» и «правого» для простоты использования.a+w*(1:n-k)
генерирует соответствующие левые или правые точки.Затем
sapply
применяетсяf
к каждому элементу результата, который мы затемsum
увеличиваем и умножаем на ширину интервала,(b-a)/n
чтобы получить результат. Это последнее также аккуратно решает любые проблемы со знаками, которые могут у нас возникнуть.источник
SNOBOL4 (CSNOBOL4) , 127 байт
Попробуйте онлайн!
Предполагая, что функция
p
где-то определена, это беретa,b,n,k,(name of p)
, сk=0
для правого иl=1
для левого.Catspaw
SNOBOL4+
поддерживаетREAL
s, но не имеет встроенных функций trig. Тем не менее, я полагаю, можно найти разумнуюsin
функцию, используя ряд Тейлора.Я не уверен на 100%, что это «правильный» способ передать функцию черного ящика в SNOBOL (которая, насколько мне известно, не имеет функций первого класса), но мне кажется, что это разумно.
Я предполагаю, что при условии, что функция определена как
f
будет короче, поскольку строкаl
может бытьно тогда это не передается в качестве аргумента, который выглядит как «обман».
Обратите внимание, что ссылка TIO имеет оператор
:(e)
afterDEFINE
, поэтому код будет работать правильно.источник
Юлия 0,6 , 50 байтов
Попробуйте онлайн!
Нормализованный диапазон строится, собирается в вектор и затем масштабируется. Сбор диапазона в вектор с помощью
[X...]
необходимо, чтобы избежатьinexact error
умножения диапазона непосредственно на 0, когдаa=b
. Точно так же, построение диапазона непосредственно с:
илиrange()
невозможно, когдаa=b
.Использование k очень похоже на решение Guiseppe с
k=1
forright
иk=0
forleft
.источник
f.
векторизоватьf
свои аргументы?f.
поэлементное применениеf
.Haskell ,
7367 байтСпасибо H.PWiz и Брюсу Форте за советы!
Попробуйте онлайн!
Довольно простое решение.
k
является0
для левого и1
для правого.источник
b
Python 2 ,
9994 байтаНемного наивного решения.
Попробуйте онлайн!
источник
JavaScript (Node.js) ,
737159 байтПопробуйте онлайн!
источник
Желе , 21 байт
Попробуйте онлайн!
Бери
a,b
от аргументов ииз стандартного
Если вы не знакомы с Jelly, вы можете использовать Python для написания функции черного ящика
f
:f (x) = 2x + 1 ; а = 5; б = 13; n = 4; k = право
f (x) = √x ; а = 1; б = 2,5; n = 3; k = слева
f (x) = -3x + 4 + 1/5 * x 2 ; а = 12,5; б = 2,5; n = 10; k = право
f (x) = 9 - 4x + 2/7 * x 2 ; а = 0; б = 15; n = 3; k = слева
f (x) = 6 ; а = 1; б = 4; n = 2; k = право
f (x) = x * sin (1 / x) ; а = 0; б = 1; n = 50; k = право
Объяснение:
источник
Perl 6 , 65 байт
Попробуйте онлайн!
Относительно просто. Единственное осложнение является обработка
a > b
дела, которое я делаю по XOR-инге флаг ввода$^k
с0 > d
, который инвертирует его , когдаa > b
.источник
APL (Dyalog Classic) , 37 байт
Попробуйте онлайн!
APL NARS, 37 символов
Функция имеет аргумент слева от функции, справа числовой аргумент abn k. В оставленном здесь вопросе k = это означает k = ¯1; k = прямо здесь это означает, что k = 0. Тестовое задание:
источник