リーマン和を使用した近似定積分


19

左右のリーマン和定積分の近似です。もちろん、数学では非常に正確である必要があるため、無限に近づくいくつかの細分化で計算することを目指していますが、この課題の目的には必要ありません。代わりに、入力を取り、のいずれかを介して出力を提供し、最短プログラムを書くしようとする必要があり、デフォルトの方法いずれかで、プログラミング言語、次の処理を行い、:

仕事

2つの有理数および(定積分の限界)、正の整数、左/右を表すブール値およびブラックボックス関数与え、の左または右のリーマン和(依存)を計算します等しいサブディビジョンを使用します。abnkF K B、F X D X N fkabf(x)dxn

I / O仕様

  • aおよびは、有理数/浮動小数点数または小数にすることができます。 b

  • kは2つの異なる一貫した値で表すことができますが、入力として完全または部分的な関数を使用することは許可さていないことに注意してください。

  • fはブラックボックス関数です。上記のメタ回答を引用すると、ブラックボックス関数のコンテンツ(コードなど)にアクセスできず、それらを呼び出し(該当する場合は引数を渡す)、出力を観察することしかできません。必要に応じて、提出をテストできるように、言語で使用する構文に関する必要な情報を含めてください。

出力として、要求されたリーマン和を表す有理数/浮動小数点数/分数を提供する必要があります。過去に検討し、浮動小数点の不正確さがある限り1000分の1の最も近い倍数に丸めたときに、あなたの出力は、少なくとも3桁まで正確であると(例えば、無視することができる1.4529999のではなく、結構です1.453)。

数学仕様

  • fはと間で連続することが保証されています(ジャンプ、穴、垂直漸近線はありません)。ab

  • 対処しなければならない3つのケースがあります:(結果はまたは同等のもの)、またはです。a=b0a<ba>b

  • 場合、積分はその符号を変えます。また、この場合の積分の正しい意味はに向かっます。b<aa

  • グラフの下の領域は負で、グラフの上の領域は正です。

例/テストケース

私はそれらを少し縮小しなければならなかったので、解像度は最適ではありませんが、それらはまだ読みやすいです。

  • f(x)=2x+1,a=5,b=13,n=4、k =右:

    2x + 1

    結果はになります。各長方形の幅はあり、対応する高さはです。152+192+232+272=168|ba|n=2f(7)=15,f(9)=19,f(11)=23,f(13)=27

  • f(x)=x,a=1,b=2.5,n=3、k =左:

    平方根

    出力はます。1.8194792169

  • f(x)=3x+4+x25,a=12.5,b=2.5,n=10、k = right:

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

    期待される出力値は。これは、境界を反転すると積分が符号を変更するためです(4.055.456.457.057.257.056.455.454.052.25)=55.5b<a

  • f(x)=94x+2x27,a=0,b=15,n=3、k =左:

    9-4x + 2 / 7x ^ 2

    リーマンの合計を計算すると、得られ。13.5714285715

  • f(x)=6,a=1,b=4,n=2、k = right —出力:。18

  • f(x)=x7+165x+1,a=7,b=7,n=4、k = left —出力:。0

  • f(x)=xsin(x1),a=0,b=1,n=50、K =右-出力:。ここでは、サインはラジアンを使用しますが、代わりに自由に角度を使用してください。0.385723952885505


3
特別な感謝:このチャレンジはSandboxに投稿され、user202729AdmBorkBork、およびLeaky Nunから貴重なフィードバックを受け取りました
ミスターXcoder

ここでの解決策は、CalcのIの学生の多くの年分を助け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

@Giuseppeいいえ。ここでのプログラムの方法は、ハンドヘルド電卓の方法よりもさらに劣っています。[ちょうど言っ]
user202729

回答:


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=FALSETIOリンクには、使いやすさのために「左」と「右」のエイリアスが含まれるようになりましたが、右側の合計を取ります。

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+REALsをサポートしていますが、組み込みのトリガー関数はありません。ただし、sinテイラーシリーズを使用して合理的な機能を考え出すことができると思います。

これがSNOBOLでブラックボックス関数を渡す「正しい」方法であるとは100%確信していません(私の知る限り、これには一流の関数はありません)。

私は、関数がfより短くなるように定義されていると仮定すると、線l

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

しかし、それは引数として渡されません。これは「不正行為」のように感じられます。

TIOリンクにはステートメントの:(e)後にある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

標準入力から。


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`.



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 Dyalog APLクラシックではリンクをたどる37バイトです。ナーズAPLのための可能性が35x2バイト...
RosLuP

それでは、なぜNARSと書くのですか?NARSにはdfnssもありますか?ところで、あなたは35バイトのための最初の両親をドロップすることができます
ウリエル

APL NARS、それはあまりにもNARS APLで実行する必要があります37の文字の手段
RosLuP
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.