Jumlah Riemann kiri dan kanan adalah perkiraan untuk integral tertentu . Tentu saja, dalam matematika kita harus sangat akurat, jadi kita bertujuan untuk menghitungnya dengan sejumlah subdivisi yang mendekati tak terhingga, tetapi itu tidak diperlukan untuk keperluan tantangan ini. Anda sebaiknya mencoba menulis program terpendek, mengambil input dan memberikan output melalui salah satu metode default , dalam bahasa pemrograman apa pun , yang melakukan hal berikut:
Tugas
Diberikan dua bilangan rasional dan (batas integral integral), bilangan bulat positif , boolean mewakili fungsi kiri / kanan dan kotak hitam , menghitung jumlah Riemann kiri atau kanan (tergantung pada ) dari , menggunakan subdivisi yang sama .
I / O Spesifikasi
dan dapat berupa angka atau pecahan rasional / floating-point.
dapat diwakili oleh dua nilai berbeda dan konsisten, tetapi harap diingat bahwa Anda tidak diizinkan untuk mengambil fungsi lengkap atau parsial sebagai input.
adalah fungsi kotak hitam. Mengutip jawaban meta yang ditautkan di atas, konten (yaitu kode) dari fungsi kotak-hitam mungkin tidak dapat diakses, Anda hanya dapat memanggil mereka (melewati argumen jika ada) dan mengamati hasilnya . Jika perlu, harap sertakan informasi yang diperlukan tentang sintaksis yang digunakan bahasa Anda sehingga kami dapat menguji kiriman Anda.
Sebagai output, Anda harus memberikan fraksi / floating-point / rasional yang mewakili jumlah Riemann yang Anda minta. Seperti dibahas di masa lalu , ketidaktepatan floating-point dapat diabaikan, selama output Anda akurat untuk setidaknya tiga tempat desimal ketika dibulatkan ke kelipatan terdekat 1/1000 (mis. Baik 1.4529999
-baik saja alih-alih 1.453
).
Spesifikasi Matematika
dijamin kontinu antara dan (tidak ada lompatan, tidak ada lubang, tidak ada asimtot vertikal).
Ada tiga kemungkinan kasus yang harus Anda tangani: (Hasilnya harus atau yang setara), atau .
Jika , integral mengubah tandanya. Juga, pengertian yang tepat dari integral dalam hal ini adalah menuju .
Area di bawah grafik negatif dan yang di atas grafik positif.
Contoh / Kasus Uji
Resolusi tidak optimal, karena saya harus menyusutkannya sedikit, tetapi masih dapat dibaca.
, k = benar:
Hasilnya harus , karena lebar setiap persegi adalah dan ketinggian yang sesuai adalah .
, k = kiri:
Outputnya harus .
, k = benar:
Nilai output yang diharapkan adalah , karena integral berubah tanda ketika membalik batas ( ) .
, k = kiri:
Menghitung jumlah Riemann kami, kami mendapatkan .
, k = kanan - Output: .
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.
Sekarang f (x) adalah kotak hitam mengapa itu penting?Jawaban:
R ,
69656357 byteCobalah online!
Diperlukan
k=FALSE
untuk jumlah kanan, meskipun tautan TIO sekarang menyertakan alias untuk "kiri" dan "kanan" untuk kemudahan penggunaan.a+w*(1:n-k)
menghasilkan poin kiri atau kanan yang tepat.Kemudian
sapply
berlakuf
untuk setiap elemen hasil, yang kemudian kitasum
naik dan kalikan dengan lebar interval(b-a)/n
untuk menghasilkan hasilnya. Yang terakhir ini juga dengan rapi menangani masalah tanda yang mungkin kita miliki.sumber
SNOBOL4 (CSNOBOL4) , 127 byte
Cobalah online!
Dengan asumsi bahwa fungsi
p
tersebut didefinisikan di suatu tempat, ini membutuhkana,b,n,k,(name of p)
, dengank=0
untuk kanan danl=1
kiri.catspaw ini
SNOBOL4+
mendukungREAL
s tetapi tidak memiliki builtin fungsi trigonometri. Namun, saya kira orang bisa datang dengansin
fungsi yang masuk akal menggunakan seri taylor.Saya tidak 100% yakin ini adalah cara "benar" untuk melewatkan fungsi kotak hitam di SNOBOL (yang, sepengetahuan saya, tidak memiliki fungsi kelas satu), tetapi tampaknya masuk akal bagi saya.
Saya mengira bahwa dengan asumsi fungsi didefinisikan sebagai
f
akan lebih pendek, seperti garisl
bisatapi kemudian itu tidak disahkan sebagai argumen, yang terasa agak seperti "curang".
Perhatikan bahwa tautan TIO memiliki pernyataan
:(e)
setelahnyaDEFINE
, sehingga kode tersebut akan benar-benar berjalan dengan benar.sumber
Julia 0,6 , 50 byte
Cobalah online!
Rentang yang dinormalkan dibangun, dikumpulkan ke dalam vektor dan kemudian diskalakan. Mengumpulkan rentang ke dalam vektor menggunakan
[X...]
perlu untuk menghindariinexact error
ketika mengalikan rentang secara langsung dengan 0 saata=b
. Demikian pula, membangun rentang secara langsung dengan:
ataurange()
tidak mungkin kapana=b
.Penggunaan k sangat mirip dengan solusi Guiseppe , dengan
k=1
untukright
dank=0
untukleft
.sumber
f.
meng-vektorisasif
argumennya?f.
adalah aplikasi elemen-bijaksanaf
.Haskell ,
7367 byteTerima kasih kepada H.PWiz dan Bruce Forte untuk tipsnya!
Cobalah online!
Solusi yang sangat mudah.
k
adalah0
untuk kiri dan1
hak.sumber
b
Python 2 ,
9994 byteSedikit solusi naif.
Cobalah online!
sumber
JavaScript (Node.js) ,
737159 byteCobalah online!
sumber
Jelly , 21 byte
Cobalah online!
Ambil
a,b
dari argumen, dandari stdin.
Jika Anda tidak terbiasa dengan Jelly, Anda dapat menggunakan Python untuk menulis fungsi kotak hitam
f
:f (x) = 2x + 1 ; a = 5; b = 13; n = 4; k = benar
f (x) = √x ; a = 1; b = 2.5; n = 3; k = kiri
f (x) = -3x + 4 + 1/5 * x 2 ; a = 12.5; b = 2.5; n = 10; k = benar
f (x) = 9 - 4x + 2/7 * x 2 ; a = 0; b = 15; n = 3; k = kiri
f (x) = 6 ; a = 1; b = 4; n = 2; k = benar
f (x) = x * sin (1 / x) ; a = 0; b = 1; n = 50; k = benar
Penjelasan:
sumber
Perl 6 , 65 byte
Cobalah online!
Relatif mudah. Satu-satunya komplikasi adalah menangani
a > b
case, yang saya lakukan dengan xor-ing flag input$^k
dengan0 > d
, yang membalik kapana > b
.sumber
APL (Dyalog Classic) , 37 byte
Cobalah online!
APL NARS, 37 karakter
Fungsi memiliki argumen di sebelah kiri fungsi, di argumen numerik kanan abnormal k. Dalam pertanyaan k = ditinggalkan di sini artinya k = ¯1; k = di sini artinya k = 0. Uji:
sumber