使用Riemann和求近似定积分


19

左右黎曼和和定积分的近似值。当然,在数学中我们需要非常精确,因此我们的目标是使用许多接近无穷大的细分来计算它们,但对于本挑战而言,并不是必需的。相反,您应该尝试编写最短的程序,以任何编程语言通过任何默认方法获取输入并提供输出,该语言可以执行以下操作:

任务

给定两个有理数一种b(定积分的极限),一个正整数ñ,代表左/右的布尔ķ和一个黑盒函数 F,计算的左或右黎曼和(取决于ķb a f x d x,使用n个相等的细分。一种bFXdXñ

I / O规格

  • 一种b可以是有理数/浮点数或分数。

  • ķ可以由任意两个不同且一致的值表示,但请记住,不允许您将完整或部分函数用作输入。

  • F是黑盒功能。引用上面链接的meta答案,可能无法访问黑盒功能的内容(即代码),您只能调用它们(如果适用,则传递参数)并观察其输出。如果需要,请提供有关您的语言使用的语法的必要信息,以便我们测试您的提交。

作为输出,您必须提供一个有理数/浮点数/分数,代表您想要的黎曼和。如过去讨论的,只要四舍五入到最接近的1/1000的倍数(例如1.4529999,可以代替1.453),您的输出至少可以精确到小数点后三位,就可以忽略浮点不精确度。

数学规格

  • F保证在一种b之间是连续的(没有跳跃,没有孔,没有垂直渐近线)。

  • 您必须处理三种可能的情况:一种=b(结果应为0或等效值),一种<b一种>b

  • 如果b<一种,则积分会更改其符号。此外,在这种情况下,整体的正义感是朝着一种

  • 图表下方的区域为负,图表上方的区域为正。

示例/测试用例

分辨率不是最佳的,因为我不得不将它们缩小一点,但是它们仍然可读。

  • FX=2X+1个一种=5b=13ñ=4,k =右:

    2x + 1

    结果应该是152+192+232+272=168,由于各矩形的宽度为|b-一种|ñ=2,相应的高度为F7=15F9=19F11=23F13=27

  • FX=X一种=1个b=2.5ñ=3,k =左:

    平方根

    输出应为1.8194792169

  • FX=-3X+4+X25一种=12.5b=2.5ñ=10,k =右:

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

    期望输出值是--4.05-5.45-6.45-7.05-7.25-7.05-6.45-5.45-4.05-2.25=55.5,因为翻转的边界时的积分变化的征兆(b<一种

  • FX=9-4X+2X27一种=0b=15ñ=3,k =左:

    9-4x + 2 / 7x ^ 2

    计算我们的黎曼和,我们得到13.5714285715

  • FX=6一种=1个b=4ñ=2,k =右-输出:18岁

  • FX=X7+165X+1个一种=7b=7ñ=4,k =左-输出:0

  • FX=XX-1个一种=0b=1个ñ=500.385723952885505


3
特别鸣谢:此挑战已发布在沙盒中,在其中收到了user202729AdmBorkBorkLeaky Nun的宝贵反馈。
Xcoder先生17年

我肯定希望这里的解决方案可以帮助许多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先生17年

@Giuseppe不。这里的程序方法比手持计算器的方法还要糟糕。[只是说]
user202729 '17

Answers:


8

R69 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链接现在包括“ left”和“ right”的别名,以方便使用,但它们取右手总和。

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使用taylor系列得出一个合理的函数。

我不是100%肯定这是在SNOBOL中传递黑盒函数的“正确”方法(据我所知,它没有一流的函数),但对我来说似乎是合理的。

我假设假设函数定义为f较短,因为行l可能是

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

但随后它没有作为参数传递,感觉有点像“作弊”。

请注意,TIO链接具有一个:(e)after 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的用法与Guiseppe的解非常相似,k=1for rightk=0for left


f.向量化f其论点?
朱塞佩

@朱塞佩:是的。f.是的元素智能应用f
路加福音




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

Perl 6、65字节

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

在线尝试!

比较简单。唯一的麻烦是处理这种a > b情况,这是通过对输入标志$^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 = left的问题中,它意味着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甚至有dfnss吗?顺便说一下,您可以删除35个字节的第一个父对象
Uriel

APL NARS,37个字符表示它也应该在NARS APL中运行
RosLuP
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.