อินทิกรัล จำกัด แน่นอนโดยใช้ผลบวกของ Riemann


19

ซ้ายและขวาเงินก้อน Riemannมีความใกล้เคียงเพื่อintegrals ชัดเจน แน่นอนว่าในวิชาคณิตศาสตร์เราต้องมีความแม่นยำมากดังนั้นเราจึงตั้งเป้าที่จะคำนวณพวกมันด้วยเขตการปกครองจำนวนมากที่เข้าใกล้อนันต์ แต่นั่นไม่จำเป็นสำหรับจุดประสงค์ของการท้าทายนี้ คุณควรลองเขียนโปรแกรมที่สั้นที่สุดแทนการป้อนข้อมูลและให้ผลลัพธ์ผ่านวิธีการเริ่มต้นใดๆ ในภาษาการเขียนโปรแกรมใด ๆซึ่งทำสิ่งต่อไปนี้:

งาน

รับจำนวนตรรกยะaและb (ข้อ จำกัด ของอินทิกรัล จำกัด ), จำนวนเต็มบวกn , boolean kแทนซ้าย / ขวาและฟังก์ชันกล่องดำ f , คำนวณผลรวม Riemann ทางซ้ายหรือขวา (ขึ้นอยู่กับk ) ของabf(x)dxใช้n เท่ากับเขตการปกครอง

I / O Specs

  • aและbสามารถเป็นจำนวนตรรกยะ / จำนวนทศนิยมหรือเศษส่วน

  • kสามารถแสดงค่าที่แตกต่างและสอดคล้องกันได้สองค่า แต่โปรดจำไว้ว่าคุณไม่ได้รับอนุญาตให้ใช้ฟังก์ชั่นสมบูรณ์หรือบางส่วนเป็นอินพุต

  • fเป็นฟังก์ชั่นกล่องดำ อ้างถึงคำตอบที่เมตาเชื่อมโยงข้างต้นเนื้อหา (เช่นรหัส) ของกล่องดำฟังก์ชั่นอาจไม่สามารถเข้าถึงคุณสามารถเรียกพวกเขา (ข้อโต้แย้งผ่านถ้ามี) และสังเกตผลผลิตของพวกเขา หากจำเป็นโปรดระบุข้อมูลที่จำเป็นเกี่ยวกับไวยากรณ์ที่ภาษาของคุณใช้เช่นที่เราสามารถทดสอบการส่งของคุณ

ในฐานะที่เป็นเอาท์พุทคุณจะต้องให้เหตุผล / จุดลอยตัว / เศษส่วนแทนยอดรวม Riemann ที่คุณถูกถาม ในฐานะที่เป็นที่กล่าวถึงในอดีตที่ผ่านมา , จุดลอยตัวไม่แน่ชัดสามารถละเลยตราบใดที่การส่งออกของคุณถูกต้องอย่างน้อยสามตำแหน่งทศนิยมเมื่อปัดเศษให้เป็นหลายที่ใกล้ที่สุดของ 1/1000 (เช่น1.4529999จะปรับแทน1.453)

รายละเอียดทางคณิตศาสตร์

  • fรับประกันว่าจะต่อเนื่องระหว่างaและb (ไม่กระโดดไม่มีรูไม่มีเส้นกำกับแนวดิ่ง)

  • มีสามกรณีที่เป็นไปได้ที่คุณจะต้องจับคือ: = B (ผลที่ควรจะเป็น0หรือเทียบเท่า) < Bหรือ>a=b0a<ba>b

  • ถ้าb<aอินทิกรัลเปลี่ยนเครื่องหมาย นอกจากนี้ยังมีความรู้สึกทางขวาของหนึ่งในกรณีนี้คือต่อa

  • พื้นที่ใต้กราฟเป็นลบและพื้นที่ด้านบนของกราฟเป็นบวก

ตัวอย่าง / กรณีทดสอบ

ความละเอียดไม่เหมาะสมเพราะฉันต้องย่อขนาดลงเล็กน้อย แต่ก็ยังสามารถอ่านได้

  • f(x)=2x+1,a=5,b=13,n=4 , k = ขวา:

    2x + 1

    ผลลัพธ์ควรเป็น152+192+232+272=168เนื่องจากความกว้างของแต่ละสี่เหลี่ยมคือ|ba|n=2และความสูงที่สอดคล้องกันเป็นf(7)=15,f(9)=19,f(11)=23,f(13)=27 27

  • f(x)=x,a=1,b=2.5,n=3 , k = ซ้าย:

    รากที่สอง

    เอาท์พุทควรจะ1.81947921691.8194792169

  • f(x)=3x+4+x25,a=12.5,b=2.5,n=10 , k = ขวา:

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

    มูลค่าการส่งออกที่คาดไว้คือ(4.055.456.457.057.257.056.455.454.052.25)=55.5เพราะสัญญาณการเปลี่ยนแปลงที่สำคัญเมื่อพลิกขอบเขต ( b<a )

  • f(x)=94x+2x27,a=0,b=15,n=3 , k = ซ้าย:

    9-4x + 2 / 7x ^ 2

    การคำนวณผลรวม Riemann ของเราเราได้รับ13.571428571513.5714285715

  • f(x)=6,a=1,b=4,n=2 , K = ขวา - ขาออก:1818

  • f(x)=x7+165x+1,a=7,b=7,n=4 , K = ซ้าย - 0 0

  • f(x)=xsin(x1),a=0,b=1,n=50 , K = ขวา - ออก:0.3857239528855050.385723952885505โปรดทราบว่าไซน์ใช้เรเดียนที่นี่ แต่คุณสามารถใช้องศาแทนได้


3
ขอขอบคุณเป็นพิเศษ: ความท้าทายนี้ได้รับการโพสต์ในSandboxที่มันจะได้รับข้อเสนอแนะที่มีคุณค่าจากuser202729 , AdmBorkBorkและรั่วนูน
Mr. Xcoder

ฉันหวังว่าการแก้ปัญหาที่นี่จะช่วยนักเรียน Calc ฉันเป็นเวลาหลายปี ...
Giuseppe

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 มันไม่สำคัญหรอกแค่อยากให้คนรู้ว่าพวกเขาไม่ควรกังวลเกี่ยวกับสิ่งเหล่านี้
Mr. 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ซ้าย

ของลูกมือ SNOBOL4+สนับสนุนREALแต่ไม่มีฟังก์ชั่นตัว อย่างไรก็ตามฉันคิดว่าอาจมีsinฟังก์ชั่นที่สมเหตุสมผลโดยใช้ซีรี่ส์เทย์เลอร์

ฉันไม่แน่ใจ 100% นี่เป็นวิธีที่ "ถูกต้อง" ในการส่งผ่านฟังก์ชั่นกล่องดำใน SNOBOL (ซึ่งความรู้ของฉันไม่มีฟังก์ชั่นชั้นหนึ่ง) แต่ดูเหมือนว่าสมเหตุสมผลสำหรับฉัน

ฉันคิดว่าสมมติว่าฟังก์ชั่นมีการกำหนดตามที่fจะสั้นกว่าตามที่lควรจะเป็น

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

แต่มันก็ไม่ผ่านการโต้เถียงซึ่งให้ความรู้สึกเหมือน "การโกง"

โปรดทราบว่าลิงก์ TIO มีคำสั่ง:(e)หลังDEFINEซึ่งเป็นรหัสเพื่อให้ทำงานได้อย่างถูกต้องจริง


4

Julia 0.6 , 50 bytes

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 จะคล้ายกับการแก้ปัญหาของGuiseppeด้วยk=1สำหรับrightและสำหรับk=0left


f.vectorizes fมากกว่าอาร์กิวเมนต์ของมัน?
Giuseppe

@Giuseppe: แน่นอน เป็นโปรแกรมองค์ประกอบที่ชาญฉลาดของf. f
ลุ

2

Haskell , 73 67 ไบต์

ขอบคุณ H.PWiz และ Bruce Forte สำหรับคำแนะนำ!

(f&a)b n k|d<-(b-a)/realToFrac n=d*sum(f<$>take n(drop k[a,a+d..]))

ลองออนไลน์!

ทางออกที่ตรงไปตรงมาสวย

kคือ0สำหรับซ้ายและ1เพื่อสิทธิ


1
หากคุณกำลังสละคุณไม่จำเป็นต้องไปถึงb
H.PWiz

2

Python 2 , 99 94 ไบต์

บิตของโซลูชันไร้เดียงสา

def R(f,a,b,n,k):s=cmp(b,a);d=s*(b-a)/n;return s*sum(d*f([0,a,b][s]+i*d)for i in range(k,n+k))

ลองออนไลน์!



ด้วยเหตุผลบางอย่างฉันคิดว่าเราต้องจัดการอินพุตจำนวนเต็ม ขอบคุณ
mbomb007


1

เยลลี่ 21 ไบต์

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

ลองออนไลน์!

รับa,bจากการโต้แย้งและ

n
right
f

จาก stdin


หากคุณไม่คุ้นเคยกับเจลลี่คุณสามารถใช้ 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กรณีที่ฉันทำโดยแฮคเกอร์ไอเอ็นจีธงการป้อนข้อมูล$^kด้วยซึ่งตีความมันเมื่อ0 > da > b


0

APL (Dyalog Classic) , 37 ไบต์

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

ลองออนไลน์!

APL NARS, 37 ตัวอักษร

ฟังก์ชันมีอาร์กิวเมนต์ทางซ้ายของฟังก์ชันในอาร์กิวเมนต์ตัวเลขด้านขวาปกติ 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

@Uriel มันเป็น 37 bytes ใน Dyalog APL classic ตามลิงค์; อาจเป็นไปได้ 35x2 ไบต์สำหรับ Nars เม.ย. ...
RosLuP

เหตุใดคุณจึงเขียนเป็น NARS NARS มี dfnss หรือไม่ โดยวิธีการที่คุณสามารถปล่อยผู้ปกครองคนแรกสำหรับ 35 ไบต์
Uriel

APL NARS, 37 ตัวอักษรหมายความว่ามันควรทำงานใน NARS APL ด้วย
RosLuP
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.