Орієнтовні певні інтеграли, використовуючи суми Рімана


19

Ліві та праві суми Рімана є наближенням до певних інтегралів . Звичайно, в математиці нам потрібно бути дуже точними, тому ми прагнемо обчислити їх за допомогою ряду підрозділів, що наближаються до нескінченності, але це не потрібно для цілей цього завдання. Натомість слід спробувати написати найкоротшу програму, взявши введення та надавши висновок будь-яким із методів за замовчуванням , будь-якою мовою програмування , яка виконує такі дії:

Завдання

Враховуючи два раціональних числа і (межі визначеного інтеграла), додатне ціле число , булева представляє лівий / правий, і функцію чорного поля , обчислюють ліву або праву Ріманову суму (залежно від ) від , використовуючи рівних підрозділів.абнк fкабf(х)гхн

Технічні характеристики вводу / виводу

  • а і можуть бути раціональними / числами або дробами з плаваючою комою. б

  • к може бути представлено будь-якими двома різними і послідовними значеннями, але врахуйте, що вам не дозволяється приймати повні або часткові функції як вхідні дані.

  • f - функція чорного поля. Посилаючись на метавідповідь, зв'язану вище, до вмісту (тобто коду) функцій чорної скриньки неможливо отримати доступ, ви можете лише викликати їх (передаючи аргументи, якщо це можливо) та спостерігати за їх результатами . Якщо потрібно, додайте необхідну інформацію про синтаксис, який використовує ваша мова, щоб ми могли перевірити ваше подання.

Як вихід, ви повинні надати раціональну / з плаваючою точкою / дробом, що представляє суму Рімана, про яку ви просите. Як обговорювалося раніше , неточність з плаваючою комою може бути проігнорована, якщо ваш висновок точний щонайменше до трьох десяткових знаків після округлення до найближчого кратного 1/1000 (наприклад 1.4529999, точне замість 1.453).

Математичні характеристики

  • f гарантовано буде безперервним між і (без стрибків, без дірок, без вертикальних асимптот).аб

  • Є три можливі випадки, з якими вам доведеться впоратися: (Результат повинен бути або його еквіваленти), або .а=б0а<ба>б

  • Якщо , інтеграл змінює свій знак. Також правильне почуття інтеграла в цьому випадку спрямоване на .б<аа

  • Площі під графіком негативні, а ті, що над графом - позитивні.

Приклади / Випробування

Роздільна здатність не є оптимальною, тому що мені довелося їх трохи зменшити, але вони все ще читаються.

  • f(х)=2х+1,а=5,б=13,н=4 , k = право:

    2x + 1

    Результат повинен бути , тому що ширина кожного прямокутника дорівнює та відповідному висоти .152+192+232+272=168|б-а|н=2f(7)=15,f(9)=19,f(11)=23,f(13)=27

  • f(х)=х,а=1,б=2.5,н=3 , k = зліва:

    Квадратний корінь

    Вихід повинен бути .1.8194792169

  • f(х)=-3х+4+х25,а=12.5,б=2.5,н=10 , k = справа:

    -3x + 4 + 1 / 5x ^ 2

    Очікуване значення виходу становить , оскільки інтеграл змінює знаки при перегортанні меж ( ) .(4.055.456.457.057.257.056.455.454.052.25)=55.5b<a

  • f(x)=94x+2x27,a=0,b=15,n=3 , k = зліва:

    9-4x + 2 / 7x ^ 2

    Обчисливши нашу Ріманову суму, отримаємо .13.5714285715

  • f(х)=6,а=1,б=4,н=218 , k = право - Вихід: .18

  • f(х)=х7+165х+1,а=7,б=7,н=40 , k = зліва - вихід: .0

  • f(х)=хгріх(х-1),а=0,б=1,н=500,385723952885505 , k = право - Вихід: . Зверніть увагу, що синус тут використовує радіани, але сміливо використовуйте градуси замість цього.0,385723952885505


3
Особлива подяка: Цей виклик був опублікований у пісочниці , де він отримав цінні відгуки користувачів202729 , AdmBorkBork та Leaky Nun .
Містер Xcoder

Я впевнений, що рішення тут допоможуть багаторічним студентам Calc I ...
Джузеппе

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) - чорна скринька, чому це важливо?
l4m2

@ l4m2 Це не має великого значення, просто хотіли повідомити людям, що вони не повинні турбуватися про такі речі.
Містер Xcoder

@Giuseppe Ні. Методи програм тут навіть гірші, ніж методи кишенькових калькуляторів. [просто кажу]
user202729

Відповіді:


8

R , 69 65 63 57 байт

function(a,b,n,k,f,w=(b-a)/n)sum(sapply(a+w*(1:n-k),f))*w

Спробуйте в Інтернеті!

Береться k=FALSEза праві суми, хоча посилання TIO тепер включає псевдоніми "ліворуч" і "праворуч" для зручності використання.

a+w*(1:n-k) генерує відповідні точки праворуч або праворуч.

Потім sapplyзастосовується fдо кожного елемента результату, який ми згодом sumзбільшуємо та множимо на ширину інтервалу, (b-a)/nщоб отримати результат. Цей останній також акуратно піклується про будь-які проблеми зі знаками, які ми можемо мати.


4

SNOBOL4 (CSNOBOL4) , 127 байт

	DEFINE('R(a,b,n,k,p)')
R	l =(b - a) / n
	i =1
l	R =R + eval(p '(a + l * (i - k))')
	i =lt(i,n) i + 1	:s(l)
	R =R * l :(return)

Спробуйте в Інтернеті!

Припускаючи , що функція pвизначена де - то, це відбувається a,b,n,k,(name of p)з k=0для правої і l=1для лівої.

catspaw - х SNOBOL4+опор REALs , але не має вбудованої Тріг функцій. Однак, я припускаю, що можна було б придумати розумну sinфункцію за допомогою серії Тейлора.

Я не на 100% впевнений, що це "правильний" спосіб передачі функції чорної скриньки в SNOBOL (який, наскільки мені відомо, не має першокласних функцій), але мені здається розумним.

Я вважаю , що приймаючи на себе функції визначається як fби коротше, оскільки лінія lможе бути

l	R =R + f(a + l * (i - k))

але тоді це не передається як аргумент, який трохи схожий на "обман".

Зауважте, що в TIO-посиланні є оператор :(e)після DEFINE, тобто так, що код фактично працює належним чином.


4

Джулія 0,6 , 50 байт

R(f,a,b,n,k)=(c=(b-a)/n;sum(f.(a+[k:n+k-1...]c))c)

Спробуйте в Інтернеті!

Нормований діапазон будується, збирається у вектор і потім масштабується. Збір діапазону у вектор за допомогою [X...]необхідно уникати inexact errorпри множенні діапазону безпосередньо на 0, коли a=b. Аналогічно, побудувати діапазон безпосередньо з :або range()неможливо, коли a=b.

Застосування k дуже схоже на рішення Гізеппе , з « k=1за» rightі « k=0для» left.


f.векторизує fсвої аргументи (аргументи)?
Джузеппе

@Giuseppe: Саме так. f.є елементарним застосуванням f.
LukeS




1

Желе , 21 байт

ƓḶ+Ɠ÷
IḢ×¢A+ṂɠvЀÆm×I

Спробуйте в Інтернеті!

Візьміть a,bз аргументів і

n
right
f

від стдін.


Якщо ви не знайомі з Jelly, ви можете використовувати Python для написання функції чорного поля f:

f (x) = 2x + 1 ; a = 5; b = 13; n = 4; k = справа

f (x) = √x ; a = 1; b = 2,5; n = 3; k = зліва

f (x) = -3x + 4 + 1/5 * x 2 ; a = 12,5; b = 2,5; n = 10; k = справа

f (x) = 9 - 4x + 2/7 * x 2 ; a = 0; b = 15; n = 3; k = зліва

f (x) = 6 ; a = 1; b = 4; n = 2; k = справа

f (x) = x * sin (1 / x) ; a = 0; b = 1; n = 50; k = справа


Пояснення:


ƓḶ+Ɠ÷     Helper niladic link.
Ɠ         First line from stdin. (n). Assume n = 4.
 Ḷ        Lowered range (unlength). Get [0, 1, 2, 3].
  +Ɠ      Add second line from stdin (k). Assume k = 1 (right).
            Get [1, 2, 3, 4].
    ÷     Divide by (n). Get [0.25,0.5,0.75,1].

IḢ×¢A+ṂɠvЀÆm×I   Main monadic link. Take input `[a, b]`, assume `a=2,b=6`.
IḢ                `a-b`. Get `-4`.
  ×¢              Multiply by value of niladic link above. Get `[-1,-2,-3,-4]`.
    A             Absolute value. Get `[1,2,3,4]`.
     +Ṃ           Add min(a, b) = 2. Get `[3,4,5,6]`.
        vЀ       For each number, evaluate with...
       ɠ            input line from stdin.
           Æm     Arithmetic mean.
             ×I   Multiply by `a-b`.


1

Perl 6 , 65 байт

{my \d=($^b-$^a)/$^n;sum ($a,*+d...*)[($^k+^0>d)+ ^$n]».&^f X*d}

Спробуйте в Інтернеті!

Відносно прямо. Єдине ускладнення є обробка a > bсправи, яке я роблю по XOR-Інге прапор введення $^kз 0 > d, який інвертує його , коли a > b.


0

APL (Dyalog Classic) , 37 байт

{(a b n k)←⍵⋄ln÷⍨b-al×+/⍺⍺a+l×k+⍳n}

Спробуйте в Інтернеті!

APL NARS, 37 символів

Функція має аргумент в лівій функції, в правому числовий аргумент abn k. У питанні k = зліва тут означає k = ¯1; k = прямо тут означає k = 0. Тест:

  f←{(a b n k)←⍵⋄ln÷⍨b-al×+/⍺⍺a+l×k+⍳n}
  {1+2×⍵} f 5 13 4 0
168
  {√⍵} f 1 2.5 3 ¯1
1.819479217
  {4+(¯3×⍵)+0.2×⍵×⍵} f 12.5 2.5 10 0
55.5
  {9+(¯4×⍵)+7÷⍨2×⍵×⍵} f 0 15 3 ¯1
13.57142857
  {6-0×⍵} f 1 4 2 0
18
  {1+(165×⍵)+⍵*7} f 7 7 4 ¯1
0
  {⍵×1○÷⍵} f 0 1 50 0
0.3857239529

Подання підраховуються в байтах, а не символами. Я не пам'ятаю, чи NARS має користувальницьку кодову сторінку (тому це також буде 37 байт) чи використовує UTF16.
Уріель

@Uriel Це 37 байт у класичному стилі Dyalog APL перейти за посиланням; можливо 35x2 байт для Nars Apl ...
RosLuP

То чому ти пишеш це як НАРС? У НАРС навіть є dfns? До речі, ви можете скинути перших батьків на 35 байт
Уріель

APL NARS, 37 символів означає, що він також повинен працювати в
APRS
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.