Sumy Riemanna po lewej i prawej stronie są przybliżeniami do całek oznaczonych . Oczywiście w matematyce musimy być bardzo dokładni, więc staramy się je obliczać za pomocą szeregu podziałów zbliżających się do nieskończoności, ale nie jest to potrzebne do celów tego wyzwania. Zamiast tego powinieneś spróbować napisać najkrótszy program, przyjmując dane wejściowe i dostarczając dane wyjściowe za pomocą dowolnej domyślnej metody , w dowolnym języku programowania , który wykonuje następujące czynności:
Zadanie
Biorąc pod uwagę dwie liczby wymierne i (granice całkowitej całki), dodatnią liczbę całkowitą , wartość logiczną reprezentującą funkcję lewo / prawo i czarną skrzynkę , oblicz lewą lub prawą sumę Riemanna (w zależności od ) z , używając równych poddziałów.
Specyfikacja I / O
i mogą być liczbami racjonalne / zmiennoprzecinkowe lub frakcje.
może być reprezentowane przez dowolne dwie odrębne i spójne wartości, ale należy pamiętać, że nie wolno przyjmować pełnych lub częściowych funkcji jako danych wejściowych.
jest funkcją czarnej skrzynki. Powołując się na powyższą meta odpowiedź, zawartość (tj. Kod) funkcji czarnej skrzynki może nie być dostępna, możesz tylko wywoływać je (przekazując argumenty, jeśli dotyczy) i obserwować ich wyniki . W razie potrzeby podaj niezbędne informacje o składni używanej przez Twój język, abyśmy mogli przetestować Twoje zgłoszenie.
Jako wynik musisz podać ułamek wymierny / zmiennoprzecinkowy / reprezentujący sumę Riemanna, o którą jesteś proszony. Jak omówiono w przeszłości , niedokładność zmiennoprzecinkowa może być ignorowana, o ile wynik jest dokładny do co najmniej trzech miejsc po przecinku, gdy jest zaokrąglany do najbliższej wielokrotności 1/1000 (np. 1.4529999
Jest w porządku zamiast 1.453
).
Dane matematyczne
jest zagwarantowana w sposób ciągły pomiędzy i (bez skoków, otwory, nie ma pionowych asymptoty).
Istnieją trzy możliwe przypadki, z którymi musisz sobie poradzić: (Wynik powinien wynosić lub jej odpowiedniki), lub .
Jeśli , całka zmienia swój znak. Również prawo poczucie całki jest w tym przypadku w kierunku.
Obszary pod wykresem są ujemne, a te nad wykresem są dodatnie.
Przykłady / przypadki testowe
Rozdzielczość nie jest optymalna, ponieważ musiałem je nieco zmniejszyć, ale nadal są czytelne.
, k = prawo:
Wynik powinien wynosić , ponieważ szerokość każdego prostokąta wynosi a odpowiednie wysokości to .
, k = left:
Dane wyjściowe powinny wynosić .
, k = prawo:
Oczekiwana wartość wyjściowa wynosi , ponieważ całka zmienia znaki podczas przesuwania granic ( b < a ) .
, k = w lewo:
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.
Teraz, gdy f (x) jest czarną skrzynką, dlaczego to ma znaczenie?Odpowiedzi:
R ,
69656357 bajtówWypróbuj online!
Pobiera
k=FALSE
sumy po prawej stronie, chociaż łącze TIO zawiera teraz aliasy dla „lewej” i „prawej” dla łatwości użycia.a+w*(1:n-k)
generuje odpowiednie lewe lub prawe punkty.Następnie
sapply
stosuje sięf
do każdego elementu wyniku, który następniesum
zwiększamy i mnożymy przez szerokość interwału,(b-a)/n
aby uzyskać wynik. Ta ostatnia również starannie rozwiązuje wszelkie problemy ze znakiem, jakie możemy mieć.źródło
SNOBOL4 (CSNOBOL4) , 127 bajtów
Wypróbuj online!
Zakładając, że funkcja
p
jest gdzieś zdefiniowana, bierze toa,b,n,k,(name of p)
, zk=0
prawej il=1
lewej.catspaw
SNOBOL4+
obsługujeREAL
s, ale nie ma wbudowanych funkcji trig. Jednak przypuszczam, że można wymyślić rozsądnąsin
funkcję za pomocą serii Taylor.Nie jestem w 100% pewien, że jest to „właściwy” sposób przekazania funkcji czarnej skrzynki w SNOBOL (która, o ile mi wiadomo, nie ma funkcji pierwszej klasy), ale wydaje mi się to rozsądne.
Przypuszczam, że zakładając, że funkcja jest zdefiniowana jako
f
krótsza, jakl
mogłaby być liniaale nie jest to traktowane jako argument, który przypomina trochę „oszukiwanie”.
Zauważ, że link TIO zawiera instrukcję
:(e)
afterDEFINE
, która zapewnia prawidłowe działanie kodu.źródło
Julia 0.6 , 50 bajtów
Wypróbuj online!
Znormalizowany zakres jest konstruowany, gromadzony w wektorze, a następnie skalowany. Zebranie zakresu do wektora za pomocą
[X...]
jest konieczne, aby uniknąćinexact error
pomnożenia zakresu bezpośrednio przez 0 kiedya=b
. Podobnie, konstruowanie zakresu bezpośrednio za pomocą:
lubrange()
nie jest możliwe, kiedya=b
.Użycie k jest bardzo podobne do rozwiązania Guiseppe ,
k=1
dla forright
ik=0
forleft
.źródło
f.
wektoryzujef
swoje argumenty?f.
jest elementarną aplikacjąf
.Haskell ,
7367 bajtówDzięki H.PWiz i Bruce Forte za wskazówki!
Wypróbuj online!
Całkiem proste rozwiązanie.
k
jest0
na lewo i1
na prawo.źródło
b
Python 2 ,
9994 bajtówTrochę naiwne rozwiązanie.
Wypróbuj online!
źródło
JavaScript (Node.js) ,
737159 bajtówWypróbuj online!
źródło
Galaretka , 21 bajtów
Wypróbuj online!
Weź
a,b
z argumentów iod standardowego.
Jeśli nie znasz Jelly, możesz użyć Pythona do napisania funkcji czarnej skrzynki
f
:f (x) = 2x + 1 ; a = 5; b = 13; n = 4; k = racja
f (x) = √x ; a = 1; b = 2,5; n = 3; k = w lewo
f (x) = -3x + 4 + 1/5 * x 2 ; a = 12,5; b = 2,5; n = 10; k = racja
f (x) = 9 - 4x + 2/7 * x 2 ; a = 0; b = 15; n = 3; k = w lewo
f (x) = 6 ; a = 1; b = 4; n = 2; k = racja
f (x) = x * sin (1 / x) ; a = 0; b = 1; n = 50; k = racja
Wyjaśnienie:
źródło
Perl 6 , 65 bajtów
Wypróbuj online!
Stosunkowo proste. Jedyną komplikacją jest obsługa
a > b
sprawy, co robię, ustawiając flagę wejściową za$^k
pomocą0 > d
, która odwraca ją, kiedya > b
.źródło
APL (Dyalog Classic) , 37 bajtów
Wypróbuj online!
APL NARS, 37 znaków
Funkcja ma argument po lewej stronie funkcji, w prawym argumencie liczbowym abn k. W pozostawionym tutaj pytaniu k = oznacza to k = ¯1; k = tutaj oznacza to k = 0. Test:
źródło