Linke und rechte Riemann-Summen sind Annäherungen an bestimmte Integrale . Natürlich müssen wir in der Mathematik sehr genau sein, deshalb versuchen wir, sie mit einer Reihe von Unterteilungen zu berechnen, die gegen unendlich gehen, aber das wird für die Zwecke dieser Herausforderung nicht benötigt. Sie sollten stattdessen versuchen, das kürzeste Programm zu schreiben, indem Sie Eingaben und Ausgaben mit einer der Standardmethoden in einer beliebigen Programmiersprache vornehmen , die Folgendes ausführen:
Aufgabe
Mit zwei rationalen Zahlen und (den Grenzen des bestimmten Integrals), einer positiven ganzen Zahl , einem Booleschen für left / right und einer Black-Box-Funktion berechnen Sie die linke oder rechte Riemann-Summe (in Abhängigkeit von k ) von \ int_a ^ bf (x) \ mathrm {d} x mit n gleichen Unterteilungen.
E / A-Spezifikationen
und können rationale / Gleitkommazahlen oder Brüche sein.
kann durch zwei unterschiedliche und konsistente Werte dargestellt werden. Beachten Sie jedoch, dass Sie keine vollständigen oder teilweisen Funktionen als Eingabe verwenden dürfen.
ist eine Black-Box-Funktion. Unter Berufung auf die oben verlinkte Meta-Antwort kann möglicherweise nicht auf den Inhalt (dh den Code) von Black-Box-Funktionen zugegriffen werden. Sie können sie nur aufrufen (ggf. Argumente übergeben) und ihre Ausgabe beobachten . Geben Sie bei Bedarf die erforderlichen Informationen zu der von Ihrer Sprache verwendeten Syntax an, damit wir Ihren Beitrag testen können.
Als Ausgabe müssen Sie einen rationalen Gleitkomma-Bruch angeben, der die Riemann-Summe darstellt, nach der Sie gefragt werden. Wie bereits erwähnt , kann die Gleitkomma-Ungenauigkeit ignoriert werden, solange Ihre Ausgabe auf mindestens drei Dezimalstellen genau ist, wenn sie auf das nächste Vielfache von 1/1000 gerundet wird (z. B. 1.4529999
ist in Ordnung statt 1.453
).
Math Specs
ist garantiert durchgehend zwischen und (keine Sprünge, keine Löcher, keine vertikalen Asymptoten).
Es gibt drei mögliche Fälle, die Sie behandeln müssen: (Das Ergebnis sollte oder dessen Äquivalente sein), oder .
Wenn , ändert das Integral sein Vorzeichen. Auch der richtige Sinn des Integrals ist in diesem Fall in Richtung .
Bereiche unter dem Diagramm sind negativ und diejenigen über dem Diagramm sind positiv.
Beispiele / Testfälle
Die Auflösung ist nicht optimal, weil ich sie etwas verkleinern musste, aber sie sind immer noch lesbar.
, k = rechts:
Das Ergebnis sollte , da die Breite jedes Rechtecks und die entsprechende ist Die Höhen sind .
, k = links:
Die Ausgabe sollte .
, k = rechts:
Der erwartete Ausgabewert ist , da das Integral beim Umkehren der Grenzen das Vorzeichen ändert ( ) .b < a
, k = left:
wir unsere Riemann-Summe berechnen, erhalten wir .
, k = rechts - Ausgabe: .
, k = links - Ausgabe: .
, k = rechts - Ausgabe: . Beachten Sie, dass der Sinus hier Bogenmaß verwendet, Sie können jedoch auch Grad verwenden.
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.
Nun, da f (x) eine Blackbox ist, warum ist das wichtig?Antworten:
R ,
69656357 BytesProbieren Sie es online!
Nimmt
k=FALSE
für Rechtssummen, obwohl der TIO-Link jetzt Aliase für "links" und "rechts" für die Benutzerfreundlichkeit enthält.a+w*(1:n-k)
erzeugt entsprechende Punkte für die linke oder rechte Hand.Dann
sapply
giltf
für jedes Element des Ergebnisses, das wir dannsum
aufaddieren und mit der Intervallbreite multiplizieren(b-a)/n
, um das Ergebnis zu erhalten. Letzteres kümmert sich auch ordentlich um alle Schilderprobleme, die wir haben könnten.quelle
SNOBOL4 (CSNOBOL4) , 127 Bytes
Probieren Sie es online!
Vorausgesetzt, die Funktion
p
ist irgendwo definiert, dauert diesa,b,n,k,(name of p)
mitk=0
für rechts undl=1
für links.catspaw's
SNOBOL4+
unterstütztREAL
s, hat aber keine eingebauten Triggerfunktionen. Ich nehme jedoch an, dass mansin
mit einer Taylor-Serie eine vernünftige Funktion finden könnte .Ich bin mir nicht 100% sicher, ob dies der "richtige" Weg ist, eine Black-Box-Funktion in SNOBOL (die meines Wissens keine erstklassigen Funktionen hat) zu übergeben, aber es scheint mir vernünftig.
Ich nehme an, dass unter der Annahme, dass die Funktion als
f
kürzer definiert ist, als die Linie seinl
könnteaber dann wird es nicht als Argument übergeben, was sich ein bisschen wie "Schummeln" anfühlt.
Beachten Sie, dass der TIO-Link
:(e)
nach derDEFINE
Anweisung ein steht, sodass der Code tatsächlich ordnungsgemäß ausgeführt wird.quelle
Julia 0,6 , 50 Bytes
Probieren Sie es online!
Ein normalisierter Bereich wird konstruiert, in einem Vektor gesammelt und dann skaliert. Das Erfassen des Bereichs in einem Vektor unter Verwendung von
[X...]
ist erforderlich, um zu vermeiden, dassinexact error
beim Multiplizieren des Bereichs direkt mit 0 der Wert "when" verwendet wirda=b
. Ebenso ist das direkte Erstellen eines Bereichs mit:
oderrange()
nicht möglich, wenna=b
.Die Verwendung von k ist der Lösung von Guiseppe mit
k=1
fürright
undk=0
für sehr ähnlichleft
.quelle
f.
vektorisiertf
über seine Argumente?f.
ist elementweise Anwendung vonf
.Haskell ,
7367 BytesVielen Dank an H.PWiz und Bruce Forte für die Tipps!
Probieren Sie es online!
Ziemlich einfache Lösung.
k
ist0
für links und1
für rechts.quelle
b
Python 2 ,
9994 BytesEin bisschen wie eine naive Lösung.
Probieren Sie es online!
quelle
JavaScript (Node.js) ,
737159 BytesProbieren Sie es online!
quelle
Jelly , 21 Bytes
Probieren Sie es online!
Nehmen Sie
a,b
aus Argumenten undvon stdin.
Wenn Sie mit Jelly nicht vertraut sind, können Sie mit Python die Blackbox-Funktion schreiben
f
:f (x) = 2x + 1 ; a = 5; b = 13; n = 4; k = richtig
f (x) = √x ; a = 1; b = 2,5; n = 3; k = links
f (x) = -3x + 4 + 1/5 * x 2 ; a = 12,5; b = 2,5; n = 10; k = richtig
f (x) = 9 - 4x + 2/7 * x 2 ; a = 0; b = 15; n = 3; k = links
f (x) = 6 ; a = 1; b = 4; n = 2; k = richtig
f (x) = x · sin (1 / x) ; a = 0; b = 1; n = 50; k = richtig
Erläuterung:
quelle
Perl 6 , 65 Bytes
Probieren Sie es online!
Relativ einfach. Die einzige Komplikation ist der Umgang mit dem
a > b
Fall, die ich von xor-ing tun , um den Eingang Flagge$^k
mit0 > d
, es welcher umkehrt , wenna > b
.quelle
APL (Dyalog Classic) , 37 Byte
Probieren Sie es online!
APL NARS, 37 Zeichen
Die Funktion hat links das Argument, rechts das numerische Argument abn k. In der Frage k = hier links bedeutet es k = ¯ 1; k = genau hier bedeutet es k = 0. Prüfung:
quelle