XLPack 7.0 API の使用法
XLPack APIとは
XLPack API (C/C++インターフェース) はXLPackの数値計算モジュールをExcel以外のプログラムから使用するためのインターフェースです. これを使うと以下のことができます.
- XLPackが使用している数値計算モジュールをC/C++プログラムから呼び出すことができます
- C/C++とインターフェースできるならばその他の言語からも呼び出すことができます. Python, C#については基本機能のインターフェースプログラム例が提供されます
- C/C++についてはXLPack API用のLAPACKE/CBLASライブラリを使用できます
- XLPack APIを使用して作成したプログラムはXLPackをインストールしたパソコンで実行することができます
ご注意
XLPack APIはXLPackの内部インターフェースをありのまま公開するもので, すべての条件下でテストされたものではありません. 従って, これらの機能, 動作, 信頼性等を保証するものではありません. また, 予告なく仕様変更されることがあります. 詳しくはXLPack SDKの添付文書を参照ください.
ソフトウェアのダウンロード
ダウンロードページ を参照ください.
SDKにはプログラミング言語 C/C++, Python, C# を対象としてAPIを使用するために必要なソフトウェアが入っています. SDKに含まれるインターフェースプログラムを使ってC/C++からXLPackの全機能, その他の言語からXLPackの基本機能を呼び出すことができます. 使用例が添付されていますので, それを参考にすれば容易にプログラムを作成することができます.
リファレンスマニュアル
C/C++, Python について以下のリンクよりオンラインマニュアルを参照できます.
C/C++インターフェース
C/C++数値計算ライブラリ リファレンスマニュアル (別タブで開きます)
Python インターフェース
Python数値計算ライブラリ リファレンスマニュアル (基本機能用) (別タブで開きます)
API の使用法
C/C++の場合
C/C++からはSDKに含まれるライブラリをリンクするだけで呼び出すことができます.
Windowsの場合には XLPack.lib (64ビット) または XLPack_32.lib (32ビット)をリンクします.
ヘッダーファイルは cnumlib.h, spcnumlib.h, pdecnumlib.h を使用することができます.
Pythonの場合
Python については XLPack (基本機能) を呼び出すために必要なプログラムが SDK に入っています.
64ビット版では拡張モジュール XLPack.pyd を使用できます. これを使用するためには, 呼び出すスクリプトと同じディレクトリまたは環境変数PYTHONPATHで指定されたディレクトリに置いておきます. Python 3.7 以降で動作するように作成されていますが, 場合によってはうまく動作しないことがあるかもしれません. その場合には XLPack.py (拡張モジュールと同等の動作をするctypes版) を試してみてください.
32ビット版では XLPack.py (ctypes版) を使用してください.
Python拡張モジュールおよびctypes版では行列を表すのにNumpyのndarrayを使用しています. あらかじめNumpyをインストールしておく必要があります.
その他の言語の場合
その他の言語ではDLLを直接呼び出します. インターフェースプログラム例がSDKに入っています.
DLLを直接呼出す場合, 下記の一部の関数を除いてC/C++と同じインターフェースになります(C/C++ライブラリ リファレンスマニュアル参照).
特殊関数とBLAS2, 3 関数のように errnoをセットする一部の関数はC/C++とインターフェースが異なります. 関数名の先頭にxアンダーバー(x_)を付け, 引数の最後にerrnoを付け加えたものになります. 例えば,
func(double a1, double a2)
の場合, 次のように変更されます.
x_func(double a1, double a2, errno_t *xerrno)
xerrnoは正常終了時には0を返しますが, エラーがあればEDOMまたはERANGE(C言語のerrno.hの値)を返します. BLAS 2, 3 関数は一般的な実装ではerrnoを設定しませんが, 拡張機能として引数にエラーがあった場合にはEDOMを設定します.
対象になる関数は以下のとおりです.
errnoを設定する関数の一覧
特殊関数
factorial
ccbrt ccbrt_sub
laguerre alaguerre legendre legendred alegendre sharmonic sharmonic_sub
sharmonicr sharmonici hermite chebt chebtd chebu chebs
gegenbauer gegenbauerd1 gegenbauerd jacobi jacobid1 jacobid2 jacobid
sqrt1pm1 powm1 sin_pi cos_pi cexpm1 cexpm1_sub clog1p clog1p_sub ccot ccot_sub
li ei e1 en spence
ci si chi shi
tgamma1pm1 lgammas rgamma tgammaratio tgammadratio cgamma cgamma_sub clgamma
clgamma_sub crgamma crgamma_sub poch poch1
beta lbeta cbeta cbeta_sub clbeta clbeta_sub
digamma trigamma polygamma cdigamma cdigamma_sub
gammai gammaic gammait gammap gammaq gammapi gammaqi gammapia gammaqia gammapd
betax betaxc ibeta ibetac ibetai ibetaci ibetaia ibetacia ibetaib ibetacib ibetad
zeta
erfi erfci dawson
besj0 besj1 besjn besy0 besy1 besyn besjnu besynu besjnd besjnud besynd besynud
sbesjn sbesyn sbesjnu sbesynu
besi0 besi0e besi1 besi1e besin besk0 besk0e besk1 besk1e beskn besinu besknu
besind besknd besinud besknud sbesin sbeskn sbesinu sbesknu
airyai airybi airyaid airybid
chu hyp1f1 lhyp1f1 hyp1f1r hyp0f1 hyp1f0 hyp2f0 hyppfq
jelli jsn jcn jdn jns jnc jnd jsc jsd jdc jds jcs jcd
jtheta1 jtheta1t jtheta2 jtheta2t jtheta3 jtheta3t jtheta3m1 jtheta3m1t jtheta4 jtheta4t
jtheta4m1 jtheta4m1t
celli1 celli2 celli3 elli1 elli2 elli3 rc rd rg rf rj jzeta hlambda
BLAS 2
dgemv dgbmv dsymv dsbmv dspmv dtrmv dtbmv dtpmv dtrsv dtbsv dtpsv dger dsyr dspr
dsyr2 dspr2
zgemv zgbmv zhemv zhbmv zhpmv zsymv zsbmv zspmv ztrmv ztbmv ztpmv ztrsv ztbsv
ztpsv zgeru zgerc zher zhpr zsyr zspr zher2 zhpr2 zsyr2 zspr2
BLAS 3
dgemm dsymm dtrmm dtrsm dsyrk dsyr2k
zgemm zsymm zhemm ztrmm ztrsm zsyrk zherk zsyr2k zher2k
LAPACKE/CBLASの使用法
C/C++についてはXLPack API用のLAPACKE/CBLASライブラリが添付されています. ライブラリは, 64ビットの場合には Lapacke.lib, 32ビットの場合には Lapacke_32.lib です. ヘッダーファイルは lapacke.h および cblas.h です.
これらのライブラリとヘッダーファイルを使用することにより LAPACKE/CBLAS インターフェース (LAPACK/BLASに含まれる標準Cインターフェース) で LAPACK/BLAS を呼び出すことができます. 各関数の詳細については以下のオリジナルサイトを参照してください.
LAPACKEの説明
LAPACKマニュアル (LAPACKEおよびCBLASを含む)
XLPackに含まれているLapack/BLASの関数に対応する以下のLAPACKEおよびCBLAS関数が使用できます.
LAPACKE/CBLAS関数一覧
(*)は基本機能で使用できるものを示す
cblas_drotg cblas_drotmg cblas_drot cblas_drotm cblas_dswap cblas_dscal
cblas_dcopy cblas_daxpy cblas_ddot cblas_dsdot cblas_dnrm2 cblas_dasum
cblas_idamax
cblas_dgemv cblas_dgbmv cblas_dger cblas_dsbmv cblas_dspmv cblas_dspr
cblas_dspr2 cblas_dsymv cblas_dsyr cblas_dsyr2 cblas_dtbmv cblas_dtbsv
cblas_dtpmv cblas_dtpsv cblas_dtrmv cblas_dtrsv
cblas_dgemm cblas_dsymm cblas_dsyrk cblas_dsyr2k cblas_dtrmm cblas_dtrsm
cblas_zswap cblas_zscal cblas_zdscal cblas_zcopy cblas_zaxpy cblas_zdotu_sub
cblas_zdotc_sub cblas_dznrm2 cblas_dzasum cblas_izamax
cblas_zgemv cblas_zgbmv cblas_zhemv cblas_zhbmv cblas_zhpmv cblas_ztrmv
cblas_ztbmv cblas_ztpmv cblas_ztrsv cblas_ztbsv cblas_ztpsv cblas_zgeru
cblas_zgerc cblas_zher cblas_zher2 cblas_zhpr cblas_zhpr2
cblas_zgemm cblas_zsymm cblas_zhemm cblas_zherk cblas_zher2k cblas_ztrmm
cblas_ztrsm cblas_zsyrk cblas_zsyr2k
LAPACKE_ddisna LAPACKE_dgbcon LAPACKE_dgbsv LAPACKE_dgbsvx LAPACKE_dgbtrf
LAPACKE_dgbtrs LAPACKE_dgebak LAPACKE_dgebal LAPACKE_dgecon(*) LAPACKE_dgees
LAPACKE_dgeesx LAPACKE_dgeev LAPACKE_dgeevx LAPACKE_dgejsv LAPACKE_dgelqf
LAPACKE_dgels(*) LAPACKE_dgelsd LAPACKE_dgelss LAPACKE_dgelsy LAPACKE_dgeqp3
LAPACKE_dgeqrf LAPACKE_dgesdd LAPACKE_dgesv(*) LAPACKE_dgesvd LAPACKE_dgesvdq
LAPACKE_dgesvdx LAPACKE_dgesvx LAPACKE_dgetrf LAPACKE_dgetri LAPACKE_dgetrs
LAPACKE_dgetsls LAPACKE_dgges LAPACKE_dggesx LAPACKE_dggev LAPACKE_dggevx
LAPACKE_dggglm LAPACKE_dgglse LAPACKE_dggsvd3 LAPACKE_dgtcon LAPACKE_dgtsv
LAPACKE_dgtsvx LAPACKE_dgttrf LAPACKE_dgttrs LAPACKE_dhsein LAPACKE_dhseqr
LAPACKE_dlamch(*) LAPACKE_dlange(*) LAPACKE_dlansy(*) LAPACKE_dlantr LAPACKE_dopgtr
LAPACKE_dopmtr LAPACKE_dorghr LAPACKE_dormhr LAPACKE_dorglq LAPACKE_dorgqr
LAPACKE_dorgtr LAPACKE_dormlq LAPACKE_dormqr LAPACKE_dormtr LAPACKE_dpbcon
LAPACKE_dpbsv LAPACKE_dpbsvx LAPACKE_dpbtrf LAPACKE_dpbtrs LAPACKE_dpocon(*)
LAPACKE_dposv(*) LAPACKE_dposvx LAPACKE_dpotrf LAPACKE_dpotri LAPACKE_dpotrs
LAPACKE_dppcon LAPACKE_dppsv LAPACKE_dppsvx LAPACKE_dpptrf LAPACKE_dpptri
LAPACKE_dpptrs LAPACKE_dptcon LAPACKE_dpteqr LAPACKE_dptsv LAPACKE_dptsvx
LAPACKE_dpttrf LAPACKE_dpttrs LAPACKE_dsbev LAPACKE_dsbevd LAPACKE_dsbevx
LAPACKE_dsbgv LAPACKE_dsbgvd LAPACKE_dsbgvx LAPACKE_dsbtrd LAPACKE_dsgesv
LAPACKE_dspcon LAPACKE_dspev LAPACKE_dspevd LAPACKE_dspevx LAPACKE_dspgv
LAPACKE_dspgvd LAPACKE_dspgvx LAPACKE_dsposv LAPACKE_dspsv LAPACKE_dspsvx
LAPACKE_dsptrd LAPACKE_dsptrf LAPACKE_dsptri LAPACKE_dsptrs LAPACKE_dstebz
LAPACKE_dstedc LAPACKE_dstein LAPACKE_dstemr LAPACKE_dsteqr LAPACKE_dsterf
LAPACKE_dstev LAPACKE_dstevd LAPACKE_dstevr LAPACKE_dstevx LAPACKE_dsycon
LAPACKE_dsyev(*) LAPACKE_dsyevd LAPACKE_dsyevr LAPACKE_dsyevx LAPACKE_dsygv
LAPACKE_dsygvd LAPACKE_dsygvx LAPACKE_dsysv LAPACKE_dsysvx LAPACKE_dsytrd
LAPACKE_dsytrf LAPACKE_dsytri LAPACKE_dsytrs LAPACKE_dtbcon LAPACKE_dtbtrs
LAPACKE_dtpcon LAPACKE_dtptri LAPACKE_dtptrs LAPACKE_dtrcon LAPACKE_dtrexc
LAPACKE_dtrsen LAPACKE_dtrsna LAPACKE_dtrsyl LAPACKE_dtrtri LAPACKE_dtrtrs
LAPACKE_dtrttf LAPACKE_dlatms
LAPACKE_slamch
LAPACKE_zcgesv LAPACKE_zcposv LAPACKE_zgbcon LAPACKE_zgbsv LAPACKE_zgbsvx
LAPACKE_zgbtrf LAPACKE_zgbtrs LAPACKE_zgebak LAPACKE_zgebal LAPACKE_zgecon
LAPACKE_zgees LAPACKE_zgeesx LAPACKE_zgeev LAPACKE_zgeevx LAPACKE_zgejsv
LAPACKE_zgelqf LAPACKE_zgels LAPACKE_zgelsd LAPACKE_zgelss LAPACKE_zgelsy
LAPACKE_zgeqp3 LAPACKE_zgeqrf LAPACKE_zgesdd LAPACKE_zgesv LAPACKE_zgesvd
LAPACKE_zgesvdq LAPACKE_zgesvdx LAPACKE_zgesvx LAPACKE_zgetrf LAPACKE_zgetri
LAPACKE_zgetrs LAPACKE_zgetsls LAPACKE_zgges LAPACKE_zggesx LAPACKE_zggev
LAPACKE_zggevx LAPACKE_zggglm LAPACKE_zgglse LAPACKE_zggsvd3 LAPACKE_zgtcon
LAPACKE_zgtsv LAPACKE_zgtsvx LAPACKE_zgttrf LAPACKE_zgttrs LAPACKE_zhbev
LAPACKE_zhbevd LAPACKE_zhbevx LAPACKE_zhbgv LAPACKE_zhbgvd LAPACKE_zhbgvx
LAPACKE_zhbtrd LAPACKE_zhecon LAPACKE_zheev LAPACKE_zheevd LAPACKE_zheevr
LAPACKE_zheevx LAPACKE_zhegv LAPACKE_zhegvd LAPACKE_zhegvx LAPACKE_zhesv
LAPACKE_zhesvx LAPACKE_zhetrd LAPACKE_zhetrf LAPACKE_zhetri LAPACKE_zhetrs
LAPACKE_zhpcon LAPACKE_zhpev LAPACKE_zhpevd LAPACKE_zhpevx LAPACKE_zhpgv
LAPACKE_zhpgvd LAPACKE_zhpgvx LAPACKE_zhpsv LAPACKE_zhpsvx LAPACKE_zhptrd
LAPACKE_zhptrf LAPACKE_zhptri LAPACKE_zhptrs LAPACKE_zhsein LAPACKE_zhseqr
LAPACKE_zlange LAPACKE_zlanhe LAPACKE_zlansy LAPACKE_zlantr LAPACKE_zpbcon
LAPACKE_zpbsv LAPACKE_zpbsvx LAPACKE_zpbtrf LAPACKE_zpbtrs LAPACKE_zpocon
LAPACKE_zposv LAPACKE_zposvx LAPACKE_zpotrf LAPACKE_zpotri LAPACKE_zpotrs
LAPACKE_zppcon LAPACKE_zppsv LAPACKE_zppsvx LAPACKE_zpptrf LAPACKE_zpptri
LAPACKE_zpptrs LAPACKE_zptcon LAPACKE_zpteqr LAPACKE_zptsv LAPACKE_zptsvx
LAPACKE_zpttrf LAPACKE_zpttrs LAPACKE_zspcon LAPACKE_zspsv LAPACKE_zspsvx
LAPACKE_zsptrf LAPACKE_zsptri LAPACKE_zsptrs LAPACKE_zstedc LAPACKE_zstein
LAPACKE_zstemr LAPACKE_zsteqr LAPACKE_zsycon LAPACKE_zsyr LAPACKE_zsysv
LAPACKE_zsysvx LAPACKE_zsytrf LAPACKE_zsytri LAPACKE_zsytrs LAPACKE_ztbcon
LAPACKE_ztbtrs LAPACKE_ztpcon LAPACKE_ztptri LAPACKE_ztptrs LAPACKE_ztpttf
LAPACKE_ztrcon LAPACKE_ztrevc3 LAPACKE_ztrexe LAPACKE_ztrsen LAPACKE_ztrsna
LAPACKE_ztrsyl LAPACKE_ztrtri LAPACKE_ztrtrs LAPACKE_ztrttf LAPACKE_zunghr
LAPACKE_zunglq LAPACKE_zungqr LAPACKE_zungtr LAPACKE_zunmhr LAPACKE_zunmlq
LAPACKE_zunmtr LAPACKE_zunmqr LAPACKE_zupgtr LAPACKE_zupmtr LAPACKE_zlatms
実行時エラーメッセージの出力に関してオリジナルと異なり一部のエラーについてLapacke/CBLASではなく元のLapack/BLASのエラーメッセージが出力されます. その場合, 引数の番号がLapacke/CBLASとは異なる場合があるので読み替えてください.
オリジナルのLAPACKEに含まれていない以下の関数を拡張機能として追加しています.
LAPACKE追加関数一覧
double LAPACKE_dlangb(int matrix_layout, char norm, int n, int kl, int ku, const double *ab, int ldab)
double LAPACKE_dlangt(char norm, int n, const double *dl, const double *d, const double *du)
double LAPACKE_dlansb(int matrix_layout, char norm, char uplo, int n, int k, const double *ab, int ldab)
double LAPACKE_dlansp(int matrix_layout, char norm, char uplo, int n, const double *ap)
double LAPACKE_dlanst(char norm, int n, const double *d, const double *e)
int LAPACKE_dtrevc3(int matrix_layout, char side, char howmny, int* select, int n, const double* t, int ldt, double* vl, int ldvl, double* vr, int ldvr, int mm, int* m)
double LAPACKE_zlangb(int matrix_layout, char norm, int n, int kl, int ku, const doublecomplex *ab, int ldab)
double LAPACKE_zlangt(char norm, int n, const doublecomplex *dl, const doublecomplex *d, const doublecomplex *du)
double LAPACKE_zlanhb(int matrix_layout, char norm, char uplo, int n, int k, const doublecomplex *ab, int ldab)
double LAPACKE_zlanhp(int matrix_layout, char norm, char uplo, int n, const doublecomplex *ap)
double LAPACKE_zlanht(char norm, int n, const double *d, const doublecomplex *e)
double LAPACKE_zlansp(int matrix_layout, char norm, char uplo, int n, const doublecomplex *ap)
int LAPACKE_ztrevc3(int matrix_layout, char side, char howmny, const int* select, int n, doublecomplex* t, int ldt, doublecomplex* vl, int ldvl, doublecomplex* vr, int ldvr, int mm, int* m)
APIの使用例
以下, APIの使用例を示します.
ここでは次の2つの例題 (dgesv と qk15 の使用例) を説明します. その他の関数の使用例についてはSDKに入っているサンプルプログラムを参照ください.
例題(1)
連立一次方程式 Ax = B を解く. ただし, 係数行列A, 右辺行列B および 解x は次のとおり.
( 0.2 -0.11 -0.93 ) ( -0.3727 ) ( 0.86 )
A = ( -0.32 0.81 0.37 ), B = ( 0.4319 ), x = ( 0.64 )
( -0.8 -0.92 -0.29 ) ( -1.4247 ) ( 0.51 )
例題(2)
次の定積分を求める. 厳密解は atan(4) = 1.32581766366803 である.
∫ 1/(1 + x^2) dx [0, 4]
C/C++ 使用例
Cプログラム例 (例題(1), Visual C)
Visual C (Visual Studio (Windows版)) を使用した例です. 行列を列優先(VBAやFortranと同じ, 通常のC/C++の格納順番とは行と列が反対)で格納していることに注意してください. aとbに1次元配列を使います(リファレンスマニュアルは下のClangの例のように可変長2次元配列で表記していますがVisual Cの場合には読み替えてください).
#include <stdio.h>
#include "cnumlib.h"
int main(void)
{
double a[3][3] = {
{ 0.2, -0.32, -0.8 },
{ -0.11, 0.81, -0.92 },
{ -0.93, 0.37, -0.29 } };
double b[] = { -0.3727, 0.4319, -1.4247 };
int n = 3, nrhs = 1, lda = 3, ldb = 3, ipiv[3], info;
dgesv(n, nrhs, lda, (double *)a, ipiv, ldb, b, &info);
printf("x = %f %f %f\n", b[0], b[1], b[2]);
printf("info = %d\n", info);
return 0;
}
実行結果
x = 0.860000 0.640000 0.510000
info = 0
Cプログラム例 (例題(1), Clang)
Clang ではC99の可変長配列が使えるのでaとbには2次元配列を使います.
#include <stdio.h>
#include "cnumlib.h"
int main(void)
{
double a[3][3] = {
{ 0.2, -0.32, -0.8 },
{ -0.11, 0.81, -0.92 },
{ -0.93, 0.37, -0.29 } };
double b[] = { -0.3727, 0.4319, -1.4247 };
int n = 3, nrhs = 1, lda = 3, ldb = 3, ipiv[3], info;
dgesv(n, nrhs, lda, a, ipiv, ldb, (double (*)[ldb])b, &info);
printf("x = %f %f %f\n", b[0], b[1], b[2]);
printf("info = %d\n", info);
return 0;
}
Cプログラム例 (例題(1), LAPACKE 行優先)
LAPACKEでは第1パラメータで行優先の配列を使うことを指定できます. これにより行列の記述を数学表記と同じにすることができます. 内部処理としては, 計算開始前に配列の転置を行い, 計算終了後に再び転置をします. ldb = 1 となっていることに注意してください. これは, aだけでなくbも転置処理を行う仕様になっており, bとしては横ベクトルの入力を期待されているからです.
#include <stdio.h>
#include "lapacke.h"
int main(void)
{
double a[3][3] = {
{ 0.2, -0.11, -0.93 },
{ -0.32, 0.81, 0.37 },
{ -0.8, -0.92, -0.29 } };
double b[] = { -0.3727, 0.4319, -1.4247 };
int n = 3, nrhs = 1, lda = 3, ldb = 1, ipiv[3], info;
info = LAPACKE_dgesv(LAPACK_ROW_MAJOR, n, nrhs, (double *)a, lda, ipiv, b, ldb);
printf("x = %f %f %f\n", b[0], b[1], b[2]);
printf("info = %d\n", info);
return 0;
}
C++プログラム例 (例題(1))
配列 a は Clang の場合でも一次元配列として渡します.
#include <iostream>
#include "cnumlib.h"
using namespace std;
int main(void)
{
double a[3][3] = {
{ 0.2, -0.32, -0.8 },
{ -0.11, 0.81, -0.92 },
{ -0.93, 0.37, -0.29 } };
double b[] = { -0.3727, 0.4319, -1.4247 };
int n = 3, nrhs = 1, lda = 3, ldb = 3, ipiv[3], &info;
dgesv(n, nrhs, lda, (double *)a, ipiv, ldb, b, info);
cout << "x = " << b[0] << ", " << b[1] << ", " << b[2] << endl;
cout << "info = " << info << endl;
return 0;
}
Cプログラム例 (例題(2))
例題(2)ではf(x)の積分をqk15を使って求めます. qk15はf(x)を定義する外部関数を必要とします. 外部関数はCで作成することができ, qk15は必要なときにそれを呼び出します.
#include <stdio.h>
#include "cnumlib.h"
double f(double x)
{
return 1/(1 + x*x);
}
void test_qk15()
{
double a, b, result, abserr, resabs, resasc;
a = 0; b = 4;
qk15(f, a, b, &result, &abserr, &resabs, &resasc);
printf("result = %g, abserr = %g\n", result, abserr);
}
実行結果
result = 1.32582, abserr = 0.00148272
Python 使用例
PythonからXLPackを呼び出すために必要な拡張モジュールがSDKに入っています. これを使うと, 呼び出しプログラムは “import XLPack” と宣言するだけで組込み関数のように簡単にXLPackを呼び出すことができます. 行列を表すためにはNumpyのndarrayを使用します. 係数行列a, 右辺bともに1次元配列でも2次元配列でも使うことができます.
注 – Python 3.8 以降ではDLLのパスを明示的に指定しないとエラーになります. SDKのプログラム例を参照ください.
Pythonプログラム例 (例題(1))
import numpy as np
from XLPack import *
def TestDgesv():
n = 3
a = np.array([
[0.2, -0.32, -0.8],
[-0.11, 0.81, -0.92],
[-0.93, 0.37, -0.29]])
b = np.array([-0.3727, 0.4319, -1.4247])
ipiv = np.empty(n, dtype=int)
info = dgesv(n, a, ipiv, b)
print(b, info)
実行結果
Pythonプログラム例 (例題(2))
例題(2)ではf(x)の積分をqk15を使って求めます. qk15はf(x)を定義する外部関数を必要とします. 外部関数はPythonで作成することができ, qk15は必要なときにそれを呼び出します.
import numpy as np
from XLPack import *
def f(x):
return 1/(1 + x**2)
def TestQk15():
a = 0
b = 4
s, abserr = qk15(f, a, b)
print(s, abserr)
TestQk15()
実行結果
1.3258176613637855 0.0014827239412162237
C# 使用例
C#からXLPackを呼び出すためにはDLLを直接使う必要があります. SDKにはDLLインターフェースプログラム例 xlpack.cs が入っています. これを使うと, 呼び出しプログラムは “using static XLPack;” と宣言するだけでDLLインターフェースの詳細を気にせず組込み関数のように簡単にXLPackを呼び出すことができます. 係数行列aは2次元配列, 右辺行列bは1次元配列を使います.
C#プログラム例 (例題(1))
using System;
using System.IO;
using static XLPack;
public class Test
{
static void Test_dgesv()
{
const int n = 3;
double[,] a =
{{ 0.2, -0.32, -0.8 },
{ -0.11, 0.81, -0.92 },
{ -0.93, 0.37, -0.29 }};
double[] b = { -0.3727, 0.4319, -1.4247 };
int[] ipiv = new int[n];
int info;
dgesv(n, a, ipiv, b, out info);
Console.Write("x = {0} {1} {2}\n", b[0], b[1], b[2]);
Console.Write("info = {0}\n", info);
}
public static int Main(string[] args)
{
Test_dgesv();
return 0;
}
}
実行結果
x = 0.86 0.64 0.51
info = 0
C#プログラム例 (例題(2))
例題(2)ではf(x)の積分をqk15を使って求めます. qk15はf(x)を定義する外部関数を必要とします. 外部関数はC#で作成することができ, qk15は必要なときにそれを呼び出します.
using System;
using System.IO;
using static XLPack;
public class Test
{
static double f_qk15(double x)
{
return 1/(1 + x*x);
}
static void Test_qk15()
{
double a, b, result, abserr;
a = 0; b = 4;
qk15(f_qk15, a, b, out result, out abserr);
Console.Write("result = {0}, abserr = {1}\n", result, abserr);
}
public static int Main(string[] args)
{
Test_qk15();
return 0;
}
}
実行結果
result = 1.32581766136379, abserr = 0.00148272394121622
引用ライブラリおよび参考文献
各リファレンスマニュアルの「総合概要」タブを参照ください.
公開日: 2025/01/03 (更新日: 2025/01/03)