Paket Mathematica.jl
menyediakan antarmuka untuk menggunakan Wolfram Mathematica™ dari bahasa Julia. Anda tidak dapat menggunakan Mathematica.jl
tanpa membeli dan menginstal salinan Mathematica™ dari Wolfram Research. Paket ini tersedia gratis dan sama sekali tidak menggantikan atau mengubah fungsi apa pun dari produk Mathematica Wolfram.
Paket yang disediakan adalah antarmuka Julia tanpa kerumitan ke Mathematica. Hal ini bertujuan untuk mengikuti filosofi Julia dalam menggabungkan ekspresi tingkat tinggi tanpa mengorbankan pengoptimalan tingkat rendah.
Pkg . add ( " Mathematica " )
Asalkan Mathematica terinstal, penggunaannya sesederhana:
using Mathematica
Fibonacci ( 1000 )
#= > 43466557686937456435688527675040625802564660517371780402481729089536555417949051890403879840079255169295922593080322634775209689623239873322471161642996440906533187938298969649928516003704476137795166849228875
Semua fungsi Mathematica tersedia sebagai fungsi dan makro, dan penyambungan ( $
) berfungsi seperti yang Anda harapkan:
Integrate (:(x ^ 2 ), :x ) # or
@Integrate (x ^ 2 , x)
#= > :(*(1//3,^(x,3)))
@Integrate(log(x), {x,0,2})
#= > :(+(-2,log(4)))
eval(ans) # or
@N($ans) # or
N(ans) # or
@N(Integrate(log(x), {x,0,2}))
#= > -0.6137056388801094
Termasuk yang mengembalikan data Mathematica:
@Plot (x ^ 2 , {x, 0 , 2 })
#= > Graphics[{{{},{},{Hue[0.67, 0.6, 0.6],Line[{{4.081632653061224e-8,1.6659725114535607e-15},...}]}}}, {:AspectRatio->Power[:GoldenRatio, -1],:Axes->true, ...}]
Data matematika dapat berpartisipasi dalam fungsi Julia secara langsung, tanpa memerlukan penggabungan. Misalnya -
using MathLink
d = BinomialDistribution ( 10 , 0.2 ) #= > BinomialDistribution[10, 0.2]
probability(b::MExpr{:BinomialDistribution}) = b.args[2]
probability(d) #= > 0.2
Data yang kompatibel dengan Julia (misalnya daftar, bilangan kompleks, dll.) semuanya akan dikonversi secara otomatis, dan Anda dapat memperluas konversi ke jenis lainnya.
Perhatikan bahwa ekspresi Mathematica tidak dikonversi ke ekspresi Julia secara default. Fungsi/makro dengan petunjuk ::Expr
(lihat di bawah) akan mengonversi hasilnya, tetapi untuk yang lain Anda harus menggunakan convert
atau MathLink.to_expr
.
Log ( - 1 ) #= > Times[0 + 1im, :Pi]
convert(Expr, ans) #= > :(*(0 + 1im,Pi))
N(Log(-1)) #= > 0.0 + 3.141592653589793im
Pencetakan dan peringatan juga didukung:
Print ( " hi " )
#= > hi
@Print(x^2/3)
#= > 2
# x
# --
# 3
Binomial(10)
#= > WARNING: Binomial::argr: Binomial called with 1 argument; 2 arguments are expected.
#= > Binomial[10]
Yang terakhir tentu saja:
WolframAlpha ( " hi " ) #= >
2-element Array{Any,1}:
{{"Input",1},"Plaintext"}->"Hello."
{{"Result",1},"Plaintext"}->"Hello, human."
Dalam file Mathematica.jl
, Anda akan melihat daftar fungsi dan spesifikasi makro, masing-masing dalam salah satu format berikut:
Function :: ReturnType # or
Function (Arg1Type, Arg2Type, ... ) :: ReturnType # (functions only)
Misalnya:
Integrate :: Expr
RandomReal (Number) :: Float64
RandomReal (Number, Integer) :: Vector{Float64}
Petunjuk tipe pengembalian di sini adalah optimasi; ini memungkinkan MathLink.jl
mengambil nilai dari Mathematica tanpa terlebih dahulu melakukan pemeriksaan tipe, dan membuat tipe fungsi stabil - misalnya, RandomReal(10, 5)
akan mengembalikan array Any
jika bukan karena definisi ini. Tipe argumen memungkinkan pemeriksaan tipe dan beberapa definisi.
Belum banyak fungsi yang memiliki tanda tangan tipe, jadi menyediakannya untuk fungsi yang ingin Anda gunakan adalah cara mudah untuk berkontribusi.
Ekspresi data Mathematica Head[x,y,z,...]
direpresentasikan dalam Julia sebagai MExpr{:Head}(args = {x,y,z,...})
. Kita dapat memperluas Mathematica.jl
untuk mendukung tipe khusus dengan membebani MathLink.to_mma
dan MathLink.from_mma
secara berlebihan.
Misalnya, kita dapat meneruskan Julia Dict langsung ke Mathematica hanya dengan dua baris definisi:
using MathLink; import MathLink : to_mma, from_mma
d = [ :a => 1 , :b => 2 ]
to_mma (d :: Dict ) = MExpr {:Dict} ( map (x -> MExpr ( :Rule , x[ 1 ], x[ 2 ]),d))
Identity (d) #= > Dict[:b->2, :a->1]
from_mma(d::MExpr{:Dict}) = Dict(map(x->x.args[1], d.args), map(x->x.args[2], d.args))
Identity(d) #= > {:b=>2,:a=>1}
using Mathematica
Ini akan berfungsi selama math
ada di jalurnya (biasanya berlaku di linux). Mathematica.jl
juga akan mencari math.exe
di Windows, yang seharusnya berfungsi untuk Mathematica versi 8 atau 9 yang diinstal di lokasi default. Jika tidak berhasil untuk Anda, buka masalah (khususnya saya tidak tahu bagaimana perilakunya di Mac).