Riemann toplamlarını kullanarak yaklaşık belirli integraller


19

Sol ve sağ Riemann toplamları belirli integrallerin yaklaşıklarıdır . Tabii ki, matematikte çok doğru olmalıyız, bu yüzden onları sonsuzluğa yaklaşan bir dizi alt bölümle hesaplamayı hedefliyoruz, ancak bu meydan okuma için bu gerekli değildir. Bunun yerine, en kısa programı yazmaya çalışın, varsayılan yöntemlerden herhangi birini kullanarak herhangi bir programlama dilinde giriş yapın ve çıktı sağlayın :

Görev

İki rasyonel sayı bir ve (belirli integralin sınırları), pozitif bir tamsayı , sol / sağı temsil eden bir boole ve bir kara kutu fonksiyonu verildiğinde, sol veya sağ Riemann toplamını ( bağlı olarak ) eşit alt bölüm kullanarak .bnk fkbirbf(x)dxn

I / O Özellikleri

  • bir ve rasyonel / kayan nokta sayıları veya kesirleri olabilir. b

  • k iki farklı ve tutarlı değerle temsil edilebilir, ancak girdi olarak tam veya kısmi işlevler almanıza izin verilmediğini lütfen unutmayın .

  • f bir kara kutu işlevidir. Yukarıda bağlantılı olan meta cevaba bakarak, kara kutu işlevlerinin içeriğine (yani koduna) erişilemeyebilir, sadece onları çağırabilirsiniz (varsa argümanları iletebilirsiniz) ve çıktılarını gözlemleyebilirsiniz . Gerekirse, lütfen dilinizi kullandığı sözdizimi hakkında gerekli bilgileri ekleyin, böylece gönderiminizi test edebiliriz.

Çıktı olarak, sizden istenen Riemann toplamını temsil eden rasyonel / kayan nokta / kesir sağlamalısınız. Gibi geçmişte tartışılan , kayan nokta belirsizlik olduğu sürece 1/1000 en yakın katına yuvarlanmış zaman çıkış en az üç ondalık basamağa kadar hassas olduğu için (örneğin, göz ardı edilebilir 1.4529999yerine gayet 1.453).

Matematik Özellikleri

  • f ve arasında sürekli olduğu garanti edilir (atlama yok, delik yok, dikey asimptot yok).birb

  • Ele almanız gereken üç olası durum vardır: (Sonuç veya eşdeğerleri olmalıdır), veya .bir=b0bir<bbir>b

  • Eğer ise, integral işaretini değiştirir. Ayrıca, bu durumda integralin doğru duygusu .b<birbir

  • Grafiğin altındaki alanlar negatif ve grafiğin üzerindeki alanlar pozitiftir.

Örnekler / Test Örnekleri

Çözünürlük uygun değil, çünkü onları biraz küçültmek zorunda kaldım, ancak yine de okunabilirler.

  • f(x)=2x+1,bir=5,b=13,n=4 , k = sağ:

    2x + 1

    Sonuç , çünkü her dikdörtgenin genişliği ve buna karşılık gelen yükseklikler .152+192+232+272=168|b-bir|n=2f(7)=15,f(9)=19,f(11)=23,f(13)=27

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

    Kare kök

    Çıktı olmalıdır .1.8194792169

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

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

    Beklenen çıktı değeri , çünkü sınırlar çevrilirken integral değişiyor ( ) .(4.055.456.457.057.257.056.455.454.052.25)=55.5b<bir

  • f(x)=94x+2x27,bir=0,b=15,n=3 , k = sol:

    9-4X + 2 / 7x ^ 2

    Riemann toplamımızı hesaplarken .13,5714285715

  • f(x)=6,bir=1,b=4,n=2 , k = sağ - Çıktı: .18

  • f(x)=x7+165x+1,bir=7,b=7,n=4 , k = sol - Çıktı: .0

  • f(x)=xgünah(x-1),bir=0,b=1,n=50 , k = sağ - Çıktı: . Sinüsün burada radyan kullandığını, ancak bunun yerine derece kullanmaktan çekinmeyin.,385723952885505


3
Özel teşekkürler: Bu zorluk gönderilmiş olan Sandbox bu değerli geri bildirimler aldık, user202729 , AdmBorkBork ve Çatlak Rahibe .
Bay Xcoder

Umarım buradaki çözümler yıllarca Calc I öğrencilerine yardımcı olur ...
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.Şimdi bu f (x) bir kara kutu, neden önemli?
l4m2

@ l4m2 Çok önemli değil, sadece insanların bu tür şeyler için endişelenmemeleri gerektiğini bildirmek istedim.
Bay Xcoder

Buradaki programların yöntemleri elde hesap makinelerinin yöntemlerinden bile daha kötüdür. [just
say

Yanıtlar:


8

R , 69 65 63 57 bayt

function(a,b,n,k,f,w=(b-a)/n)sum(sapply(a+w*(1:n-k),f))*w

Çevrimiçi deneyin!

Alır k=FALSETIO bağlantısı artık kullanım kolaylığı için "sol" ve "sağ" için takma adlar içermesine rağmen, sağ meblağlar için.

a+w*(1:n-k) uygun sol veya sağ el noktaları oluşturur.

Sonra , sonucun elde edilmesi için aralığın genişliği ile yukarı ve çarptığımız sonucun her bir öğesi için sapplygeçerlidir . Bu sonuncusu, olabilecek herhangi bir işaret sorununu da özenle halleder.fsum(b-a)/n


4

SNOBOL4 (CSNOBOL4) , 127 bayt

	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)

Çevrimiçi deneyin!

Fonksiyon olduğunu varsayarsak p, bir yerlerde tanımlanan bu alır a,b,n,k,(name of p)ile, k=0sağ ve l=1sol için.

catspaw'ın SNOBOL4+destekleri vardır REALancak yerleşik tetikleme işlevleri yoktur. Ancak, sinbir taylor serisi kullanarak makul bir işlev ortaya çıkabilir sanırım .

Bu% 100 emin değilim bu SNOBOL bir kara kutu işlevini geçmek için "doğru" yolu (ki, bence, birinci sınıf işlevleri yoktur), ama bana makul-ish görünüyor.

Sanırım fonksiyonun, fhat lolabileceğinden daha kısa olarak tanımlandığını varsayarsak

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

ama sonra bir argüman olarak kabul edilmez, ki bu biraz “hile” gibi hissedilir.

TIO bağlantısının bir deyimden :(e)sonra DEFINEolduğunu ve kodun gerçekten düzgün çalışacağını unutmayın.


4

Julia 0.6 , 50 bayt

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

Çevrimiçi deneyin!

Normalize edilmiş bir aralık oluşturulur, bir vektör halinde toplanır ve daha sonra ölçeklendirilir. Aralığı doğrudan 0 ile çarparken [X...]kaçınmaktan kaçınmak için aralığı kullanarak bir vektör içine toplamak gerekir . Benzer şekilde, doğrudan veya ile bir aralık oluşturmak ne zaman mümkün değildir .inexact errora=b:range()a=b

K kullanımı, for ve for ile Guiseppe çözümüne çok benzer .k=1rightk=0left


f.fargüman (ları) üzerinden vektörize olur mu?
Giuseppe

@Giuseppe: Kesinlikle. f.öğesinin bilge uygulamasıdır f.
LukeS




1

Jöle , 21 bayt

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

Çevrimiçi deneyin!

a,bTartışmalardan alın ve

n
right
f

stdin'den.


Jelly'e aşina değilseniz, kara kutu işlevini yazmak için Python'u kullanabilirsiniz f:

f (x) = 2x + 1 ; a = 5; b = 13; n = 4; k = doğru

f (x) = √x ; a = 1; b = 2.5; n = 3; k = sol

f (x) = -3x + 4 + 1/5 * x 2 ; a = 12.5; b = 2.5; n = 10; k = doğru

f (x) = 9-4x + 2/7 * x 2 ; a = 0; b = 15; n = 3; k = sol

f (x) = 6 ; a = 1; b = 4; n = 2; k = doğru

f (x) = x * günah (1 / x) ; a = 0; b = 1; n = 50; k = doğru


Açıklama:


ƓḶ+Ɠ÷     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 bayt

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

Çevrimiçi deneyin!

Nispeten açıktır. Sadece komplikasyon işleyen a > bben xor-ing giriş bayrağı ile yapmak durumda, $^kile 0 > d, hangi zaman tersine döndüğü o a > b.


0

APL (Dyalog Klasik) , 37 bayt

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

Çevrimiçi deneyin!

APL NARS, 37 karakter

İşlevin solunda işlev, sağ sayısal abn k'de bağımsız değişken bulunur. Burada bırakılan k = sorusunda k = ¯1; k = burada k = 0 anlamına gelir. Ölçek:

  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

Gönderiler karakter değil, bayt olarak sayılır. NARS özel bir kod sayfası (bu yüzden de 37 bayt olurdu) veya UTF16 kullanır hatırlamıyorum.
Uriel

@ Uriel Dyalog APL klasik 37 bayt bağlantıyı takip eder; Nars Apl için muhtemelen 35x2 bayt ...
RosLuP

Öyleyse neden NARS olarak yazıyorsun? NARS'ın dfnss'si bile var mı? Bu arada ilk ebeveynleri 35 bayt için bırakabilirsiniz
Uriel

APL NARS, 37 karakter,
NARS APL'de
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.