리만 합계를 사용한 근사 한정 적분


19

왼쪽과 오른쪽 리만 합계명확한 적분에 대한 근사치 입니다. 물론 수학에서 우리는 매우 정확해야하므로 무한대에 접근하는 여러 개의 세분으로 계산하는 것을 목표로하지만이 과제의 목적에는 필요하지 않습니다. 대신 입력을 복용하고 어떤을 통해 출력을 제공, 가장 짧은 프로그램을 작성하는 것을 시도해야 기본 방법 하나에, 프로그래밍 언어 는 다음을 수행 :

직무

두 유리수에게 주어 및 (정적분의 한계), 양의 정수 부울 좌 / 우로하고 나타내는, 블랙 박스 함수 , (에 따라 좌우 리만 합을 계산 의) 이용 동일 서브 디비전.abnk fkabf(x)dx

I / O 사양

  • 와 는 합리적 / 부동 소수점 수 또는 분수 일 수 있습니다.

  • 케이 는 명확하고 일관된 두 값으로 표현할 수 있지만 입력으로 전체 또는 부분 기능을 수행 할 수는 없습니다 .

  • 에프 는 블랙 박스 기능입니다. 위에 링크 된 메타 답변을 인용하면 블랙 박스 기능의 내용 (예 : 코드)에 액세스 할 수 없으며 호출 할 수 있으며 (해당되는 경우 인수 전달) 출력을 관찰 할 수 있습니다 . 필요한 경우 제출 한 내용을 테스트 할 수 있도록 언어에서 사용하는 구문에 대한 필수 정보를 포함하십시오.

출력으로, 요청한 리만 합계를 나타내는 합리적인 / 부동 소수점 / 분수를 제공해야합니다. 마찬가지로 과거에 논의 , 부동 소수점 부정확는 한 1,000분의 1의 가장 가까운 배수로 반올림 때 출력이 적어도 세 소수점에 정확으로 (예를 들어, 무시할 수 1.4529999대신 괜찮습니다 1.453).

수학 사양

  • 에프a b 는 와 사이 연속적입니다 (점프, 구멍 없음, 수직 점근 없음).

  • 처리해야 할 세 가지 가능한 경우가 있습니다 : (결과는 또는 동등한 것이어야 함), 또는 .=0<>

  • 경우 , 적분의 기호를 변경합니다. 또한이 경우 적분의 올바른 의미는을 향한 입니다.<

  • 그래프 아래 영역은 음수이고 그래프 위 영역은 양수입니다.

예 / 테스트 사례

해상도를 조금 축소해야했지만 여전히 읽을 수 있기 때문에 해상도가 최적이 아닙니다.

  • 에프(엑스)=2엑스+1,=5,=13,=4 , k = 오른쪽 :

    2x + 1

    결과이어야 각 사각형의 폭 때문에 와 대응 높이는 입니다.152+192+232+272=168||=2에프(7)=15,에프(9)=19,에프(11)=23,에프(13)=27

  • 에프(엑스)=엑스,=1,=2.5,= , k = 왼쪽 :

    제곱근

    출력은 이어야합니다 .1.8194792169

  • 에프(엑스)=엑스+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<

  • 에프(엑스)=94엑스+2엑스27,=0,=15,= , k = 왼쪽 :

    9-4x + 2 / 7x ^ 2

    리만 합계를 계산하면 됩니다.13.5714285715

  • 에프(엑스)=6,=1,=4,=2 , k = 오른쪽 — 출력 : .18

  • 에프(엑스)=엑스7+165엑스+1,=7,=7,=4 , k = 왼쪽 — 출력 : .0

  • 에프(엑스)=엑스(엑스1),=0,=1,=50 , k = 오른쪽 — 출력 : . 사인은 라디안을 사용하지만 대신 각도를 자유롭게 사용하십시오.0.385723952885505


3
특별 감사 :이 문제는 Sandbox 에 게시되었으며 user202729 , AdmBorkBorkLeaky Nun 으로부터 귀중한 피드백을 받았습니다 .
Mr. Xcoder

이 솔루션이 수년간의 Calc I 학생들에게 도움이 되길 바랍니다.
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 No. 여기서 프로그램 방법은 휴대용 계산기 방법보다 훨씬 나쁩니다. [단지 말하기]
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산화 티타늄 링크가 지금은 사용의 용이성을위한 "왼쪽"과 "오른쪽"에 대한 별칭을 포함하고 있지만, 오른쪽 금액에 대해.

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+지원 REAL기능은 있지만 내장 삼각 기능이 없습니다. 그러나 sin테일러 시리즈를 사용하여 합리적인 기능을 만들 수 있다고 생각 합니다.

이것이 SNOBOL에서 블랙 박스 함수를 전달하는 "올바른"방법인지 100 % 확실하지는 않지만 (내 지식으로는 일류 기능이 없음) 나에게는 합리적인 것처럼 보입니다.

함수가 fl이 될 수 있기 때문에 더 짧게 정의되었다고 가정합니다 .

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

그러나 그것은 "속임수"처럼 느껴지는 논쟁으로 전달되지 않습니다.

TIO 링크에는 :(e)after DEFINE문이 있으므로 코드가 실제로 제대로 실행됩니다.


4

Julia 0.6 , 50 바이트

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

온라인으로 사용해보십시오!

정규화 된 범위가 구성되고 벡터로 수집 된 다음 크기가 조정됩니다. 범위를 0으로 곱할 때 [X...]를 피하기 위해를 사용하여 범위를 벡터로 수집 해야합니다 . 마찬가지로, 직접 범위를 구성 하거나하는 경우에 가능하지 않다 .inexact errora=b:range()a=b

k의 사용법은 for 및 for 와 함께 Guiseppe 의 솔루션과 매우 유사합니다 .k=1rightk=0left


f.f인수를 벡터화 합니까?
주세페

@ 주세페 : 맞습니다. f.의 요소 별 응용 프로그램입니다 f.
LukeS




1

젤리 , 21 바이트

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

온라인으로 사용해보십시오!

가지고 a,b논쟁에서, 그리고

n
right
f

stdin에서.


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

펄 6 , 65 바이트

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

온라인으로 사용해보십시오!

비교적 간단합니다. 유일한 복잡성은 취급 a > bI는 XOR 오링 입력 플래그로 할 경우 $^k0 > 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

@ Uriel 그것은 Dyalog APL classic에서 37 바이트이며 링크를 따릅니다. NARS APL에 대한 가능성 35x2 바이트 ...
RosLuP

그렇다면 왜 NARS로 작성합니까? NARS에도 dfns가 있습니까? 그건 그렇고 당신은 35 바이트에 대한 첫 번째 부모를 삭제할 수 있습니다
Uriel

APL NARS는 37 개 문자는 너무 NARS APL에서 실행해야 의미
RosLuP
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.