2022年
5月
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31

setup diary

2007|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|06|08|11|
2015|01|02|03|04|05|06|07|08|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|

2022-05-02 Rとjuliaとrubyとpython

_ 特殊関数

4つの言語の比較の第八弾として特殊関数などの使い方についてまとめてみた.まず,比較的一般的な特殊関数は,以下の表のように使うことができる.
Rjuliarubypython3
導入 julia
using Pkg
Pkg.add("SpecialFunctions")
aptitude install ruby-gsl aptitude install python3-scipy
初期化 using SpecialFunctions require "gsl" from scipy import special
ガンマ関数 gamma(3) gamma(3) Math.gamma(3) special.gamma(3)
ダイガンマ関数 digamma(3) digamma(3) GSL::Sf::psi(3) special.psi(3)
ベッセル関数 besselJ(0.1,1) besselj(1,0.1) GSL::Sf::bessel_Jn(1,0.1) special.jv(1,0.1)
次に,多項式で表される特殊関数は,例えば以下のように使うことができる.
Rjuliarubypython3
導入 aptitude install r-cran-polynom
R
install.packages("orthopolynom")
julia
using Pkg
Pkg.add("SpecialPolynomials")
aptitude install ruby-gsl aptitude install python3-scipy
初期化 library(polynom);library(orthopolynom) using SpecialPolynomials require "gsl" from scipy import special
エルミート多項式 predict(hermite.h.polynomials(3)[[3]],0.8) basis(Hermite,2)(0.8) GSL::Poly.hermite(2).eval(0.8) special.hermite(2)(0.8)
さらに特殊な関数の例として,Wigner Symbolは以下のように使う.
Rjuliarubypython3
導入 aptitude install r-cran-gsl julia
using Pkg
Pkg.add("WignerSymbols")
aptitude install ruby-gsl aptitude install python3-sympy
初期化 library(gsl) using WignerSymbols require "gsl" from sympy.physics.wigner import wigner_3j
厳密 wigner3j(0.5,1,1.5,0.5,0,-0.5) wigner_3j(0.5,1,1.5,0.5,0,-0.5)
浮動小数 coupling_3j(1,2,3,1,0,-1) wigner3j(Float64,0.5,1,1.5,0.5,0,-0.5) GSL::Sf::coupling_3j(1,2,3,1,0,-1) float(wigner_3j(0.5,1,1.5,0.5,0,-0.5))
rubyはすべてgslから使うことが出来るのに対して,他の言語ではいくつかのライブラリなどを使い分けないといけないのが,面倒である.また,Rやjuliaでは,多項式の取り扱い方が,少し特殊な感じである.という訳で,使いやすさはruby,python,R,juliaという順かな.

2022-05-13 Rとjuliaとrubyとpython

_ 行列の取り扱い方

4つの言語の比較の第八弾として,そのきっかけとなった行列の使い方について表にまとめてみた.
Rjuliarubypython3
初期化 using LinearAlgebra require "numo/linalg" import numpy as np
定義 a<-matrix(c(1,3,2,4),2,2) a=[1 2; 3 4] a=Numo::NArray[[1,2],[3,4]] a=np.array([[1,2],[3,4]])
単位行列 b<-diag(2) b=I(2) b=Numo::DFloat.eye(2) b=np.eye(2)
b=np.identity(2)
対角行列 d<-diag(c(1,2)) d=diagm([1,2]) d=Numo::NArray[1,2].diag d=np.diag([1,2])
対角要素 diag(a) diag(a) a.diagonal np.diag(a)
np.diagonal(a)
a.diagonal()
dim(a) size(a) a.shape a.shape
要素 a[1,2] a[1,2] a[0,1] a[0,1]
a[1,] a[1,:] a[0,true] a[0,:]
a[,1] a[:,1] a[true,0] a[:,0]
転置 t(a) transpose(a) a.transpose a.T
a.transpose()
随伴行列 Conj(t(a)) a'
adjoint(a)
a.transpose.conj a.T.conjugate()
sum(diag(a)) tr(a) a.trace a.trace()
行列式 det(a) det(a) Numo::Linalg.det(a) np.linalg.det(a)
a+ba+ba+ba+b
a-ba-ba-ba-b
スカラー倍2*a
a*2
2*a
a*2
2*a
a*2
2*a
a*2
要素毎の積 a*b a.*b a*b a*b
a%*%b a*b Numo::Linalg.matmul(a,b)
a.dot(b)
a@b
np.matmul(a,b)
a.dot(b)
冪乗 Reduce("%*%",replicate(3,a,FALSE)) a^3 Numo::Linalg.matrix_power(a,3) np.linalg.matrix_power(a,3)
逆行列 solve(a) inv(a)
I/a
a\I
Numo::Linalg.inv(a) np.linalg.inv(a)
対角化 eigen(a) eigen(a) Numo::Linalg.eig(a) np.linalg.eig(a)
固有値 eigen(a)$values eigvals(a) Numo::Linalg.eigvals(a) np.linalg.eigvals(a)
固有ベクトル eigen(a)$vectors eigvecs(a) Numo::Linalg.eigvecs(a) np.linalg.eig(a)[1]
インストールの仕方などは,3/7に書いたので,ここでは省略する.こうやってまとめてみると,rubyのMatrixのコマンドと,numo/linalgの行列のコマンドはかなり違う気がする.そこで,同じようなコマンドを使えるようにするために,以下のスクリプトを書いてみた.
module Numo
  class NArray
    alias_method :tr, :trace
    alias_method :t, :transpose
    def determinant()
      Numo::Linalg.det(self)
    end
    alias_method :det, :determinant
    def inverse()
      Numo::Linalg.inv(self)
    end
    alias_method :inv, :inverse
    def eig()
      Numo::Linalg.eig(self)
    end
    alias_method :eigensystem, :eig
    alias_method :eigen, :eigensystem
    class << self
      alias_method :identity, :eye
      alias_method :unit, :identity
      alias_method :I, :identity
    end
  end
end
numoに組み込んでもらえないかな.githubに登録して意見を投稿すれば可能性はあるかも知れないけど,難しいかな.