imsl ライブラリ 利用者向け講習会 - my.fit.ac.jp · • imsl cライブラリv6.0 –...
TRANSCRIPT
IMSL ライブラリ
利用者向け講習会
2007年 10月19日寺内 和也 [email protected]須賀 恵美子 [email protected]
日本ビジュアルニューメリックス㈱
福岡工業大学
2
www.vnij.com
目 次
• ビジュアルニューメリックス社概要• IMSL ライブラリの概要
• IMSL Fortranライブラリ v5.0– 環境– IMSL Fortranライブラリの仕様
– サポートリソース• Fortran ライブラリの各章概要• IMSL Fortranライブラリの並列処理と性
能
• IMSL Cライブラリ v6.0– 環境– IMSL Cライブラリの仕様
– サポートリソース• IMSL Cライブラリの各章概要
• 今後のリリース予定 (Fortran v6.0)
• 添付資料
– IMSL Fortranの行列格納方法– IMSL C の行列格納方法
3
www.vnij.comビジュアルニューメリックス社(VNI)
創立35周年
【沿革】1970年 IMSL, Inc. (Texas, USA) 設立1980年 Precision Visuals, Inc. (Colorado, USA) 設立1991年 日本IMSL株式会社設立1993年 IMSL, Inc. とPrecision Visuals, Inc. の合併により、
Visual Numerics, Inc. 並びに日本ビジュアルニューメリックス株式会社に社名変更
【グローバルネットワーク】米国(テキサス、コロラド)、メキシコ英国、ドイツ、フランス、オランダ、中国、台湾、韓国、日本その他世界60ヶ国に販売代理店
4
www.vnij.comVNI製品(一覧)65ヵ国50万人のユーザ
数値計算・統計解析ライブラリ
• IMSL Fortran ライブラリ Fortran90対応
• IMSL C ライブラリ C/C++言語対応
• IMSL C# ライブラリ MS C# .NET Framework対応
• JMSL ライブラリ JavaTM
対応
データ解析・可視化ソフトウェア
VDA (Visual Data Analysis)
• PV-WAVEデスクトップVDAアプリケーション構築言語
• JWAVEWebベースのVDAアプリケーション構築言語及び
コンポーネント
• TS-WAVE 時系列解析アプリケーション
IMSL ライブラリの概要(International Mathematical & Statistical Libraries)
6
www.vnij.com Fortran, C/C++, C#, Java 用の数値計算・統計解析ライブラリ
• 各言語で100%作成されたライブラリ
• 数値計算・特殊関数・統計解析ルーチンを包括
• 信頼性・安定性の高いアルゴリズム
• 新の高度なアルゴリズムの採用
• 使いやすい関数名・ドキュメント
• 35年、世界65ヵ国、50万人のユーザ
• パソコンからスーパーコンピュータまで幅広いプラットフォームに対応
7
www.vnij.com IMSLライブラリの信頼性の検証
【平均値の計算】
ADATA(500000)
配列 データ
1 0.000001
2 0.000002
3 0.000003
・・・ ・・・
249999 0.249999
250000 0.250000
250001 10000.000000
250002 20000.000000
・・・ ・・・
499999 2499990000.000000
500000 2500000000.000000
BDATA(500000)
配列 データ
1 0.000001
2 2500000000.000000
3 0.000002
4 2499990000.000000
5 0.000003
6 2499980000.000000
・・・ ・・・
499997 0.249999
499998 20000.000000
499999 0.250000
500000 10000.000000
8
www.vnij.com IMSLライブラリの信頼性の検証
【平均値の計算】
配列番号の1から順に合計し平均値を倍精度で計算
・ADATAの平均値= 62502500.06250024
・BDATAの平均値= 62502500.06254053
【データの合計する順番で結果が異なる】
DO 100 I=1,500000TOTAL = TOTAL + DATA(I)
100 CONTINUEAVERAGE = TOTAL / 500000.
9
www.vnij.com IMSLライブラリの信頼性の検証
【平均値の計算】
IMSL Fortran ライブラリの UVSTAルーチン で
求めた平均値
・ADATAの平均値= 62502500.06250024・BDATAの平均値= 62502500.06250024
IMSLはどのようなデータでも正しい解を提供
10
www.vnij.com
IMSL とベンダーライブラリの関係
ユーザアプリケーション
IMSL ライブラリ
数値計算・統計解析の高度な関数
ベンダーライブラリ IMSL ライブラリBLAS 基本的な数値計算関数
ハードウェア
IMSLはハードウェアに特化されたベンダーライブラリ
を利用して高い性能を得ることが出来る。
IMSL Fortran ライブラリの概要
12
www.vnij.com
IMSL Fortranライブラリ概要(1/3)
• リリースの履歴– 1971年 F66版ファーストリリース
– 1987年 F77対応
– 1994年 F90対応
– 1998年 MPIサポート
– 2002年 OpenMPサポート
• ルーチン数 1000以上
• 各ルーチンに単精度版と倍精度版
• Fortran77インターフェースとFortran90インター
フェース
• 完全な上位互換
13
www.vnij.com
IMSL Fortranライブラリ概要(2/3)
• 全ルーチンにオプション引数
• ルーチン名、マトリックス、変数、パラメータの共通規則
• システム環境変数の使用 (エラーメッセージの参照、コマンドラインの実行、ライセンス管理など)
• モジュールファイルによるコンパイル時の引数チェック
• 単一パッケージ– F77、F90およびパラレルルーチンが単一製品に
14
www.vnij.com
IMSL Fortran ライブラリ概要(3/3)
• OpenMP並列サポート– 線形方程式、マトリックス演算、固有値解析、
高速フーリエ変換など• MPI並列サポート
– MPI(Message Passing Interface)による並列化
– 線形方程式、固有値解析、高速フーリエ変換など
• BLAS(Basic Linear Algebra Subprograms)– IMSLのBLASとベンダーBLASの切り替え
• ScaLAPACK ユーティリティ
IMSL Fortran ライブラリの使い方
16
www.vnij.com
IMSL Fortranの環境設定
環境設定はUNIX・Linuxの各OSで共通
• C シェルユーザ
Source /usr/local/imsl/imsl.csh• BシェルまたはKシェルユーザ
. /usr/local/imsl/imsl.sh• 環境変数の設定は、対話型よりログイン毎の自動セット
アップを推奨– 下記ファイルに上記のコマンドを追加
• .cshrc (C shell)• .profile (sh, ksh).
IMSL Fortran福岡工業大学
17
www.vnij.comIMSL Fortranライブラリの
コンパイル・リンク
• コンパイラはPGI Fortran95 v6.1.x に対応
• IMSL Fortranライブラリのコンパイル&リンク$F90 -o <実行モジュール> $F90FLAGS <メインソース> $LINK_F90
• IMSL FortranライブラリのOpenMP並列&ベンダーBLAS使用時のコンパイル&リンク : これを推奨します
$F90 -o <実行モジュール> $F90FLAGS <メインソース> $LINK_F90_SMP(または$LINK_F90_STATIC_SMP)
export OMP_NUM_THREADS=使用CPU数./実行モジュール名
IMSL Fortran福岡工業大学
IMSL Fortran ライブラリの環境
19
www.vnij.com
IMSL Fortranのディレクトリ構成
/usr/local/imsl||- license| |- bin|- CTT6.0| |- bin| |- ctt ※6.0はFortran、Cライブラリ
| I- example 共通バージョン。
| |- help | |- include ※ UNIX、Linuxで共通の構成
| |- lib
IMSL Fortran福岡工業大学
20
www.vnij.com
IMSL Fortranの環境変数
• $CTT_FORTRAN_COMPILER コンパイラバージョン• $CTT_EXAMPLES 例題のディレクトリ• $CTT_OS_VERSION OSバージョン• $F90 F90コンパイラ• $MPIF90 MPI用F90コンパイラ• $F90FLAGS FORTRANのコンパイルオプション• $LINK_F90_SHARED FORTRANのリンクパス(Sharedリンク)• $LINK_F90_STATIC FORTRANのリンクパス(Staticリンク)• $LINK_F90 FORTRANのリンクパス(デフォルト)• $LINK_MPI IMSLのMPI時のリンクパス• $VNI_LICENSE_NUMBER 製品のライセンス番号
: 等
IMSL Fortran
21
www.vnij.com IMSL Fortranライブラリ 付属の例題(1/2)
• $CTT_EXAMPLES/f90 ディレクトリ に例題
- eiat ディレクトリ
• Environment and Installation Assurance Tests• 1973題の環境及びインストール保証テスト
– manual ディレクトリ
• 105題のIMSL Fortran ライブラリユーザズガイドの例題
– benchmark ディレクトリ
• ネイティブなIMSL F90ルーチンと、同一機能の元F77ルーチンとの17組の性能比較。
• 詳細はIMSL Fortran日本語マニュアルのAppendix D参照
IMSL Fortran
22
www.vnij.com
IMSL Fortran 付属の例題 (2/2)
– mpi_manual• 37題のIMSL Fortran ユーザーズガイドのMPIの例題
– mpi_benchmark• IMSL FortranのMPIでの実行と、同一内容のIMSL
Fortranスカラーバージョンでの実行の17組の性能比較
• 詳細はIMSL Fortran日本語マニュアルのAppendix D参
照
IMSL Fortran
23
www.vnij.com
IMSLライブラリの動作環境
• パソコンからスーパーコンまで 新のシステムに対応• 随時動作環境表をVNIのホームページに公表
http://www.vni.com/books/dod/pdf/IMSL_scp.pdf
IMSL Fortran,C
IMSL Fortran ライブラリv5.0 の仕様
25
www.vnij.comシェアード ライブラリとスタティックライブラリ
シェアードライブラリ (WindowsではDLL)
– 実行時にシンボルを参照
– アプリケーションのメンテナンスが容易
– 実行モジュールは小さいが、実行時にライブラリが参照可能でなければならない
スタティックライブラリ– リンク時にシンボルを参照
– IMSLライブラリが更新された場合は、全てのアプリケーションを再リンクする必要がある
– 実行時にライブラリを参照する必要はないが、実行モジュールのサイズが大きい
IMSL Fortran
26
www.vnij.com
F90ルーチンと F77ルーチン
IMSLライブラリはF66→F77→F90へと変化
F77時代との互換性を保ちながら、F90の機能を追加
F77で書かれたルーチンと、F90で書かれたルーチンが混在
F77ルーチンにはF90用インターフェース有り
F90 ルーチンは長いルーチン名
名称の例 F90 : LIN_SOL_GENF77 : LSARG(6文字以下)
IMSL Fortran
27
www.vnij.com
IMSL Fortranライブラリ 命名規則(1/2)
• F77開発ルーチンの命名規則
<規則1> 6文字以内、倍精度版は頭にDがつく
例: 単精度 LSARG倍精度 DLSARG
<規則2> Ver5.0から、
F77開発ルーチンはより明示的な別名を持つ
例: 単精度 S_LSARG倍精度 D_LSARG
IMSL Fortran
28
www.vnij.com
IMSL Fortranライブラリ命名規則 (2/2)
F90開発ルーチン
明示的名称、単精度、倍精度共通
例:単精度、倍精度共にlin_sol_gen
その他 一部のルーチンは命名規則に従わない
BLAS や三角関数など、標準名があらかじめある場合
IMSLを使用するFortranプログラムでの変数・ルーチン名の注意事項
IMSLのルーチン名と同一名を使用しない
S_, D_, C_, or Z_で始まる名前を使用しない
5~6文字の変数で、2、3文字目が数字の変数を使用しない
(IMSLの内部ルーチンで多く使用されている)
IMSL Fortran
29
www.vnij.com IMSL Fortranライブラリ 5.0 のモジュールファイル
• コンパイル時にモジュールファイルを参照、
IMSLのルーチン呼び出し時の引数リストをチェック
→ デバッグの手間・プログラムミスを著しく減少
• モジュールファイル(*.mod)の使用方法
IMSLルーチンを使用しているソースの先頭に下記の文を指定 個々のルーチンの場合 use ルーチン名_int
例 : use neqnf_int 全ルーチン use imsl_libraries F90のオペレータ関数全て use linear_operators
IMSL Fortran
30
www.vnij.com
IMSL Fortran ライブラリ例題
USE imsl_libraries ! または USE LSLRG_INT! USE WRRRN_INT
PARAMETER (LDA=3, N=3)REAL A(LDA, LDA), B(N), X(N)
DATA A/33.0, -24.0, 18.0, 16.0, -10.0, -11.0, 72.0, -57.0, 7.0/DATA B/129.0, -96.0, 8.5/
CALL LSLRG (A, B, X, 3, 3, 1) ! または CALL S_LSLRG (...
CALL WRRRN ('X', X, 1, N, 1)
END反復改良法によらない実一般線形連立方程式の解User’s Guide Math/Library P.86
IMSL Fortran
31
www.vnij.com
IMSL Fortranライブラリの引数
• F90インターフェースとF77インターフェース– F77インターフェースは、F77仕様の引数
例 : BCLSJ (FCN, JAC, M, N, XG, IB, XL, XU, XS, FS, IP, RP, X, FV, FJ, LDFJ)
– F90インターフェースは、省略可能な引数を省略
例 : BCLSJ (FCN, JAC, M, IB, XL, XU, X)
• 引数を簡略化しプログラミングエラーを防止
• 省略された引数はデフォルト値がセット
• 省略した引数にデフォルト以外を与える場合は、オプション引数で追加指定が可能
例 : BCLSJ (FCN, JAC, M, IB, XL, XU, X, N=N, XGUESS=XG)
IMSL Fortran
32
www.vnij.com
マシン定数(1/2)
– 関数IMACH( ) 整数のマシン定数を取得<出力例> AMD Opteron• 整数ビット数 imach( 1 )= 32• 整数バイト数 imach( 2 )= 4• 整数の基数 imach( 3 )= 2• 基数A桁の数 imach( 4 )= 31• 大の整数 imach( 5 )= 2147483647• 浮動少数の基数 imach( 6 )= 2• 単精度の基数Bの桁数 imach( 7 )= 24• 小の単精度指数 imach( 8 )= -125• 大の単精度指数 imach( 9 )= 128• 倍精度の基数Bの桁数 imach( 10 )= 53• 小の倍精度指数 imach( 11 )= -1021• 大の倍精度指数 imach( 12 )= 1024
IMSL Fortran
33
www.vnij.com
マシン定数(2/2)
– 関数AMACH ( ) 単精度のマシン定数を取得
– 関数DMACH ( ) 倍精度のマシン定数を取得
<出力例> AMD Opteron 小の正規化された正の数 amach( 1 )= 1.175494351E-38 大の数 amach( 2 )= 3.402823466E+38 小の相対間隔 amach( 3 )= 5.960464478E-8 大の相対間隔 amach( 4 )= 1.192092896E-7 log10(B) amach( 5 )= 0.30103001 NaN amach( 6 )= NaN 正のマシン無限大値 amach( 7 )= Infinity 負のマシン無限大値 amach( 8 )= -Infinity
34
www.vnij.comレベル2ルーチンによるワークスペースの明示的指定
<例:LQRRVの内部ルーチンの説明>
下線部分はLQRRVと同じComments
Workspace may be explicitly provided, if desired, by use of L2RRV/DL2RRV. The reference is:CALL L2RRV (NRA, NCA, NUMEXC, A, LDA, X, LDX, FACT, LDFACT, WK) ← 内部ルーチン形式
The additional arguments are as follows: ← 追加の引数の説明
FACT — LDFACT ´ (NCA + NUMEXC) work array containing the Householder factorization of the matrix on output. If the input data is not needed, A and FACT can share the same storage locations.
LDFACT — Leading dimension of the array FACT exactly as specified in the dimension statement of the calling program. (Input)
f A and FACT are sharing the same storage, then LDA = LDFACT is required.WK — Work vector of length (NCA + NUMEXC + 1) * (NB + 1) . The default value is NB ← ワークサイズ計算方法
F77ルーチンは、内部ルーチンを呼び出して、ワークスペースの指定が可能。
通常、ワークスペースは自動で作成される。ワークスペースのユーザーが指定には、次のメリットが考えられる。
メモリの有効利用実行時間の短縮
35
www.vnij.com IMSL Fortran ライブラリ
エラーハンドリング
• 7種類のエラータイプ
• 各エラータイプごとにエラー後の処理のデフォルトを持つ
WARNINGと同じ。メッセー
ジ出力のタイミングが即時継続印字Global-
Warning6
根本的なエラー終了印字Terminal5
Fatalと同じ。メッセージ出力
のタイミングが即時終了印字Global-
Fatal7
プログラムを修正終了印字Fatal4
条件によってはプログラムを修正
継続印字Warning3アンダーフローの発生継続無Alert2エラーの可能性継続無Note1エラーの内容プログラムの終了メッセージの印字エラーレベルレベル番号
IMSL Fortran
36
www.vnij.comIMSL Fortranライブラリ
エラー処理の変更
エラー処理設定ルーチン ERSETCALL ERSET(IERSVR,IPACT,ISACT)
IERSVR エラー処理を変更するエラータイプ
(0の時は全タイプ)
IPACT エラーメッセージの出力の有無
-1:変更なし 0:出力無し 1:出力有り 2:規定値に戻す
ISACT プログラムを終了の有無
-1:変更なし 0:終了しない 1:終了する 2:規定値に戻す
例:
CALL ERSET(4, 0, 0)Fatalエラー発生時の処理は、エラーメッセージの出力なし、
プログラムの実行は継続
IMSL Fortran
37
www.vnij.comIMSL Fortranライブラリ
エラー情報の取得(1/2)
エラーコード取得関数 IERCD( )IERCD() = 0 正常終了
IERCD() ≠ 0 WARNING以上のエラーの時、
エラーコードが返される
例:WARNINGエラー以上の場合、
独自のエラー処理を行う
CALL IMSLルーチン
IF (IERCD( ) .NE. 0) THENエラー処理
ENDIF
IMSL Fortran
38
www.vnij.comIMSL Fortranライブラリ
エラー情報の取得(2/2)
エラータイプの取得関数 N1RTY(1)
N1RTY( 1) = 0 正常終了
N1RTY( 1 ) = 1~5 エラータイプの番号
例:
CALL IMSLルーチン
IF (N1RTY( 1) .EQ. 3) THENWarningの時のエラー処理
ENDIF
IMSL Fortran
39
www.vnij.comIMSL Fortranライブラリ
エラーメッセージファイル
$CTT_DIR/bin/$LIB_ARCH ディレクトリ
<ファイル一覧>
• messages.daf エラーメッセージファイル
• messages.gls テキスト版エラーメッセージファイル
• prepmess messages.glsからmessages.daf への変換プログラム
• prepmess.f 変換プログラムprepmessのソース
エラーメッセージの内容の変更が可能。
テキスト版メッセージファイルを書き換え →
prepmessプログラムでエラーメッセージファイルに変換
IMSL Fortran
message_number=081 ←エラーメッセージ番号
message='s_/lin_eig_self/ The data array ''a'' has size %(i1) '// &'by %(i2) but the problem dimension is %(i3).'
↑エラーメッセージ内容message_number=82message='s_/lin_eig_self/ The eigenvalue array ''diagonal'' has size %(i1)
'// &'but the problem dimension is %(i2).'
<message.gls内容>
40
www.vnij.com
アンダーフローとオーバーフロー
アンダーフロー• IMSLライブラリはアンダーフローによって計算が影響されないように作成さ
れている
• システムはレジスタを0にする
• エラーはIMSL_ALERTレベル
オーバーフロー• IMSL のコードはオーバーフローを回避するように作成されている
• 発生時はプログラムミスのチェックが必要
• エラーはIMSL_FATALレベル
• エラーコード例:
IMSL_LARGE_ARG_OVERFLOWIMSL_ZERO_ARG_OVERFLOWIMSL_SMALL_ARG_OVERFLOW 等
IMSL Fortran,C
41
www.vnij.com
欠測値
• IMSL Fortran ライブラリと C ライブラリは欠測値の取り扱いが可能
• 欠測値は “Not a Number” または NaN として特別な
値として取り扱う
• 実際の欠測値の値は、機種により異なる
– 次のサブルーチン・関数で参照可能• IMSL Fortran ライブラリ:AMACH または DMACH• IMSL C ライブラリ : imsl_f_machine
IMSL Fortran,C
42
www.vnij.com
IMSL Fortran 行列格納モード
• 一般モード 正方 n x n 行列
• 矩形モード m x n 行列
• 対称モード AT = Aのような正方 n x n 行列
• エルミートモード AH = ATのような正方 n x n 行列
• 帯格納モード 非ゼロ要素が主対角項に近い m x n 行列
• 疎行列対応座標格納モード 疎行列の非ゼロ要素の座標と値
IMSL Fortran
IMSL サポートリソース
44
www.vnij.com
IMSLサポートリソース
• ハードコピードキュメント
• オンラインドキュメント
• その他ドキュメントリソース
IMSL Fortran,C
45
www.vnij.com
Fortranライブラリのマニュアル
– 英語版 『IMSL Fortran Library 5.0 Function Catalog』関数一覧
『IMSL Fortran Library Version 5.0 MATH/LIBRARY User’s Guide』2冊
『IMSL Fortran Library User’s Guide MATH/LIBRARY Special Function』1冊
『IMSL Fortran Library Version 5.0 STAT/LIBRARY User’s Guide』2冊
– 日本語版 『IMSL Fortran ライブラリ5.0 関数カタログ』 関数一覧
『Fortran77、IMSLライブラリ V3.0日本語マニュアル』
F77ルーチンの各章の概要
『IMSL FORTRAN90MP ILBRARY V4.0日本語マニュアル 』
F90ルーチンの詳細説明
IMSL Fortran
46
www.vnij.com
IMSL ライブラリのマニュアルについて
• IMSLライブラリのドキュメントは3つのセクショ
ンからなっている。ただしライブラリそのものは一つである。– 数値計算 Mathematics– 特殊関数 Special Functions– 統計解析 Statistics
• いくつかのオーバーラップはあるが、各章はそれぞれ機能別に構成されている。
47
www.vnij.com
Fortranライブラリのマニュアルの形式
• 各章の構成– 各章の先頭にその章全体の説明と注意事項
– 1ルーチン毎に引数、オプション引数、注意事項、エラーメッセージ等の記述
– 全てのルーチンに1つ以上のプログラム例
• 巻末・参考資料
エラーハンドリング・自動ワークスペースアロケーション・マシン定数・
配列モード・予約名
– Appendix A : GAMS Index– Appendix B : Alphabetical Summary of Routines– Appendix C : References
IMSL Fortran
48
www.vnij.com
正しいルーチンの見つけ方
• 関数カタログを参照
• 各章のイントロダクションを参照
• 巻末のルーチン名アルファベット順インデックスで検索
• 巻末のGAMS(Guide to Available Mathematical Software, National Institute of Standards and Technology)
インデックスで検索
• ドキュメントの各ルーチン毎にある例題を参照
IMSL Fortran
49
www.vnij.com
その他サポートリソース
• オンラインドキュメント(PDF・英語マニュアルと同じ)
http://www.vnij.com/products/imsl/documentation/index.html• TIPS データベース
http://www.vni.com/tech/imsl/tips.html• ホワイトペーパー
http://www.vni.com/company/whitepapers• Cross-language Technical Report (Calling Fortran from C,
Report # 8902)http://www.vni.com/tech/imsl/tn.html
• VNI Forumhttp://forums.vni.com/
IMSL Fortran,C
50
www.vnij.com
サポート連絡先
下記お問い合わせフォームよりご連絡下さい。
http://www.vnij.com/forms/tech_sprt_request.html
緊急時はメール・電話・FAXでのお問い合わせも承ります。
日本ビジュアルニューメリックス㈱
• サポート時間 土日、祭日を除く 10:00 ~ 17:00• Phone Number (03)5211-7760• Fax Number (03)5211-7769• E-mail support@vnij.co.jp
IMSL Fortran ライブラリ
各章概要
52
www.vnij.com IMSL Fortran 数値計算Mathematics
1章: 線形システム
2章: 固有システム解析
3章: 補間と近似
4章: 積分と微分
5章: 微分方程式
6章: 変換
7章: 非線形方程式
8章: 適化
9章: 基本的な行列とベクトル演算
10章: 線形演算子とジェネリック関数
11章:ユーティリティ
IMSL Fortran
53
www.vnij.com IMSL Fortran 特殊関数Special Functions
1章: 初等関数
2章: 三角関数と双曲線関数
3章: 指数積分と関連する関数
4章: ガンマ関数と関連する関数
5章: 誤差関数と関連する関数
6章: ベッセル関数
7章: ケルビン関数
8章: エアリ関数
9章: 楕円積分
10章: 楕円関数と関連する関数
11章: 確率分布関数と逆関数
12章: マシュウ関数
13章: その他の関数
IMSL Fortran
54
www.vnij.com IMSL Fortran 統計解析Statistics
1章: 基本統計
2章: 回帰
3章: 相関
4章: 分散分析
5章: カテゴリデータと離散データの解析
6章: ノンパラメトリック統計
7章: 適合度とランダム度の検定
8章: 時系列解析と予測
9章: 共分散構造と因子分析
10章: 判別分析
11章: クラスタ分析12章: 標本分析13章: 生存解析14章: 多次元尺度法15章: 密度関数とハザードの
推定16章: ラインプリンター作図17章: 確率分布関数と逆関数18章: 乱数生成19章: ユーティリティ20章: 数学的サポート
IMSL Fortran
IMSL Fortran 各章概要
数値計算Mathematics
IMSL Fortran
56
www.vnij.comCh. 1 線形システム
Linear Systems
1. 線形方程式の解法 LIN_SOL_– 一般行列, 自己随伴行列、三重対角行列の解法 Ax=b– 小2乗法、特異値分解で解く Ax @b
2. MPI並列処理でAx @bを 小2乗法で解く PARALLEL_– Ax @b, xの拘束(x ≧ 0 あるいは α≦x≦β)
3. 連立方程式の解、逆行列、行列式の計算など– 様々なタイプの係数行列をカバー
– 実・複素、正定値、対称、Hermite、帯・三角、Toeplitz、循環、一般・疎など
– 反復解法 ルーチン
PCG, GMRES(Generalized Minimal Residual Method)4. 線形 小2乗法と行列の因子分解
– 小2乗法、QR分解
– Cholesky分解
– 特異値分解 (SVD)– Moore-Penroseの一般逆行列の計算 A† = V1Σ1
-1U1T
IMSL Fortran Math
57
www.vnij.comCh. 1 線形システム
Linear Systems
行列の種類と命名
複素 Hermite 正定値疎行列.ZD実対称正定値疎行列.XD複素一般疎行列.ZG実一般疎行列.XG複素 Hermite 正定値帯行列.QH or QB実対称正定値帯行列.QS or PB複素正方形行列の上半分に格納された複素 Hermite 行列.HF
複素正方形行列の上半分に格納された複素 Hermite 正定値行列.DH正方行列の上半分に格納された実対称正定値行列.DS正方行列の上半分に格納された実対称行列.SF複素帯行列.CB複素三重対角行列.TQ or CQ実帯行列.RB実三重対角行列.TR or CR複素一般(正方)行列.CG実一般(正方)行列.RG
IMSL Fortran Math
58
www.vnij.comCh. 1 線形システム
Linear Systems
線型方程式の解法と因子分解
IMSL Fortran Math
A
bLFT** LFC**
LFD**LFI**LFS**
LIN** LSA**LSL**
Conditionnumber
Factorization
DeterminantA-1 x = A bor
x = A b
-1
-T
LSL** : LFC**でLU分解を行い、LFS**で答えを得る。上三角行列Uの対角要素が0になるような特異行列では解を得られない。Aが悪条件あるいはスケールが悪くて条件数が1/εより大きくなる場合は、警告メッセージを出す。この場合はLSA**またはLSV**を利用すると良い。
LSA** : LFC**によるLU分解を行い、LFI**で解の反復改
良を行い精度の高い答えを得る。
LFI** : LU分解された係数行列を用い、LFS**を使い、反
復改良で精度を高める。
LSV** : 特異値分解を行う。
LFC** : LU分解を行ない、また条件数L1を推定する。LU分解は scaled partial pivoting による。 LFT**はLU分解
のみのルーチン。
LFD**:LU分解された行列から、行列式を計算する。det A = det L det U , det U = ΠUii, det L = (-1)k (kはpivot交換の回数)
LIN**: LU分解された行列から、逆行列を計算する。A-1 = U-1L-1
59
www.vnij.comCh. 1 線形システム
Linear Systems
Iterative Refinement : 反復改良による高精度の解法 (LFI**)
IMSL Fortran Math
x0 = A-1bFor i = 1, 50
ri = Axi-1 - b computed in higher precisionpi = A-1 rixi = xi-1 - piif (|| pi ||∞ ≦ ε|| xi ||∞) Exit
End for Error — Matrix is too ill-conditioned
ri の計算はAが単精度なら倍精度で、倍精度の場合は4倍精度で行う。 (4倍精度計算用の関数はCh.9)
60
www.vnij.comCh. 1 線形システム
Linear Systems
例:連立1次方程式の解法 (p.12)
LIN_SOL_GEN :
Ax = b をLU分解で解く:1) LU = A2) y = L-1b, x = U-1y
その他:AのLU分解、行列式の値、逆行列、LU分解されたAによるAx=bおよびATx=bの解
use lin_sol_gen_intuse rand_gen_intuse error_option_packet
implicit none
! This is Example 1 for LIN_SOL_GEN.
integer, parameter :: n=32 real(kind(1e0)), parameter :: one=1e0 real(kind(1e0)) err real(kind(1e0)) A(n,n), b(n,n), x(n,n), res(n,n), y(n**2)
! Generate a random matrix. call rand_gen(y) A = reshape(y,(/n,n/))
! Generate random right-hand sides. call rand_gen(y) b = reshape(y,(/n,n/))
! Compute the solution matrix of Ax=b. call lin_sol_gen(A, b, x)
! Check the results for small residuals. res = b - matmul(A,x) err = maxval(abs(res))/sum(abs(A)+abs(b)) if (err <= sqrt(epsilon(one))) then
write (*,*) 'Example 1 for LIN_SOL_GEN is correct.' end if end
OutputExample 1 for LIN_SOL_GEN is correct.
IMSL Fortran Math
61
www.vnij.comCh. 1 線形システム
Linear Systems
例:PCGで実対称定値連立式Ax = 1 を解く (p.363)
USE IMSL_LIBRARIESINTEGER LDA, LDPRE, N, NCODA, NCOPREPARAMETER (N=9, NCODA=3, NCOPRE=1, LDA=2*NCODA+1,&
LDPRE=NCOPRE+1)!
INTEGER IDO, ITMAXREAL A(LDA,N), P(N), PRECND(LDPRE,N), PREFAC(LDPRE,N),&
R(N), RCOND, RELERR, X(N), Z(N)! Set A in band form
DATA A/3*0.0, 4.0, -1.0, 0.0, -1.0, 2*0.0, -1.0, 4.0, -1.0, 0.0,& etc.! Set PRECND in band symmetric form
DATA PRECND/0.0, 4.0, -1.0, 4.0, -1.0, 4.0, -1.0, 4.0, -1.0, 4.0,& etc.! Right side is (1, ..., 1)
R = 1.0E0! Initial guess for X is 0
X = 0.0E0! Factor the preconditioning matrix
CALL LFCQS (PRECND, NCOPRE, PREFAC, RCOND)!
ITMAX = 100RELERR = 1.0E-4IDO = 0
10 CALL PCGRC (IDO, X, P, R, Z, RELERR=RELERR, ITMAX=ITMAX)IF (IDO .EQ. 1) THEN
! Set z = ApCALL MURBV (A, NCODA, NCODA, P, Z)GO TO 10
ELSE IF (IDO .EQ. 2) THEN! Solve PRECND*z = r
CALL LSLQS (PREFAC, NCOPRE, R, Z)GO TO 10
END IF! Print the solution
CALL WRRRN (’Solution’, X)!
END
4 1 0 11 4 1 0 1
0 1 4 1 0 11 0 1 4 1 0 1
1 0 1 4 1 0 11 0 1 4 1 0 1
1 0 1 4 1 01 0 1 4 1
1 0 1 4
A
- -é ùê ú- - -ê úê ú- - -ê ú- - - -ê úê ú= - - - -ê ú
- - - -ê úê ú- - -ê ú
- - -ê úê ú- -ê úë û
4 11 4 1
1 4 11 4 1
1 4 11 4 1
1 4 11 4 1
1 4
M
-é ùê ú- -ê úê ú- -ê ú- -ê úê ú= - -ê ú
- -ê úê ú- -ê ú
- -ê úê ú-ê úë û
Mは前処理用行列
IMSL Fortran Math
62
www.vnij.com
Ch. 1 線形システム Linear Systems
例:GMRES法で疎行列Ax = b を解く。前処理行列はJacobi(Aの対角) (p.373)G2RESはGMRESの2ndレベルルーチン。解法やワーク
サイズを指定できる。
USE IMSL_LIBRARIESINTEGER N, NZPARAMETER (N=6, NZ=15)
! Specifications for local variablesINTEGER IDO, INFO(10), NOUTREAL P(N), TOL, WORK(1000), X(N), Z(N)REAL DIAGIN(N), R(N)EXTERNAL AMULTP
EXTERNAL G8RES, G9RES!
DATA DIAGIN/0.1, 0.1, 0.0666667, 0.1, 1.0, 0.16666667/DATA R/10.0, 7.0, 45.0, 33.0, -34.0, 31.0/
!CALL UMACH (2, NOUT)
! Initial guess = (1 ... 1)X = 1.0E0
! Set up the options vector INFO! to use preconditioning
INFO = 0INFO(4) = 1
! Set stopping tolerance to! square root of machine epsilon
TOL = AMACH(4)TOL = SQRT(TOL)IDO = 0
10 CONTINUECALL G2RES (IDO, N, X, P, R, Z, TOL, INFO, G8RES, G9RES, WORK)IF (IDO .EQ. 1) THEN
! Set z = A*pCALL AMULTP (P, Z)GO TO 10
ELSE IF (IDO .EQ. 2) THEN! Set z = inv(M)*p! The diagonal of inv(M) is stored! in DIAGIN
CALL SHPROD (N, DIAGIN, 1, P, 1, Z, 1)GO TO 10
ELSE IF (IDO .EQ. 3) THEN! Set z = A*inv(M)*p
CALL SHPROD (N, DIAGIN, 1, P, 1, Z, 1)P = ZCALL AMULTP (P, Z) GO TO 10
END IF CALL WRRRN ('Solution', X) WRITE (NOUT,'(A11, E15.5)') 'Residual = ', TOL END
OutputSolution
1 1.0002 2.0003 3.0004 4.0005 5.0006 6.000Residual = 0.25882E-05
IMSL Fortran Math
63
www.vnij.comCh. 2 固有システム解析
Eigensystem Analysis
1. 固有値の計算 LIN_EIG_, LIN_GEIG_– 正方、自己随伴行列、一般化固有値の計算
2. 固有値と固有ベクトルの計算 Ax=λx– 様々なタイプの行列をカバー
• 実・複素、対称、正定値、帯・一般・Hessenbergなど
3. 一般化固有値問題 Ax=λBx• 実・複素、実対称行列
IMSL Fortran Math
64
www.vnij.com
EPIHFp. 518
EPISBp. 501
EPISFp. 483
性能指標Performance Index
EVFHFp 515
EVFSBp. 498
EVFSFp. 480
所定範囲内の固有値と固有ベクトル
EVBHFp. 513
EVBSBp. 495
EVBSFp. 478
所定範囲内の固有値
EVEHFp.510
EVESBp. 492
EVESFp. 475
最大と最小の固有値と固有ベクトル
EVAHFp. 508
EVASBp. 490
EVASFp. 473
最大と最小の固有値
EVCHFp. 505
EVCSBp. 487
EVCSFp. 471
全ての固有値と固有値ベクトル
EVLHFp. 502
EVLSBp. 485
EVLSFp. 469
全ての固有値
Hermite完全
対称帯
対称完全
対称と Hermite の固有方程式 Ax = lx
IMSL Fortran Math
Ch. 2 固有システム解析Eigensystem Analysis
65
www.vnij.com
EPICGp. 467
EPIRGp. 460
EPICGp. 467
EPIRGp. 460
性能指標
EVCCHp. 526
EVCRHp. 522
EVCCGp. 464
EVCRGp. 457
全ての固有値 と
固有ベクトル
EVLCHp. 525
EVLRHp. 455
EVLCGp. 462
EVLRGp. 455
全ての固有値
複素数Hessenberg
実数Hessenberg
複素数一般
実数一般
一般の固有方程式 Ax = lx
GPISPp. 549
GPICGp. 542
GPIRGp. 535
性能指標
GVCSPp. 547
GVCCGp. 540
GVCRGp. 531
全ての固有値と固有ベクトル
GVLSPp. 544
GVLCGp. 537
GVLRGp. 529
全ての固有値
A 対称B 正定値
複素一般
実数一般
一般化固有方程式 Ax = lBx
IMSL Fortran Math
Ch. 2 固有システム解析Eigensystem Analysis
66
www.vnij.com
! For comparison, compute the singular values. call lin_sol_svd(A, b, x, nrhs=0, s=S)
! Check the results: Magnitude of eigenvalues should equal ! the singular values.
if (sum(abs(abs(D) - S)) <= & sqrt(epsilon(one))*S(1)) then
write (*,*) 'Example 1 for LIN_EIG_SELF is correct.' end if end
use lin_eig_self_intuse lin_sol_svd_intuse rand_gen_int
implicit none
! This is Example 1 for LIN_EIG_SELF.
integer, parameter :: n=64 real(kind(1e0)), parameter :: one=1e0 real(kind(1e0)) :: A(n,n), b(n,0), D(n), S(n), x(n,0), y(n*n)
! Generate a random matrix and from it ! a self-adjoint matrix.
call rand_gen(y) A = reshape(y,(/n,n/)) A = A + transpose(A)
! Compute the eigenvalues of the matrix. call lin_eig_self(A, D)
例:自己随伴行列の固有値を計算(p.434)
A = C + CT (実対称行列とする)
QR法で固有値を計算
特異値と比較
IMSL Fortran Math
Ch. 2 固有システム解析Eigensystem Analysis
67
www.vnij.comCh. 2 固有システム解析
Eigensystem Analysisuse linear_operators
implicit none
! This is Example 1 (using operators) for LIN_EIG_SELF.
integer, parameter :: n=64 real(kind(1e0)), parameter :: one=1e0 real(kind(1e0)) :: A(n,n), D(n), S(n)
! Generate a random matrix and from it ! a self-adjoint matrix.
A = rand(A); A = A + .t.A
! Compute the eigenvalues of the matrix. D = EIG(A)
! For comparison, compute the singular values and check for ! any error messages for either decomposition.
S = SVD(A)
! Check the results: Magnitude of eigenvalues should equal ! the singular values.
if (norm(abs(D) - S) <= sqrt(epsilon(one))*S(1)) then write (*,*) 'Example 1 for LIN_EIG_SELF (operators) is correct.'
end if end
例:自己随伴行列の固有値を計算(p.1458)
前と同じ問題をジェネリック関数で解く(Ch.10参照)
IMSL Fortran Math
68
www.vnij.comCh. 3 補間と近似
Interpolation and Approximation
1. 区分多項式 (piecewise polynomial)
2. Spline補間– B-Spline, Cubic Spline,テンソル積Spline
3. 2次補間、散布データ補間、 小2乗、有理Chebyshev近似
( ) ( )( )
1
11
for < 1 !
jki
ji i ij
xp x c x
jx
x x-
+=
-= £
-å
( ) ( )( )
1
1, 1 1 1 2 1 !
ki
i i i i i kic p c c ckx
x x-
+ +
D= = + D + +
-
IMSL Fortran Math
(ζ: breakpoint 単調増加)
( Δζi=ζi+1-ζi )
( ) ( )1
N
j jj
f x c B x=
=å
( ) ( ) ( )1 1
,N M
ij i jj i
f x y c B y B x= =
=åå
( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ), ,, , , , , ,
1 1 1
, ,y xz
x x y y z z
N NNp q r p q r
nml n k m k l kl m n
s x y z c B x B y B z= = =
=ååå t t t
69
www.vnij.comCh. 3 補間と近似
Interpolation and Approximation
補間ルーチンの選び方全部で18のルーチン
CSAKMCSCOM
CSPER
CSHER
形 状保存
周期的
導関数
SURF
散布データ2D
BS2INQD2VLQD2DR
BS3INQD3VLQD3DR
テンソル積2D/3D
2D 3D
CSIEZCSINTCSDECSPLEZBSINTQDVALQDDER
補間
単変量多変量
IMSL Fortran Math
汎用ルーチン
70
www.vnij.comCh. 3 補間と近似
Interpolation and Approximation
数々なSpline補間の例
CSINT : Cubic Spline Not-a-knotCSDEC : Derivative end condition
自然境界条件 Natural SplineCSAKM : Akima 秋間浩の振動を
小にする補間
CSCON : Shape preserving 凸状を
保つ補間
BSINT K=3 : 3次の B-SplineBSINT K=5 : 5次の B-Spline
CSAKM
CSINT CSDEC (natural spline)
CSCON
BSINT with K=3 BSINT with K=5
IMSL Fortran Math
71
www.vnij.comCh. 3 補間と近似
Interpolation and Approximation
Splineルーチンの関係
CSVALCSDERCSITGCS1GD
BSNAKBSOPK
BSINT
BSLSQBSVLSCONFT
BSCPP
BSVALBSDERBSITGBS1GD
DATA
CSSMHCSSCV
PPVALPPDERPPITGPP1GD
OUT
CSINT
CSHER
CSCONCSPER
CSAKM
CSDEC
IMSL Fortran Math
C* : Cubic Spline
B* : B-Spline
P* : Piecewise
*VAL : evaluate
*DER : differentiate
*ITG : integrate
*1GD : evaluate on grid
72
www.vnij.comCh. 3 補間と近似
Interpolation and Approximation
例:CSCONとCSINTによる当てはめ (p.604)
USE CSCON_INTUSE UMACH_INTUSE WRRRL_INT
! SpecificationsINTEGER NDATAPARAMETER (NDATA=9)
! INTEGER IBREAK, NOUTREAL BREAK(2*NDATA), CSCOEF(4,2*NDATA), FDATA(NDATA),&
XDATA(NDATA)CHARACTER CLABEL(14)*2, RLABEL(4)*2
! DATA XDATA/0.0, .1, .2, .3, .4, .5, .6, .8, 1./DATA FDATA/0.0, .9, .95, .9, .1, .05, .05, .2, 1./DATA RLABEL/’ 1’, ’ 2’, ’ 3’, ’ 4’/DATA CLABEL/’ ’, ’ 1’, ’ 2’, ’ 3’, ’ 4’, ’ 5’, ’ 6’,&
’ 7’, ’ 8’, ’ 9’, ’10’, ’11’, ’12’, ’13’/! Compute cubic spline interpolant
CALL CSCON (XDATA, FDATA, IBREAK, BREAK, CSCOEF)! Get output unit number
CALL UMACH (2, NOUT)! Print the BREAK points and the! coefficients (CSCOEF) for! checking purposes.
WRITE (NOUT,’(1X,A,I2)’) ’IBREAK = ’, IBREAKCALL WRRRL (’BREAK’, BREAK, RLABEL, CLABEL, 1, IBREAK, 1, &
FMT=’(F9.3)’)CALL WRRRL (’CSCOEF’, CSCOEF, RLABEL, CLABEL, 4, IBREAK, 4, &
FMT=’(F9.3)’)END
IMSL Fortran Math
73
www.vnij.comCh. 3 補間と近似
Interpolation and Approximation
例:離散1次元データへのBスプラインによる加重 小2乗法当てはめ (p.565)
関数 g(x) = exp(-x2/2)グリッド点 xi = (i-1)⊿x, i = 1, ,, ndata
f(xi) = g(xi), i = 0, ,, ndata自然境界条件 f’’(xi) = g’’(xi),i=0 and ndata
! This is Example 1 for SPLINE_FITTING, Natural Spline Interpolation ! using cubic splines. Use the function exp(-x**2/2) to generate samples.
integer :: i integer, parameter :: ndata=24, nord=4, ndegree=nord-1, &
nbkpt=ndata+2*ndegree, ncoeff=nbkpt-nord, nvalues=2*ndatareal(kind(1e0)), parameter :: zero=0e0, one=1e0, half=5e-1 real(kind(1e0)), parameter :: delta_x=0.15, delta_xv=0.4*delta_x real(kind(1e0)), target :: xdata(ndata), ydata(ndata), &
spline_data (3, ndata), bkpt(nbkpt), & ycheck(nvalues), coeff(ncoeff), & xvalues(nvalues), yvalues(nvalues), diffs
real(kind(1e0)), pointer :: pointer_bkpt(:) type (s_spline_knots) break_pointstype (s_spline_constraints) constraints(2) xdata = (/((i-1)*delta_x, i=1,ndata)/) ydata = exp(-half*xdata**2) xvalues =(/(0.03+(i-1)*delta_xv,i=1,nvalues)/) ycheck= exp(-half*xvalues**2) spline_data(1,:)=xdataspline_data(2,:)=ydataspline_data(3,:)=one
! Define the knots for the interpolation problem. bkpt(1:ndegree) = (/(i*delta_x, i=-ndegree,-1)/) bkpt(nord:nbkpt-ndegree) = xdatabkpt(nbkpt-ndegree+1:nbkpt) = & (/(xdata(ndata)+i*delta_x, i=1,ndegree)/)
! Assign the degree of the polynomial and the knots. pointer_bkpt => bkptbreak_points=s_spline_knots(ndegree, pointer_bkpt)
! These are the natural conditions for interpolating cubic ! splines. The derivatives match those of the interpolating ! function at the ends.
constraints(1)=spline_constraints & (derivative=2, point=bkpt(nord), type='==', value=-one)
constraints(2)=spline_constraints & (derivative=2,point=bkpt(nbkpt-ndegree), type= '==', & value=(-one+xdata(ndata)**2)*ydata(ndata))
coeff = spline_fitting(data=spline_data, knots=break_points,& constraints=constraints)
yvalues=spline_values(0, xvalues, break_points, coeff)
diffs=norm(yvalues-ycheck,huge(1))/delta_x**nord
if (diffs <= one) then write(*,*) 'Example 1 for SPLINE_FITTING is correct.'
end if end
IMSL Fortran Math
74
www.vnij.comCh. 4 積分と微分
Integration and Differentiation
1. 単変量重み付き積分2. 2次元積分3. 多次元積分4. 微分
– 1次、2次,3次微分
5. Gaussの求積ルールGauss, Gauss-Radau, Gauss-Lobatto
f は2N未満のオーダーの多項式
6. Fejérの求積ルール
( ) ( )b
af x w x dxò
( )( )
( ),
b h x
a g xf x y dy dxò ò
( )1
11 1, ,n
n
b b
n na af x x dx dxò ò
( ) ( ) ( )1
Nb
i iai
f x w x dx f x w=
=åò
( )( )( )( )( )
( ) ( ) ( )( )
( ) ( )
2
2
2
1 1,1 Legendre
1/ 1- 1, 1 Chebyshev 1st kind
1 1, 1 Chebyshev 2nd kind
, Hermite
1 1 1, 1 Jacobi0, Generalized Laguerre
1/ cosh Hyperbolic cosine
x
x
w x
x
x
e
x xe x
x
a b
a
-
-
-
-
- -
-¥ ¥
+ - -¥
-¥ ¥
Interval Name
IMSL Fortran Math
75
www.vnij.comCh. 4 積分と微分
Integration and Differentiation
REAL FUNCTION F (X)REAL XREAL ALOG, SQRTINTRINSIC ALOG, SQRTF = ALOG(X)/SQRT(X)RETURNEND
OutputComputed = -4.000 Exact = -4.000
Error estimate = 1.519E-04 Error = 2.098E-05
USE QDAGS_INT USE UMACH_INT INTEGER NOUTREAL A, ABS, B, ERRABS, ERREST, ERROR, ERRREL, EXACT, F, &
RESULTINTRINSIC ABSEXTERNAL F
! Get output unit numberCALL UMACH (2, NOUT)
! Set limits of integrationA = 0.0B = 1.0
! Set error tolerancesERRABS = 0.0CALL QDAGS (F, A, B, RESULT, ERRABS=ERRABS, ERREST=ERREST)
! Print resultsEXACT = -4.0ERROR = ABS(RESULT-EXACT)WRITE (NOUT,99999) RESULT, EXACT, ERREST, ERROR
99999 FORMAT (’ Computed =’, F8.3, 13X, ’ Exact =’, F8.3, /, /, &’ Error estimate =’, 1PE10.3, 6X, ’Error =’, 1PE10.3)
END
例:関数の積分と誤差(p.772)
( )1 1/ 2
0ln 4x x dx- = -ò
IMSL Fortran Math
QDAGS : グローバルアダプティブ法による汎用求積ルーチン。21点Gauss-Kronrodルールで区間積分。
誤差の推定は10点Gauss求積ルール
による。
76
www.vnij.comCh. 4 積分と微分
Integration and Differentiation
Outputresult = -0.3334789
implicit noneinteger, parameter :: ndim=10real(kind(1d0)) :: a(ndim)real(kind(1d0)) :: b(ndim)real(kind(1d0)) :: resultinteger :: Iexternal fcn a = 0.d0b = 1.d0call qmc(fcn, a, b, result)write (*,*) 'result = ', result
end real(kind(1d0)) function fcn(x)
implicit nonereal(kind(1d0)), dimension(:) :: xinteger :: i, jreal(kind(1d0)) :: prod, sum, signsign = -1.d0sum = 0.d0do i=1, size(x)
prod = 1.d0prod = product(x(1:i))sum = sum + (sign * prod)sign = -sign
end dofcn = sum
end function fcn
例:準モンテカルロ法による積分(p.810)
金融分野でよく利用される。
( )1
1 1
0 01 1
1 11 13 2
niwi
j ni j
x d x d x= =
é ùæ ö- = - - -ê úç ÷è øê úë û
å Õò ò
(n=10の場合の例)
QMC:Quasi-Monte Carlo法による求積。
乱数列としてLow-discrepancyの一般化Faure列を用いる。(Stat Ch.18 FAURE_NEXT)
IMSL Fortran Math
77
www.vnij.comCh. 5 微分方程式
Differential Equations
1. 常微分方程式の解 (ODE)– 初期値問題
• Runge-Kutta, Adams-Moulton, Gear– 境界値問題
• 有限差分法、多重射撃法(multiple shooting)2. 微分代数式の解
• Petzold-Gear法3. 偏微分方程式の解 (PDE)
– 1次元問題• ムービンググリッドによる解• 直線法(method of lines)
– 2次元、3次元問題• 高速Poissonソルバーによる解• PDE2D (別途販売) 選点法
4. Sturm-Liouville問題– 固有値、固有関数、スペクトル密度関数
( ) ( ) ( )1, , , , , , , , 0T
Ng t y y g t y y g t y y¢ ¢ ¢= =é ùë û
( ) ( ),dy t
y f t ydt
¢ = =
IMSL Fortran Math
221 1
1 2 2, , , , , , , , , ,i N Ni N
u u uu uf x t u u
t x x x x¶ ¶ ¶¶ ¶¶ ¶ ¶ ¶ ¶
æ ö= ç ÷
è ø
( )2 2
2 2 ,u u cu f x yx y
¶ ¶¶ ¶
+ + =
( ) ( ) ( ) ( )( ) for in ,d dup x q x u r x u x a bdx dx
l- + =
78
www.vnij.comCh. 5 微分方程式
Differential Equations
SLEIGSturm-Liouville 問題の固有値、固有関数あるいはスペクトラル密度関数を求める。
-(pu')' + qu =λru,α1u(a)-α2(pu’(a))=λ(α1’u(a)-α2’(pu’(a))β1u(b)+β2(pu'(b))=0
FPS3H高速 Poisson ソルバー各面に u 又はun が与えられた直方体上のuxx + uyy + uzz+cu = f(x,y)
FPS2H高速 Poisson ソルバー各辺に u 又はun が与えられた矩形上のuxx + uyy + cu = f(x,y)
MOLCH直線法(Method of Lines)による解。 3次Hermite多項式で展開し、1次連立ODEを解く。
ut = f(x, t, u, ux, uxx)α1u(a)+β1ux(a) =γ1(t)α2u(b)+β2ux(b) =γ2(t)
DASPG指標0又は1の硬い系の微分代数式ソルバー Petzold-GearのBDF法g(t,y,y')=0y(t0),y'(t0) が与えられる
BVPMSマルチプルシューティング法を使用する境界値問題ソルバー(BVP)
BVPFD有限差分法を使用する境界値問題ソルバー(BVP)y' = f(t,y)h(y(a),y(b)) = 0
IVPRK中程度の精度が必要で硬い系ではないRunge-Kutta-Vernerの5次および6次
IVPAG高精度が必要で硬い系ではない(Adams 法を使用する)
y' = f(t,y)y(t0) = y0
IVPAGA は一般、対称正定値、帯、または対称正定値帯行列 Adams-Moulton法(12次まで)あるいはGearのBDF(後退微分式)Stiff法
Ay' = f(t,y)y(t0) = y0
ルーチン考察問題
IMSL Fortran Math
79
www.vnij.comCh. 5 微分方程式
Differential Equations
USE IVPRK_INTUSE UMACH_INTINTEGER MXPARM, NPARAMETER (MXPARM=50, N=2)
! SPECIFICATIONS FOR LOCAL VARIABLESINTEGER IDO, ISTEP, NOUTREAL PARAM(MXPARM), T, TEND, TOL, Y(N)
! SPECIFICATIONS FOR SUBROUTINESEXTERNAL FCN
!CALL UMACH (2, NOUT)
! Set initial conditionsT = 0.0Y(1) = 1.0Y(2) = 3.0
! Set error toleranceTOL = 0.0005
! Set PARAM to defaultPARAM = 0.E0
! Select absolute error controlPARAM(10) = 1.0
! Print headerWRITE (NOUT,99999)IDO = 1ISTEP = 0
10 CONTINUEISTEP = ISTEP + 1TEND = ISTEPCALL IVPRK (IDO, FCN, T, TEND, Y, TOL=TOL, PARAM=PARAM)IF (ISTEP .LE. 10) THEN
WRITE (NOUT,’(I6,3F12.3)’) ISTEP, T, Y! Final call to release workspace
IF (ISTEP .EQ. 10) IDO = 3GO TO 10
END IF99999 FORMAT (4X, ’ISTEP’, 5X, ’Time’, 9X, ’Y1’, 11X, ’Y2’)
ENDSUBROUTINE FCN (N, T, Y, YPRIME)
! SPECIFICATIONS FOR ARGUMENTSINTEGER NREAL T, Y(N), YPRIME(N)
!YPRIME(1) = 2.0*Y(1) - 2.0*Y(1)*Y(2)YPRIME(2) = -Y(2) + Y(1)*Y(2)RETURNEND
例:ウサギ r と 狐 f (p.840)r’ = 2r – 2rf ; f’ = -f + rfr(0) = 1, f(0) = 3
IMSL Fortran Math
80
www.vnij.comCh. 5 微分方程式
Differential Equations
例:ウサギ r と 狐 f (p.840)Lotka-Volterra system捕食-被食の関係式
Runge-Kutta-Vernerの5次および6次の方法による解。
JMSLによる表示例
赤の点が初期値
IMSL Fortran Math
81
www.vnij.comCh. 6 変換
Transforms
1. 高速 Fourier 変換 (FFT)
– 実・複素
– 1次・2次・3次
2. たたみ込みと相関
3. 逆Laplace 変換
1
ˆ :N
m n nmn
x x w=
=å
( )( )
( )( )
( )( )
( )( )
( )( )
( )
( )
( )( )
-2 -1 1 /
2 -1 1 /
Routine1 1 2
FFTRF cos or sin
1 1 2FFTRB cos or sin
FFTCF exp
FFTCB exp
FSINT sin 1
1 1FCOST cos
12 1
QSINF 2 sin 2
2 1QSINB 4 sin
22 1 1
QCOSF 2 cos 2
QCOSB 4 co
nm
i n m N
i n m N
m nN
m nN
nmN
n mNm n
Nn m
Nm n
N
p
p
wp
p
p
p
p
p
p
-
-
- -
- -
+- -
--
-
- -
( )( )2n-1 1s
2mN
p-
IMSL Fortran Math
“F”: Forward “I” : 初期化 “Q” : Quarter
“B” : Backward “2” : 2nd level ルーチン
82
www.vnij.comCh. 6 変換
Transforms
use fast_dft_intuse rand_gen_int
implicit none
! This is Example 1 for FAST_DFT.
integer, parameter :: n=1024 real(kind(1e0)), parameter :: one=1e0 real(kind(1e0)) err, y(2*n) complex(kind(1e0)), dimension(n) :: a, b, c
! Generate a random complex sequence. call rand_gen(y) a = cmplx(y(1:n),y(n+1:2*n),kind(one)) c = a
! Transform and then invert the sequence back. call c_fast_dft(forward_in=a, &
forward_out=b) call c_fast_dft(inverse_in=b, &
inverse_out=a)
! Check that inverse(transform(sequence)) = sequence. err = maxval(abs(c-a))/maxval(abs(c)) if (err <= sqrt(epsilon(one))) then
write (*,*) 'Example 1 for FAST_DFT is correct.' end if
end
OutputExample 1 for FAST_DFT is correct.
例:次数1の離散フーリエ変換と逆変換(p.994)
IMSL Fortran Math
83
www.vnij.comCh. 7 非線形方程式
Nonlinear Equations
1. 多項式のゼロ点 p(z) = anzn + an-1zn-1 + ¼ + a1z + a0
– Jenkins-Traub法
– Laguerre法
2. 関数のゼロ点– Müller法– 補間とバイセクション法
3. 非線形連立方程式の解 fi(x) = 0, for i = 1, 2, ¼, n
– 修正Powellハイブリッド法
– Broydenの更新によるセカント法
IMSL Fortran Math
84
www.vnij.comCh. 7 非線形方程式
Nonlinear Equations
USE ZPORC_INTUSE WRCRN_INT
! Declare variablesINTEGER NDEGPARAMETER (NDEG=3)
!REAL COEFF(NDEG+1)COMPLEX ZERO(NDEG)
! Set values of COEFF! COEFF = (-2.0 4.0 -3.0 1.0)!
DATA COEFF/-2.0, 4.0, -3.0, 1.0/!
CALL ZPORC (COEFF, ZERO)!
CALL WRCRN (’The zeros found are’, ZERO, 1, NDEG, 1)!
END
OutputThe zeros found are
1 2 3( 1.000, 0.000) ( 1.000, 1.000) ( 1.000,-1.000)
例:p(z) = z3 - 3z2 + 4z -2
のゼロ点をJenkins-Traubの方法で計算。(p.1091)
IMSL Fortran Math
85
www.vnij.comCh. 8 適化
Optimization
1. 多くの分野で利用されるアルゴリズム– 航空乗組員のスケジュール
– 適在庫計画
– ダンボール裁断計画、など
2. アルゴリズムの選択– 多変量・単変量
– 拘束 ある・なし• 区間/線形/非線形
– 関数の性質• 1次微分/平滑/Jacobian/ 小2乗
( )minnx
f xÎR
IMSL Fortran Math
subject to gi(x) = 0, for i = 1, 2, , m1gi(x) ≧ 0, for i = m1 + 1, , m
subject to li ≦xi ≦ui, for i = 1, 2, , n
subject to Ax = b
86
www.vnij.comCh. 8 適化
Optimization
nonsmooth
UMCGF no derivative large-size
least squaresno Jacobian
no derivative
nonsmooth
UNLSF
UVMSG
UVMIF
UMCGG
UNLSJ
UMPOL
UMINF
UMINGUMIDH
UVMID UMIAH
no firstderivative
no second
problem
derivative
UNCONSTRAINEDMINIMIZATION
univariate multivariate
smooth
IMSL Fortran Math
Function values only
Gradient is available
Jacobian is available
Gradient is available
f’ & f’’ are available
Jacobian is available
87
www.vnij.comCh. 8 適化
Optimization
例: LCONF : M.J.D.Powellの方法による線形拘束の一般 適化問題の解法(p.1252)
min f(x) = -x1x2x3
Subject to –x1-2x2-2x3 ≤ 0x1+2x2+2x3 ≤ 720 ≤ x1 ≤ 200 ≤ x2 ≤ 110 ≤ x3 ≤ 42
USE LCONF_INTUSE UMACH_INT
! Declaration of variablesINTEGER NCON, NEQ, NVARPARAMETER (NCON=2, NEQ=0, NVAR=3)
!INTEGER MAXFCN, NOUTREAL A(NCON,NVAR), ACC, B(NCON), OBJ, &
SOL(NVAR), XGUESS(NVAR), XLB(NVAR), XUB(NVAR)EXTERNAL FCN
!DATA A/-1.0, 1.0, -2.0, 2.0, -2.0, 2.0/, B/0.0, 72.0/DATA XLB/3*0.0/, XUB/20.0, 11.0, 42.0/, XGUESS/3*10.0/DATA ACC/0.0/, MAXFCN/400/
!CALL UMACH (2, NOUT)
!CALL LCONF (FCN, NEQ, A, B, XLB, XUB, SOL, XGUESS=XGUESS, &
MAXFCN=MAXFCN, ACC=ACC, OBJ=OBJ)!
WRITE (NOUT,99998) ’Solution:’WRITE (NOUT,99999) SOLWRITE (NOUT,99998) ’Function value at solution:’WRITE (NOUT,99999) OBJWRITE (NOUT,99998) ’Number of function evaluations:’, MAXFCNSTOP
99998 FORMAT (//, ’ ’, A, I4)99999 FORMAT (1X, 5F16.6)
END!
SUBROUTINE FCN (N, X, F)INTEGER NREAL X(*), F
!F = -X(1)*X(2)*X(3)RETURNEND
OutputSolution:20.000000 11.000000 15.000000
Function value at solution:-3300.000000
Number of function evaluations: 5
IMSL Fortran Math
88
www.vnij.comCh. 8 適化
Optimization
USE NNLPF_INTUSE WRRRN_INTINTEGER IBTYPE, M, MEPARAMETER (IBTYPE=0, M=2, ME=1)
!REAL(KIND(1E0)) FVALUE, X(2), XGUESS(2), XLB(2), XUB(2)EXTERNAL FCN, GRAD
! XLB = -HUGE(X(1))XUB = HUGE(X(1))
!CALL NNLPF (FCN, M, ME, IBTYPE, XLB, XUB, X)
!CALL WRRRN ('The solution is', X)END
SUBROUTINE FCN (X, IACT, RESULT, IERR)INTEGER IACTREAL(KIND(1E0)) X(*), RESULTLOGICAL IERR
! SELECT CASE (IACT)CASE(0)
RESULT = (X(1)-2.0E0)**2 + (X(2)-1.0E0)**2CASE(1)
RESULT = X(1) - 2.0E0*X(2) + 1.0E0CASE(2)
RESULT = -(X(1)**2)/4.0E0 - X(2)**2 + 1.0E0END SELECTRETURNEND
OutputThe solution is1 0.82292 0.9114
( ) ( ) ( )( )( )
2 21 2
1 1 2
2 22 1 2
min 2 1
subject to 2 1 0
/ 4 1 0
F x x x
g x x x
g x x x
= - + -
= - + =
= - - + ³
例:P.Spellucci の方法による非線形 適化(p.1266)NNLP : 逐次2次計画法 (SQP: Sequential Quadratic Programming)
IMSL Fortran Math
89
www.vnij.comCh. 9 基本的な行列とベクトル演算
Basic Matrix / Vector Operations
1. 行列とベクトルの基本演算
2. BLAS (Basic Linear Algebra Subprograms)http://www.netlib.org/blas/
– Level 1 ベクトルとベクトル・スカラの演算
– Level 2 ベクトルと行列の演算
– Level 3 行列と行列の演算
3. その他– 行列のコピー、変換、演算、ノルム、距離、たたみ
込み
– 4倍精度計算ルーチン
IMSL Fortran Math
BLAS routine
90
www.vnij.comCh. 9 基本的な行列とベクトル演算
Basic Matrix / Vector Operations BLAS 1
DHPRODSHPRODzi ← xiyi
ZQDOTIZQDOTA
CZDOTICZDOTA
DQDOTIDQDOTA
SDDOTISDDOTA
b + x・ y (*)ACC + b + x ・y
ZQUDOTZQCDOT
CZUDOTCZCDOT
DQDDOTSDSDOTa + x ・y (*)
ZQDOTUZQDOTC
CZDOTUCZDOTC
DSDOTx・ y (*)
ZDOTUZDOTC
CDOTUCDOTC
DDOTSDOTx・y
ZSWAPCSWAPDSWAPSSWAPISWAPyi ⇔xi
ZAXPYCAXPYDAXPYSAXPYyi ←axi + yi
ZSUBCSUBDSUBSSUBISUBxi ←a – xi
ZADDCADDDADDSADDIADDxi ←xi + a
ZVCALZDVCAL
CVCALCSVCAL
DVCALSVCALyi ← axia ∈R
ZSCALZDSCAL
CSCALCSSCAL
DSCALSSCALxi ←axia ∈R
ZCOPYCCOPYDCOPYSCOPYICOPYyi ←xi
ZSETCSETDSETSSETISETxi ← a
DoubleComplex
ComplexDoubleRealIntegerOperation
IMSL Fortran Math
BLAS routine
(*) 高精度ルーチン
91
www.vnij.comCh. 9 基本的な行列とベクトル演算
Basic Matrix / Vector Operations BLAS 1
IZAMINICAMINIDAMINISAMINi : |xi| = minj |xj|
IDMAXISMAXIIMAXi : xi = maxj xj
IDMINISMINIIMINi : xi = minj xj
DPRDCTSPRDCTПxi
DZNRM2SCNRM2DNRM2SNRM2||x||2
DZASUMSCASUMDASUMSASUMΣ|xi|
DSUMSSUMISUMΣxi
DXYZSXYZΣxiyizi
DoubleComplex
ComplexDoubleRealIntegerOperation
ZDROTMCSROTMDROTMSROTMApply modified Givens transform
DROTMGSROTMGConstruct modified Givens transform
ZDROTCSROTDROTSROTApply a plane rotation
DROTGSROTGConstruct Givens plane rotation
IZAMAXICAMAXIDAMAXISAMAXi : |xi| = maxj |xj|
DoubleComplex
ComplexDoubleRealIntegerOperation
IMSL Fortran Math
BLAS routine
92
www.vnij.comCh. 9 基本的な行列とベクトル演算
Basic Matrix / Vector Operations BLAS 2
DSYRSSYRRank-One Matrix Update, Symmetric and Real
ZHER2CHER2Rank-Two Matrix Update, Hermitian and Conjugate Transpose
ZHERCHERRank-One Matrix Update, Hermitian and Conjugate Transpose
ZGERCCGERCRank-One Matrix Update, General, Complex, and Conjugate Transpose
ZGERUCGERURank-One Matrix Update, General, Complex and Transpose
DGERSGERRank-One Matrix Update, General and Real
ZTBSVCTBSVDTBSVSTBSVMatrix-Vector Solve, Triangular and Banded
ZTRSVCTRSVDTRSVSTRSVMatrix-Vector Solve, Triangular
ZTBMVCTBMVDTBMVSTBMVMatrix-Vector Multiply, Triangular and Banded
ZTRMVCTRMVDTRMVSTRMVMatrix-Vector Multiply, Triangular
DSBMVSSBMVMatrix-Vector Multiply, Symmetric and Banded
DSYMVSSYMVMatrix-Vector Multiply Symmetric and Real
ZHBMVCHBMVMatrix-Vector Multiply,Hermitian and Banded
ZHEMVCHEMVMatrix-Vector Multiply, Hermitian
ZGBMVCGBMVDGBMVSGBMVMatrix-Vector Multiply, Banded
ZGEMVCGEMVDGEMVSGEMVMatrix-Vector Multiply, General
DoubleComplexComplexDoubleRealOperation
IMSL Fortran Math
93
www.vnij.comCh. 9 基本的な行列とベクトル演算
Basic Matrix / Vector Operations BLAS 3
ZTRSMCTRSMDTRSMSTRSMMatrix-Matrix solve, Triangular
ZTRMMCTRMMDTRMMSTRMMMatrix-Matrix Multiply, Triangular
ZHER2KCHER2KRank - 2k Update, Hermitian
ZSYR2KCSYR2KDSYR2KSSYR2KRank - 2k Update, Symmetric
ZHERKCHERKRank - k Update, Hermitian
ZSYRKCSYRKDSYRKSSYRKRank - k Update, Symmetric
ZHEMMCHEMMMatrix-Matrix Multiply, Hermitian
ZSYMMCSYMMDSYMMSSYMMMatrix-Matrix Multiply, Symmetric
ZGEMMCGEMMDGEMMSGEMMMatrix--Matrix Multiply, General
DSYR2SSYR2Rank-Two Matrix Update,Symmetric and Real
DoubleComplex
ComplexDoubleRealOperation
IMSL Fortran Math
94
www.vnij.comCh. 9 基本的な行列とベクトル演算
Basic Matrix / Vector Operations
IMSL Fortran Math
CHBCBHermitian Band
CSBRBSymmetric Band
CHFCGHermitian Full
CSFRGSymmetric Full
CCBCBCCBCGComplex Band
CRBCBCRBRBCRBRGReal Band
CCGCBCCGCGComplex General
CRGRBCRGCGCRGRGReal General
ComplexBand
RealBand
ComplexGeneral
RealGeneral
From
To
行列のコピーと変換
95
www.vnij.comCh. 9 基本的な行列とベクトル演算
Basic Matrix / Vector Operations
IMSL Fortran Math
行列の積とノルム
MUCBVMURBVMUCRVMURRVVector
MCRCRComplex Rect.
MRRRRReal Rectangular
ComplexBand
RealBand
ComplexRect.
RealRect.
B
AAB
NR2RRFrobenius
NR1CBNR1RBNR1RR1-norm
NRIRR∞-norm
ComplexBand
RealBand
RealRectangular
||A||
1 1
maxn
iji m jA A
¥ £ £ =
= å
1 1 1max
m
ijj n iA A
£ £ =
= å1 2
22
1 1
m n
iji j
A A= =
é ù= ê úë ûåå
96
www.vnij.comCh. 10 線形代数演算子とジェネリック関数Linear Algebra Operators and Generic Functions
Yes
Yes
Yes
Yes
No
Yes
YesMPI
matmul(B, transpose(A)) matmul(B, conjg(transpose(A)))
BAT , BAHB .xt. A, or B .x. (.t. A) B .xh. A, or B .x. (.h. A)
matmul(transpose (A), B) matmul(conjg(transpose(A)), B)
ATB , AHBA .tx. B, or (.t. A) .x. B A .hx. B, or (.h. A) .x. B
lin_sol_gen lin_sol_lsq
BA-1B .xi. A
lin_sol_gen lin_sol_lsq
A-1BA .ix. B
transpose(A) conjg(transpose(A))
AT , AH.t. A, .h. A
lin_sol_gen lin_sol_lsq
A-1.i. A
matmul(A, B)ABA .x. BAlternative in Fortran 90Matrix OperationDefined Array Operation
IMSL Fortran Math
97
www.vnij.comCh. 10 線形代数演算子とジェネリック関数Linear Algebra Operators and Generic Functions
TA R R=
( ) , TA QR Q Q I= =
rank(A) = rank
det(A) = determinant
AV = VE), AVD = BVE(AW = WE), AWD = BWE
Matrix Operation
Yes
Yes
Yes
No
Yes
Yes
Yes
Yes
MPI
P=NORM(A[,[type=]i])K=RANK(A)F=DET(A)
U=UNIT(A)
Q=ORTH(A [,R=R])
R=CHOL(A)
E=EIG(A [[,B=B, D=D],V=V, W=W])
S=SVD(A [,U=U, V=V])Defined Array Functions
TA USV=
[ ]1 1 1, / ,u a a= é ùë û
( )
11
12
1=1
max ( )
largest singular value
max ( )
m
j iji
n
i ijhugej
p A a
p A s
p A a
=
¥«
= =
= = =
= =
å
å
IMSL Fortran Math
98
www.vnij.comCh. 10 線形代数演算子とジェネリック関数Linear Algebra Operators and Generic Functions
( )1 / rank As s
NZ I=
( )1,A diag x=
( )11,x a=
test for NaN, if (L) then …
random numbers, 0 < A < 1, of rank-1,2 and 3
Discrete Fourier Transform for Boxes, Inverse
Discrete Fourier Transform, Inverse
Matrix Operation
No
No
Yes
No
No
No
No
Yes
MPI
L=isNaN(A)
A=RAND(A)
Y=FFT_BOX (X,[WORK=W]);X=IFFT_BOX(Y,[WORK=W])
Y=FFT (X,[WORK=W]);X=IFFT(Y,[WORK=W])
X=DIAGONALS(A)
A=DIAG(X)
Z=EYE(N)
C=COND(A)
Defined Array Functions
IMSL Fortran Math
99
www.vnij.comCh. 10 線形代数演算子とジェネリック関数Linear Algebra Operators and Generic Functions
use linear_operatorsimplicit none
! This is Example 1 for LIN_SOL_GEN, with operators and functions.
integer, parameter :: n=32 real(kind(1e0)) :: one=1.0e0, err real(kind(1e0)), dimension(n,n) :: A, b, x
! Generate random matrices for A and b: A = rand(A); b=rand(b)
! Compute the solution matrix of Ax = b. x = A .ix. b
! Check the results. err = norm(b - (A .x. x))/(norm(A)*norm(x)+norm(b)) if (err <= sqrt(epsilon(one))) &
write (*,*) 'Example 1 for LIN_SOL_GEN (operators) is correct.' end
例:連立一次式 Ax = b を解く(p.1434):
x=A-1b ; 残差 r=b-Ax
IMSL Fortran Math
100
www.vnij.comCh. 11 ユーティリティ
Utilities
1. ScaLAPACKユーティリティ
– ファイル入出力:ScaLAPACK用のblock-cyclicフ
ォーマットに変換
2. 乱数生成 (Stat Ch.18参照)
3. オプションマネージャ
4. 印刷、配列の置換・ソート・並替え、検索、文字列操作、時間・日付、素因数分解、常数、単位換算 (Stat Ch.19も参照)
IMSL Fortran Math
IMSL Fortran 各章概要
特殊関数Special Functions
IMSL Fortran
102
www.vnij.com Ch. 1 基本関数 Elementary FunctionsCh. 2 三角関数と双曲線関数
Trigonometric and Hyperbolic Functions
1. 基本関数複素数の偏角 arg(z) =θ= tan-1(y/x) for z = x + iy = |z|eiθ
実・複素数の3乗根 z1/3
実・複素数の (ez – 1)/z 複素数の常用対数 log10z実・複素数の ln(z + 1)
2. 三角関数と双曲線関数tan(z), cot(x), sin(x゜), cos(x゜), sin-1(z), cos-1(z), tan-1(z), tan-1(z1/z2)sinh(z), cosh(z), tanh(z), sinh-1(z), cosh-1(z), tanh-1(z)
IMSL Fortran SFun
103
www.vnij.comCh. 3 指数積分と関連する関数Exponential Integrals and Related Functions
1. 指数積分 :
IMSL Fortran SFun
Figure 3-1 Plot of exEn(x), E1(x) and Ei(x)
Ei( ) / for 0t
xx e t dt x
¥ -
-= - ¹ò
1( ) / for 0t
xE x e t dt x
¥ -= ¹ò
1( ) for 0x xt n
nE x e e t dt x¥ - -= >ò
104
www.vnij.comCh. 3 指数積分と関連する関数Exponential Integrals and Related Functions
2. 対数積分:li(x)はx以下の素数の数π(x)に近似
3. 三角関数積分:
4. 双曲線関数積分:
IMSL Fortran SFun
0li( ) for 0 and 1
lnx dtx x x
t= - > ¹ò
0sinSi( )=
x tx dttò 0
1 cosCi( ) lnx
ttx x d
tg -
= + + ò
0
1 cosCin( )x tx dt
t-
= ò
0
sinhShi( )x tx dt
t= ò
0
cosh 1Chi( ) ln for 0x tx x dt x
tg -
= + + >ò
0
cosh 1Cinh( )x tx dt
t-
= ò
γはEulerの定数
γ≒0.57721566....
105
www.vnij.comCh. 4 ガンマ関数と関連する関数Gamma Function and Related Functions
Gamma関数その他(階乗、二項係数、完全・不完全Γ、Ψ、β、Pochhammerの記号(a)x
FAC n! = Γ(n + 1)
BINOM nCm = n!/m!(n - m)!
GAMMA ( ) 10 , 0, 1, 2,t xx e t dt x¥ - -G = ¹ - -ò
GAMR 1/Γ (x)
ALNGAM ln |Γ (x)|
ALGAMS ln |Γ (x)| and signΓ (x)
GAMI ( ) 10, , 0, 0x a ta x t e dt a xg - -= > ³ò
GAMIC ( ) 1, , 0a txa x t e dt x¥ - -G = >ò
POCH1 ((a)x - 1)/x, if a + x = 0, -1, -2, then a must = 0, -1, -2,
BETA β(x1, x2) = Γ(x1)Γ(x2)/Γ(x1 + x2), x1 > 0 and x2 > 0
CBETA β(z1, z2) = Γ(z1)Γ(z2)/Γ(z1 + z2), z1 > 0 and z2 > 0
ALBETA ln β(a, b), a > 0, b > 0
BETAI Ix(a, b) = βx(a, b)/β(a, b), 0 <x <1, a > 0, b > 0
IMSL Fortran SFun
x ≠0, -1, -2, …
GAMIT γ*(a, x) = (x-a/Γ(a))γ(a, x)
PSI Ψ(x) = Γ’(x)/Γ(x)
POCH (a)x = Γ(a + x)/Γ(a), if a + x = 0, -1, -2, then a must = 0, -1, -2,
x ≠0, -1, -2, …
x ≧0
106
www.vnij.comCh. 5 誤差関数と関連する関数Error Function and Related Functions
誤差関数
補誤差関数 erfc(x) = 1 – erf(x)
ex2erfc(x), e-z2
erfc(-iz), erf-1(x), erfc-1(x)
Dawson関数
Fresnel積分
2
0
2erf ( )x tx e dt
p-= ò
2 2
0
xx te e dt- ò
2
0( ) cos
2x
C x t dtpæ ö= ç ÷è øò 2
0( ) sin
2x
S x t dtpæ ö= ç ÷è øò
1( ) ( ) erf (1 )2 2
iC z iS z i zpæ ö++ = -ç ÷ç ÷
è ø
IMSL Fortran SFun
107
www.vnij.comCh. 6 ベッセル関数
Bessel Functions
ベッセル関数とその列
BSKESBSK1EBSK0Ee-|x|Kv (x)
CBKSBSKSBSK1BSK0Kv (x)
BSIESBSI1EBSI0Ee-|x|Iv (x)
CBISBSINSBSISBSINSBSI1BSI0Iv (x)
CBYSBSYSBSY1BSY0Yv(x)
CBJSBSJNSBSJSBSJNSBSJ1BSJ0Jv(x)
RealIntegerrealinteger10FunctionOrderOrder
Complex ArgumentReal Argument
1種
変形2種
2種
変形1種
変形1種
変形2種
IMSL Fortran SFun
108
www.vnij.com
Ch.7 Kelvin関数とそれらの導関数
• 1種、2種
• 0次、1次
Ch.8 Airy関数とそれらの導関数と指数スケール
• 1種、2種
Ch. 7 ケルビン関数 Kelvin FunctionsCh. 8 エアリ関数 Airy Functions
3 / 4ber bei ( )iv v vx i x J xe p+ =
/ 2 / 4ker kei ( )i iv v vx i x e K xenp p-+ =
( ) 3 3 / 21/ 320
1 1 2Ai cos3 33
xx xt t dt K xp p
¥ æ ö æ ö= + =ç ÷ ç ÷è ø è øò
( ) 3 3
0 0
1 1 1 1Bi exp sin3 3
x xt t dt xt t dtp p
¥ ¥æ ö æ ö= - + +ç ÷ ç ÷è ø è øò ò
IMSL Fortran SFun
109
www.vnij.com Ch. 9 楕円積分 Elliptic IntegralsCh. 10 楕円関数 Elliptic and RelatedFunctions
Ch.9 楕円積分• 1種、2種完全
• Carlsonの不完全楕円積分1種、2種、3種、特殊
Ch.10 楕円関数• Weierstrass
• Jacobi sn(x,m) = sinφ, cn(x,m) = cosφ、 ここでφは
( ) ( )1/ 2/ 2 2
01 sinK m m d
pq q
-
= -ò ( ) ( )1/ 2/ 2 2
01 sinE m m d
pq q= -ò
( )( ) ( )( ) 1/ 20
1, ,2F
dtR x y zt x t y t z
¥=
+ + +é ùë ûò
( )( )( )( )
1/ 20 3
3, ,2D
dtR x y zt x t y t z
¥=
é ù+ + +ë ûò
( )( )( )( )( )
1/ 20 2
3, , ,2J
dtR x y zt x t y t z t
rr
¥=
é ù+ + + +ë ûò
( )1
20 21 sin
dxm
f q
q=
-ò
IMSL Fortran SFun
( )( ) ( )
1/ 20 2
1,2C
dtR x yt x t y
¥=
é ù+ +ë ûò
110
www.vnij.com Ch. 11確率分布関数とその逆関数Probability Distribution Functions and Inverses(Stat Ch.17も参照)
1. 離散確率変数:分布関数と確率関数• 二項分布• 超幾何分布• Poisson分布
2. 連続確率変数:分布関数とその逆関数• 標準正規(Gauss)分布、 2変量(係数ρ)
• ベータ分布• χ2分布、 非中心• F 分布• Γ 分布• Studentのt 分布、 非中心• Kolmogorov-SmirnovのD+,D-適合度検定統計値の分布関数、
1および2 標本
• ユーザ指定
IMSL Fortran SFun
( ) ( )2 2
22
1 2, exp2 12 1
x y u uv vF x y du dvrrp r -¥ -¥
æ ö- +ç ÷= -ç ÷-- è ø
ò ò
111
www.vnij.com Ch. 12 マシュウ関数 Mathieu FunctionsCh. 13 その他の関数 Misc Functions
Ch.12 Mathieu関数
• Mathieuの方程式楕円座標系でのLaplaceの式
• 固有値:周期kπになる分離常数a• 偶・奇周期Mathieu関数
Ch.13 その他の関数
• Spenceの二重対数関数(dilogarithm)
• Chebyshev級数
( )2
2 2 cos 2 0d y a q v ydv
+ - =
( )0
ln 1x ys x dy
y-
= -ò
IMSL Fortran SFun
IMSL Fortran 各章概要
統計解析Statistics
113
www.vnij.comCh. 1 基本統計
Basic Statistics
1. 度数分布表 (frequency table)– 1元、2元、多変量データ (Stat Ch.5も参照)
2. 単変量データの統計値 (平均、標準偏差など)
3. 順位(rank)と順序(order)統計量
4. 母数推定(parametric estimate)と検定(test)– 2つの標本に対する t 検定、F 検定
– 正規分布・二項分布・Poisson分布のパラメータの推定
5. グループ化されたデータの統計量
6. テーブル内の連続データの統計量 (Stat Ch.5も参照)
IMSL Fortran Stat
114
www.vnij.comCh. 1 基本統計
Basic Statistics
USE TWOMV_INTINTEGER IPRINTREAL CONPRV, STAT(25), X(7), Y(9)
! DATA X/72., 75., 77., 80., 104., 110., 125./Y/111., 118., 128., &
138., 140., 150., 163., 164., 169./!
IPRINT = 2CONPRV = 0.0CALL TWOMV (X, Y, STAT, IPRINT=IPRINT, CONPRV=CONPRV)END
OutputMean Inferences Assuming Equal VariancesPooled Variance 434.633t Value -4.804Probability of a Larger t in Abs. Value 0.000Degrees of Freedom 14.000Lower Confidence Limit Difference in Means -73.010Upper Confidence Limit Difference in Means -27.942
例:2つの標本(テストの成績)の平均の検定(p.44)• グループXはグループYよ
り平均は低いか?
• 2つの母集団の分散は同じとして t 検定を行う。
• 帰無仮説 μx<μyは5%
の有意水準で棄却される。
(1/ ) (1/ )x y
x yts n n
-=
+
IMSL Fortran Stat
115
www.vnij.comCh. 2 回帰
Regression
1. 単純線形回帰分析
2. 多変量一般線形モデル分析– モデルの当てはめ
– 統計的推論と診断
– 分類変数のためのユーティリティ
3. 変数の選択– Furnival-Wilsonの 良の多重線形回帰モデル
– Efryomson-Goodnightの前進・後退・ステップワイズによる多重線形回帰モデル
4. 多項式回帰分析
5. 非線形回帰分析
6. 小2乗以外での線形モデルへの当てはめ– 小絶対値(LAV, L1)、Lpノルム 、 小 大値(Minimax,L∞ )
IMSL Fortran Stat
1 1,2, ,i i iy x i nob b e= + + =
1 1 2 2 ... 1,2,...,i i i k ik iy x x x i nob b b b e= + + + + + =
21 2 .... 1, 2, ,k
i i i k i iy x x x i nob b b b e= + + + + + =
Y = XB + e
( ; ) 1,2, ,i i iy f x i nq e= + =
( )1/
1ˆ
pn pi ii
y y=
-å
116
www.vnij.comCh. 2 回帰
Regression
USE RLSE_INTUSE WRRRN_INTUSE UMACH_INTINTEGER INTCEP, LDX, NCOEF, NIND, NOBSPARAMETER (INTCEP=1, NIND=3, NOBS=9, LDX=NOBS, &
NCOEF=INTCEP+NIND)!
INTEGER NOUTREAL B(NCOEF), SSE, SST, X(LDX,NIND), Y(NOBS)
!DATA (X(1,J),J=1,NIND)/ 7.0, 5.0, 6.0/, Y(1)/ 7.0/DATA (X(2,J),J=1,NIND)/ 2.0, -1.0, 6.0/, Y(2)/-5.0/DATA (X(3,J),J=1,NIND)/ 7.0, 3.0, 5.0/, Y(3)/ 6.0/DATA (X(4,J),J=1,NIND)/-3.0, 1.0, 4.0/, Y(4)/ 5.0/DATA (X(5,J),J=1,NIND)/ 2.0, -1.0, 0.0/, Y(5)/ 5.0/DATA (X(6,J),J=1,NIND)/ 2.0, 1.0, 7.0/, Y(6)/-2.0/DATA (X(7,J),J=1,NIND)/-3.0, -1.0, 3.0/, Y(7)/ 0.0/DATA (X(8,J),J=1,NIND)/ 2.0, 1.0, 1.0/, Y(8)/ 8.0/DATA (X(9,J),J=1,NIND)/ 2.0, 1.0, 4.0/, Y(9)/ 3.0/
!
!CALL RLSE (Y, X, B, SST=SST, SSE=SSE)CALL WRRRN (’B’, B)CALL UMACH (2, NOUT)WRITE (NOUT,*)WRITE (NOUT,99999) ’SST = ’, SST, ’ SSE = ’, SSE
99999 FORMAT (A7, F7.2, A7, F7.2)END
OutputB
1 7.7332 -0.2003 2.3334 -1.667
SST = 156.00 SSE = 4.00
例: 小2乗による多重線形回帰(p.108)yi= b0 + b1xi1 + b2xi2 + b3xi3 + ei i = 1,2, ¼, 9
2
1
ˆSSE ( )n
i ii
y y=
= -å 2
1SST ( )
n
ii
y y=
= -å
IMSL Fortran Stat
117
www.vnij.comCh. 2 回帰
Regression
INTEGER LDR, NOBS, NPARMPARAMETER (NOBS=15, NPARM=2, LDR=NPARM)
!INTEGER IRANK, NOUTREAL DFE, R(LDR,NPARM), SSE, THETA(NPARM)EXTERNAL EXAMPL
!DATA THETA/60.0, -0.03/CALL UMACH (2, NOUT)
!CALL RNLIN (EXAMPL, THETA, R=R, IRANK=IRANK, DFE=DFE, SSE=SSE)WRITE (NOUT,*) ’THETA = ’, THETAWRITE (NOUT,*) ’IRANK = ’, IRANK, ’ DFE = ’, DFE, ’ SSE = ’, &
SSECALL WRRRN (’R’, R)END
!SUBROUTINE EXAMPL (NPARM, THETA, IOPT, IOBS, FRQ, WT, E, DE, &
IEND)INTEGER NPARM, IOPT, IOBS, IENDREAL THETA(NPARM), FRQ, WT, E, DE(1)
!INTEGER NOBSPARAMETER (NOBS=15)REAL EXP, XDATA(NOBS), YDATA(NOBS)INTRINSIC EXP
!DATA YDATA/54.0, 50.0, 45.0, 37.0, 35.0, 25.0, 20.0, 16.0, 18.0, &
13.0, 8.0, 11.0, 8.0, 4.0, 6.0/DATA XDATA/2.0, 5.0, 7.0, 10.0, 14.0, 19.0, 26.0, 31.0, 34.0, &
38.0, 45.0, 52.0, 53.0, 60.0, 65.0/
例:非線形回帰モデル(p.306) 修正Levenberg-Marquardtの非線形 小2乗法による。
IMSL Fortran Stat
21 1,2, ,15ix
i iy e iqq e= + =
IF (IOBS .LE. NOBS) THENWT = 1.0E0FRQ = 1.0E0IEND = 0E = YDATA(IOBS) - THETA(1)*EXP(THETA(2)*XDATA(IOBS))
ELSEIEND = 1
END IFRETURNEND
OutputTHETA = 58.6045 -3.95835E-02IRANK = 2 DFE = 13.0000 SSE = 49.4593
118
www.vnij.comCh. 2 回帰
Regression
PARAMETER (NCOEF=2, NCOL=2, NOBS=7, LDX=NOBS)!
INTEGER IIND, INDIND(1), IRANK, IRSP, ITER, NOUT, &NRMISS
REAL B(NCOEF), AEMAX, X(LDX,NCOL)CHARACTER CLABEL(1)*4, RLABEL(1)*4
!DATA (X(1,J),J=1,NCOL)/0.0, 0.0/DATA (X(2,J),J=1,NCOL)/1.0, 2.5/ ,,,DATA (X(7,J),J=1,NCOL)/5.0, 5.0/
!IIND = -1IRSP = 2
!CALL RLMV (X, IIND, INDIND, IRSP, B, IRANK=IRANK, AEMAX=AEMAX, &
ITER=ITER, NRMISS=NRMISS)!
CALL UMACH (2, NOUT)RLABEL(1) = ’B =’CLABEL(1) = ’NONE’CALL WRRRL (’ ’, B, RLABEL, CLABEL, 1, NCOEF, 1, FMT=’(F6.2)’)WRITE (NOUT,*) ’IRANK = ’, IRANKWRITE (NOUT,*) ’AEMAX = ’, AEMAXWRITE (NOUT,*) ’ITER = ’, ITERWRITE (NOUT,*) ’NRMISS = ’, NRMISSEND
OutputB = 1.00 1.00IRANK = 2AEMAX = 1.00000ITER = 3NRMISS = 0
例:LMV(least max value, minimax)による多重線形回帰(p.335)
IMSL Fortran Stat
1ˆmax i ii n
y y£ £
- を 小にする
119
www.vnij.comCh. 3 相関
Correlation
1. 相関行列 (correlation matrix)– 相関– 共分散行列 (covariance matrix)– 偏相関係数 (partial correlations)– 相関行列のロバスト推定 (M-estimate)
2. 分割表の相関測度(correlation measure)– r x c 分割表 (contingency table)– 4分相関係数 (tetrachoric correlation)
3. 分類変数を伴う二分変数 (dichotomous variable)
4. 順位(rank)に基づく測度(measure)– Kendallの一致係数 (coefficient of concordance)– Kendallの順位相関係数τ
IMSL Fortran Stat
120
www.vnij.comCh. 3 相関
Correlation
INTEGER LDCOV, LDINCD, LDX, NVARPARAMETER (LDCOV=5, LDINCD=1, LDX=150, NVAR=5)
!INTEGER INCD(LDINCD,1), NMISS, NOBS, NOUT, NROW, NVREAL COV(LDCOV,NVAR), SUMWT, X(LDX,NVAR), XMEAN(NVAR)
!CALL GDATA (3, X, NOBS, NV)
!CALL UMACH (2, NOUT)NROW = 50
!CALL CORVC (NVAR, X, COV, NROW=NROW, XMEAN=XMEAN, INCD=INCD,
& NOBS=NOBS, NMISS=NMISS, SUMWT=SUMWT)!
CALL WRRRN (’XMEAN’, XMEAN, 1, NVAR, 1, 0)CALL WRRRN (’COV’, COV)CALL WRIRN (’INCD’, INCD)WRITE (NOUT,*) ’ NOBS = ’, NOBS, ’ NMISS = ’, NMISS, ’ SUMWT = ’, &
SUMWTEND
OutputXMEAN
1 2 3 4 51.000 5.006 3.428 1.462 0.246
COV1 2 3 4 5
1 0.0000 0.0000 0.0000 0.0000 0.00002 0.0000 0.1242 0.0992 0.0164 0.01033 0.0000 0.0992 0.1437 0.0117 0.00934 0.0000 0.0164 0.0117 0.0302 0.00615 0.0000 0.0103 0.0093 0.0061 0.0111
INCD 50
NOBS = 50 NMISS = 0 SUMWT = 50.0000
例:分散、共分散、相関行列の計算
(p.343)
Fisherのiris データの 初の50個
(あやめ3種、50個づつ、花弁とがくの大きさ2種)
1
1
r
r
ni i i ki
k ni i i
f w xx
f w=
=
= åå
標本平均
標本共分散
標本相関行列
( )1
1
( )( )
1
ni i i ji j ki k
jk nii
f w x x x xs
f=
=
- -=
-
åå
jkjk
jj kk
sr
s s=
IMSL Fortran Stat
121
www.vnij.comCh. 4 分散分析
Analysis of Variance
1. 一般解析– 1元配置モデル(one-way classification model)– 乱塊法(randomized block design)、2元配置法– 釣合い型不完備ブロック計画、格子計画(lattice design)– ラテン方格法(Latin square design)– 釣合い型n元配置モデル
– 釣合い型完備実験計画法(固定効果・変量効果・混合モデル)– ランダムなネストされたモデル
2. 平均と分散の推定– コントラスト(平均の線形結合)の推定と平方和– 同時信頼区間(simultaneous confidence interval)の計算
• Tukey, Tukey-Kramer, Dunn-Sidak, Bonferroni, Scheffe, Fisher’s LSDの方法
– Student-Newman-Keulsの多重比較検定(multiple comparison test)– 分散に関する信頼区間の計算
• GraybillあるいはBrossの方法
3. 釣合い型実験計画からデータを再配置
IMSL Fortran Stat
122
www.vnij.comCh. 4 分散分析
Analysis of Variance
USE AONEW_INTINTEGER NGROUP, NOBSPARAMETER (NGROUP=3, NOBS=6)
!INTEGER IPRINT, NI(NGROUP)REAL AOV(15), Y(NOBS)
!DATA NI/3, 2, 1/DATA Y/101.0, 105.0, 94.0, 84.0, 88.0, 32.0/
!IPRINT = 3CALL AONEW (NI, Y, AOV, IPRINT=IPRINT)END
OutputDependent R-squared Adjusted Est. Std. Dev. Coefficient ofVariable (percent) R-squared of Model Error Mean Var. (percent)Y 98.028 96.714 4.83 84 5.751
* * * Analysis of Variance * * *Sum of Mean Prob. of
Source DF Squares Square Overall F Larger FAmong Groups 2 3480 1740.0 74.571 0.0028Within Groups 3 70 23.3Corrected Total 5 3550
Group StatisticsStandard
Group N Mean Deviation1 3 100 5.5682 2 86 2.8283 1 32 NaN
例:1元配置モデルの分析(p.394)
3タイプの植物6個の重量
yij = mi + eij i = 1, 2, ¼, k; j = 1, 2, ¼, ni
8810594
3284101
AberrantOff-TypeNormal
Type of Plant
IMSL Fortran Stat
123
www.vnij.comCh. 5 カテゴリ・データと離散データの解析
Categorical and Discrete Data Analysis
1. 2元分割表(two-way contingency table)の統計量の計算– 2x2分割表の統計量
• Pearsonχ2 、χ2の 尤推定量、自由度、Yates係数、Fisherの正確な検定、φ、P、γ、Kendallのτb、Stuartのτc、SomerのD、積率係数、Spearmanの順位係数、GoodmanとKruskalのτ、不確定性係数、Kruskal-Wallis統計、その他
– r x c 分割表のχ2解析– 全体枚挙法(total enumeration method)による正確な計算– ネットワークアルゴリズムによるFisherの正確な計算
2. 対数線形モデル(log-linear model)3. 無作為検定(randomization test)
– 層別分割表のMantel-Haenszel統計
4. カテゴリデータ(categorical data)の解析– 一般化線形モデル
• ロジスティック、Probit、Poisson、Log-logその他のモデル
5. 重み付き 小2乗法分析
IMSL Fortran Stat
124
www.vnij.comCh. 5 カテゴリ・データと離散データの解析
Categorical and Discrete Data Analysis
USE CTTWO_INTINTEGER IPRINT, LDCHIC, LDEXPE, LDSTAT, LDTABLPARAMETER (IPRINT=1, LDCHIC=3, LDEXPE=3, LDSTAT=24,
LDTABL=2)!
REAL CHICTR(LDCHIC,3), CHISQ(15), EXPECT(LDEXPE,3), &STAT(LDSTAT,5), TABLE(LDTABL,2)
!DATA TABLE/4, 1, 16, 21/
!CALL CTTWO (TABLE, EXPECT, CHICTR, CHISQ, STAT,
IPRINT=IPRINT)END
OutputTABLE
1 21 4.00 16.002 1.00 21.00
Expected valuesCol 1 Col 2 Marginal
Row 1 2.3810 17.6190 20.0000Row 2 2.6190 19.3810 22.0000Marginal 5.0000 37.0000 42.0000
Contributions to chi-squaredCol 1 Col 2 Total
Row 1 1.1010 0.1488 1.2497Row 2 1.0009 0.1353 1.1361Total 2.1018 0.2840 2.3858
CHISQ1
Pearson chi-squared 2.3858p-value 0.1224Degrees of freedom 1.0000Likelihood ratio 2.5099p-value 0.1131etc
STATStatistic Std err. Std err. 0 t-value p-value
Gamma 0.6800 0.3135 0.4395 1.5472 0.1218Kendall’s tau B 0.2383 0.1347 0.1540 1.5472 0.1218Stuart’s tau C 0.1542 0.0997 NaN 1.5472 0.1218Somers’ D row 0.1545 0.0999 0.0999 1.5472 0.1218etcYule’s Y 0.3923 0.2467 0.2385 1.6450 0.1000Ratio 5.2500 NaN NaN NaN NaNLog ratio 1.6582 1.1662 0.9540 1.7381 0.0822Linear trend -0.1545 0.1001 NaN -1.5446 0.1224Kappa 0.1600 0.1572 0.1600 1.0000 0.3173McNemar 13.2353 1.0000 NaN 0.0000 0.0003
例:母乳とミルクの幼児の歯の比較(p.483)2 x 2 分割表の統計量の計算
IMSL Fortran Stat
125
www.vnij.comCh. 6 ノンパラメトリック統計
Nonparametric Statistics
1. 1標本又は配偶標本 (matched sample)– 位置の検定(location test)
• 符号検定 (sign test)• Wilcoxonの符号付き順位検定(signed rank test)
– 傾向の検定(trend test)• Noetherの検定
• Cox-Stuartの傾向の検定(trends test)– 同順位統計(tie statistics)
2. 2標本– Wilcoxonの順位和検定(rank sum test)– 包含検定(includance test)
3. 3つ以上の標本– 位置の1元配置検定
• Kruskal-Wallis検定• BhapkarのV検定
– 位置の2元配置検定• Friedman検定• CochranのQ検定
– 傾向の検定
IMSL Fortran Stat
126
www.vnij.comCh. 6 ノンパラメトリック統計
Nonparametric Statistics
USE SIGNT_INTUSE UMACH_INTINTEGER NOBSREAL P, QPARAMETER (NOBS=19, P=0.75, Q=0.0)
!INTEGER NMISS, NOUT, NPOS, NTIEREAL PROB, X(NOBS)
!DATA X/92.0, 139.0, -6.0, 10.0, 81.0, -11.0, 45.0, -25.0, -4.0, &
22.0, 2.0, 41.0, 13.0, 8.0, 33.0, 45.0, -33.0, -45.0, -12.0/! Perform sign test
CALL SIGNT (X, Q, P, NPOS, NTIE, PROB, NMISS)! Print output
CALL UMACH (2, NOUT)WRITE (NOUT,99996) NPOSWRITE (NOUT,99997) NTIEWRITE (NOUT,99998) PROBWRITE (NOUT,99999) NMISS
!99996 FORMAT (’ Number of positive differences = ’, I2)99997 FORMAT (’ Number of ties = ’, I2)99998 FORMAT (’ PROB = ’, F6.3)99999 FORMAT (’ Number of missing values = ’, I2)
END
OutputNumber of positive differences = 12Number of ties = 0PROB = 0.923Number of missing values = 0
例:符号検定 (p.593)帰無仮説 H0 : Pr(X £ Q) £ P
対立仮説 H1 : Pr(X £ Q) > P
PROBが0.95以下なので、5%の優位水準でH0(少なくとも75%(P=0.75)は負(Q=0))を棄却できない。
IMSL Fortran Stat
127
www.vnij.comCh. 7 適合度検定とランダム度の検定
Test of Goodness of Fit and Randomness
1. 特定の分布に対する適合度検定(goodness-of-fit)– Kolmogorov-Smirnov検定
– χ2検定
– Shapiro-WilkのW検定
– Lillieforsの検定
– Mardiaの検定
2. 2標本検定– Kolmogorov-Smirnov検定
3. ランダム度の検定– 連検定(run test)– ペア検定(Goodの系列検定 serial test)– d2検定
– 3重項検定(triplet test)
IMSL Fortran Stat
128
www.vnij.comCh. 7 適合度検定とランダム度の検定
Test of Goodness of Fit and Randomness
USE RNSET_INTUSE RNUN_INTUSE KSONE_INTUSE UMACH_INTINTEGER ISEED, NOBSPARAMETER (ISEED=123457, NOBS=100)
!INTEGER NMISS, NOUTREAL CDF, PDIF(6), X(100)EXTERNAL CDF
! Generate the sampleCALL RNSET (ISEED)CALL RNUN (X)
!CALL KSONE (CDF, X, PDIF, NMISS=NMISS)
!CALL UMACH (2, NOUT)WRITE (NOUT,99999) NMISS, PDIF
99999 FORMAT (’NMISS = ’, I4/’ D = ’, F8.4/’ D+ = ’, F8.4/ &’ D- = ’, F8.4/’ Z = ’, F8.4/’ Prob greater D’, &’ one-sided = ’, F8.4/’ Prob greater D two-sided = ’, &F8.4)
END
! The CDF!
REAL FUNCTION CDF (X)REAL X
!REAL AMEAN, STDPARAMETER (AMEAN=0.50, STD=0.2886751)
!REAL ANORDF, ZEXTERNAL ANORDF
! StandardizeZ = (X-AMEAN)/STD
! Get the probabilityCDF = ANORDF(Z)
!RETURNEND
OutputNMISS = 0D = 0.1471D+ = 0.0810D- = 0.1471Z = 1.4708Prob greater D one-sided = 0.0132Prob greater D two-sided = 0.0264
例:Kolmogorov-Smirnovの適合度検定(p.635) 100個の乱数は平均0.5, 分散1/12の正規分布か?
IMSL Fortran Stat
129
www.vnij.comCh. 8 時系列解析と予測Time Series Analysis and Forecasting
1. 一般的な手法
– 時系列データの変換• Box-Cox変換
• 時系列の差分 (backward difference)
– 標本相関関数(sample correlation function)• 自己相関関数(autocorrelation function)• 偏自己相関関数(partial autocorrelation function)• 相互相関関数(cross-correlation function)• 多チャンネル相互相関関数
IMSL Fortran Stat
( ) 10
ln ( ) 0
t
t
t
ZX
Z
lxl
lx l
ì + -¹ï= í
ï + =îl = POWER, x = SHIFT
observations {Zt}
130
www.vnij.comCh. 8 時系列解析と予測Time Series Analysis and Forecasting
2. 時間領域での手法(time domain methodology)– 非季節的(nonseasonal)時系列モデルの推定
• ARMA(Autoregressive Moving Average)パラメータのモーメント法、 小2乗法および 尤推定法による推定
• GARCH(Generalized Autoregressive Conditional Heteroskedastic)モデルの推定
• Wienerの予測演算子
• Box-Jenkins予測
– 伝達関数(transfer function)モデル• インパルス反応と雑音列の推定
• パラメータの予備的推定
– 多チャンネル時系列• パラメータの 小2乗予測
• 多チャンネルのWienerフィルタの予測
• Kalmanフィルタ
– 自動的なモデルの選択• 単変量・多変量のARモデルの自動選択(AIC, FPEを 小に)
– Bayes季節調整モデル
– 適なコントローラの設計– 不適合度の検定(lack of fit test)
IMSL Fortran Stat
131
www.vnij.comCh. 8 時系列解析と予測Time Series Analysis and Forecasting
3. 周波数領域での手法(frequency domain methodology)– 平滑化関数(smoothing function)
• Dirichletの核関数(kernel function)• Fejérの核関数
– スペクトル密度の推定(spectral density estimation)• ARMAの合理的スペクトル推定
• 高速Fourier変換を用いたピリオドグラム(periodogram)の計算
• 時系列データあるいはピリオドグラムが与えられたスペクトル・ウィンドウを使用
• 時系列データあるいはピリオドグラムが与えられた重み系列を使用
– 相互スペクトル密度の推定(cross-spectral density estimation)• 高速Fourier変換を用いた相互ピリオドグラムの計算
• 時系列データあるいはピリオドグラムが与えられたスペクトル・ウィンドウを使用
• 時系列データあるいはピリオドグラムが与えられた重み系列を使用
IMSL Fortran Stat
132
www.vnij.comCh. 8 時系列解析と予測Time Series Analysis and Forecasting
*AR*ARMA*SEA*E*F*FFT*P*D
AutoregressiveAutoregressive, Moving AverageSeasonal Modeling EstimationForecastFast Fourier TransformPeriodogramData
*P**UNI**MUL**FPE**MM**LS**BJ**SW**WE*
PreliminaryUnivariateMultivariateFinal Prediction ErrorMethod of MomentsLeast-SquaresBox-JenkinsSpectral WindowWeights
BAY*NS*TF*MAX*M*P*CP*S*AUTO*CS*
BayesianNonseasonal ARMATransfer FunctionMaximum LikelihoodMultichannelPeriodogramCross PeriodogramSpectral DensityAutomatic Model SelectionCross-Spectral Density
AbbreviationMeaning
Naming Conventions in Chapter 8
f(B)(Wt - m) = q(B)At t Î Z, BkWt=Wt-k backward shift op.
f(B) = 1 - f1B - f2B2 - ¼ - fpBp p ³ 0q(B) = 1 - q1B - q2B2 - ¼ - qqBq q ³ 0
自己回帰移動平均モデルARMA(p,q) autoregressive moving average
ARIMA(p,d,q) autoregressive integrated moving averageWt = ÑdZt : d 階の階差 Ñd = (1 - B)d
2 ln( ) 2AIC L p= - × +
,
2( 1) ˆ( 1)p pN pFPEN p
s+ +=
- -
単変量時系列データ (p ラグ)
Akaike’s Information Criterion 赤池の情報量基準
Final Prediction Error終予測誤差
多変量時系列データ( ) ( )( )ˆ( ) ln( ) 2 ln 2 1pAIC N p K N p p= - × S + × + - +
11ˆ
11
m
p pm
pmNMFPE
pmN
+æ ö+ç ÷è ø= S
+æ ö-ç ÷è ø
IMSL Fortran Stat
133
www.vnij.comCh. 8 時系列解析と予測Time Series Analysis and Forecasting
• GARCH(p,q)(Generalized Autoregressive Conditional Heteroskedastic)
時系列データ {wt} に対する時間とともに変化する標準偏差、相関をモデル化し予測するので、このようなモデルを必要とするあらゆる分野、例えば金融工学、品質管理、環境工学、生体システムなどにも応用可能です。
ここで zt は標準正規分布に従う乱数で、β(GARCH係数)およびα(ARCH係数)は
尤法によりパラメータを推定する。長さmの対数尤度log-likelihood は
赤池の情報量基準(Akaike Information Criterion) AIC = - 2 log (L) + 2(p+q+1)この 小値問題(α、β、σの制限付き)をSpellucciの非線形 適化の手法で解く。
2 2 2 2
1 1
,
t t tp q
t i t i i t ii i
w z
w
s
s s b s a- -= =
=
= + +å å
( )
2
1
2 1 1
0 2 , 0, 0 and
1.
i ip q p q
i ii i i
SIG MAX
x i
s b a
b a+ +
= = =
< < ³ ³
= + <å å å
IMSL Fortran Stat
2 2 2
1 1
2 2 2 2
1 1
1 1log( ) log(2 ) / log ,2 2 2
.
m m
t t tt t
p q
t i t i i t ii i
mL y
where w
p s s
s s b s a
= =
- -= =
= - - -
= + +
å å
å å
134
www.vnij.comCh. 8 時系列解析と予測Time Series Analysis and Forecasting
IMSL Fortran Stat
例:Kalmanフィルターと移動平均モデル (PV-WAVEによる表示例)
135
www.vnij.comCh. 8 時系列解析と予測Time Series Analysis and Forecasting
例:1770年から100年間の太陽黒点数のデータ:ARMAモデルのパラメータを正確な尤推定法(maximum likelihood estimation)で計算 (p.742)
USE MAX_ARMA_INTUSE GDATA_INTUSE NSPE_INTIMPLICIT NONE
! SPECIFICATIONS FOR LOCAL VARIABLESINTEGER I, NOUTREAL(KIND(1E0)) PAR(2), PMA(1), AVAR, FREAL(KIND(1E0)) X(176,2)REAL(KIND(1E0)) CONSTINTEGER NCOL, NROW
! Get Wolfer Sunspot DataCALL GDATA(2,X,NROW,NCOL)
! Get preliminary PAR and PMA estimatesCALL NSPE(X(22:,2),CONST, PAR, PMA, AVAR, NOBS=100)
! TEST #1: DOCUMENT EXAMPLECALL MAX_ARMA(x(22:,2), PAR, PMA, nobs=100, MAXIT=12000, &
AVAR=AVAR, F=F)
WRITE(*,99994) SIZE(PAR)WRITE (NOUT,99996) (PAR(I),I=1,SIZE(PAR))WRITE(NOUT,99995) SIZE(PMA)WRITE(NOUT,99996) (PMA(I),I=1,SIZE(PMA))WRITE(NOUT,*) "-2*LN(MAXIMUM LOG LIKELIHOOD) = ", FWRITE(NOUT,*) "WHITE NOISE VARIANCE = ", AVAR
99994 FORMAT(//1H ,5('-'),2X,'FINAL PAR(I)',2X,'NPAR=',I3,2X,5('-'))99995 FORMAT(//1H ,5('-'),2X,'FINAL PMA(I)',2X,'NPMA =',I3,2X,5('-'))99996 FORMAT(1H ,5E20.10,/(1H ,5E20.10))
ENDOutput----- FINAL PAR(I) NPAR= 2 -----
0.1224243164E+01 -0.5600821972E+00----- FINAL PMA(I) NPMA = 1 -----
-0.3847315013E+00-2*LN(MAXIMUM LOG LIKELIHOOD) = 539.5841WHITE NOISE VARIANCE = 214.50406
1 2 11.22 0.56 0.38t t t t tw w w a am - - -- = - + +1 1 2 2 1 1t t t t tw w w a am f f q- - -- = + - +
IMSL Fortran Stat
136
www.vnij.comCh. 8 時系列解析と予測Time Series Analysis and Forecasting
use bay_sea_intuse wrrrl_int
! SPECIFICATIONS FOR PARAMETERSinteger, parameter :: focast=12, nobs=132, nyears=11real(kind(1e0)) :: b(nobs)
! U.S. Labor Statistics ! unemployment for women ! over 20 years of age
data b/ 2968D0,3009D0,2962D0,2774D0,3040D0,3165D0,& !1991
integer :: ireal(kind(1e0)) :: abicmreal(kind(1e0)) :: trend(nobs+focast), season(nobs+focast)real(kind(1e0)) :: irreg(nobs), smooth(nobs+focast)character :: months(focast)*3, years(nyears+2)*4
call bay_sea(b, trend=trend, seasonal=season, &comp=irreg, abic=abicm, iorder=2, isorder=1,&nfocast=focast, smoothed=smooth)
write(nout,*) 'ABIC = ', abicmcall wrrrl('TREND with last 12 values forecasted',trend,months, &
years, nra=12,nca=nyears+1,lda=12)call wrrrl('SEASONAL with last 12 values forecasted',season,&
months,years, nra=12,nca=nyears+1, lda=12)call wrrrl('IRREGULAR=Original data-TREND-SEASONAL',irreg, &
months,years, nra=12,nca=nyears,lda=12)end
例:Bayesian季節調整モデル。1991-2001の米国での20歳以上
無職女性数のデータからトレンドを予測。 (p.805)
赤池(1980)のBayesianアルゴリズム:
Wt = Tt + St + At
IMSL Fortran Stat
137
www.vnij.comCh. 多変量解析
Multivariate Analysis
• 多変量解析各個体についていくつかの変量の組が観測されている時、そのデータを解析すること。
個体の数N, 変量の数p, 観測値(データ行列)X=[x1,,,xp]
• 主成分分析xの変動を出来るだけ少数の変換された変数y(主成分)で説明することが目的。 y = Ax
• 因子分析多くの変量の変動を少数の仮説的変量(因子)で説明すること。 主成分分析とは異なり、数学的モデル( x = μ+Λf + U )を基礎とする。 (μ 母平均、f 共通因子、Λ factor loading行列、U 独自因子)
• 判別分析N個の個体がいくつかのグループに分類されている時、ある個体がどのグループに属するか判定するのが目的
• クラスター分析多くの観測データを類似性あるいは差異性を表す測度を用いていくつかの群(クラスター)に分類すること。 判別分析のようにあらかじめ分類方式が決まっているものではない。
• 相関分析2つのベクトル変量 x1=(x1,,,xk), x2=(xk+1,,,xp) の間の相関関係を簡明に表現するのが目的。
• 回帰分析互いに相関のあるいくつかの(目的)変量Yを少数の(説明)変量Xで説明することを目的とする。 Y = XΞ + U , Ξ 未知の母数行列(回帰行列)、U 誤差行列
• 分散分析N元配置モデル等において各個体について複数の変量が観測される場合のデータに対するモデル。
IMSL Fortran Stat
138
www.vnij.comCh. 9 共分散構造と因子分析Covariance Structures and Factor Analysis
1. 主成分分析(principal component analysis)
2. 因子分析(factor analysis)– 因子抽出(extraction)– 因子回転(rotation)と要約(summarization)– 因子得点(score)– 残差相関(residual correlation)
3. 正準相関分析(canonical correlation analysis)– 独立性の検定
– 正準相関分析
IMSL Fortran Stat
139
www.vnij.comCh. 9 共分散構造と因子分析Covariance Structures and Factor Analysis
Steps in a Factor Analysis
Step 1 Calculate Covariance (Correlation) Matrixroutine CORVC (page 314)
Step 2 Initial Factor ExtractionFACTR, page 909
Step 3 Factor Rotation
Prior Info.
Promax or Procrustesrotation FPRMX, page 927
No Prior Info.
Promax or Procrustes rotation FPRMX, page 927
Direct oblimin rotationFDOBL, page 924
Harris-kaiser rotationFHARR, page 932
Generalized Crawford-Ferguson rotation FGCRF, page 936
Prior Info.
Procrustesrotation FOPCS, page 921
No Prior Info.
Orthomax rotation FROTA, page 918
ObliqueOrthogonal
Step 3a
Image Transformation Matrix
FIMAG, page 940
Step 3b
Factor VariancesFRVAR, page 942
Step 4
Factor CoefficientsFCOEF, page 944
Step 5
Factor ScoresFSCOR, page 949
IMSL Fortran Stat
(Models : Least square, Maximum likelihood, Image analysis, Alpha factor analysis)
(Models : Regression, Least square, Barlett, Anderson-Rubin, Image score)
140
www.vnij.comCh. 10 判別分析
Discriminant Analysis
1. パラメトリック判別– 1次または2次の判別関数分析
– Fisherの線形判別関数分析(discriminant score)
2. ノンパラメトリック判別– k 近傍判別分析(nearest neighbor discrimination)
IMSL Fortran Stat
141
www.vnij.comCh. 10 判別分析
Discriminant Analysis
USE GDATA_INTUSE DSCRM_INTINTEGER IGRP, IMTH, IPRINT, LDCLAS, LDCOEF, LDCOV, LDD2, &
LDPROB, LDX, LDXMEA, NCOL, NGROUP, NROW, NVARPARAMETER (IGRP=1, IMTH=3, IPRINT=1, LDCOV=4, NCOL=5, &
NGROUP=3, NROW=150, NVAR=4, LDCLAS=NGROUP, &LDCOEF=NGROUP, LDD2=NGROUP, LDPROB=NROW, &LDX=NROW, LDXMEA=NGROUP)
!INTEGER ICLASS(NROW), IND(4), NI(NGROUP), NOBS, NRMISS, NVREAL CLASS(LDCLAS,NGROUP), COEF(LDCOEF,NVAR+1), &
COV(LDCOV,LDCOV,1), D2(LDD2,NGROUP), PRIOR(3), &PROB(LDPROB,NGROUP), STAT(6+2*NGROUP), X(LDX,5), &XMEAN(LDXMEA,NVAR)
!DATA IND/2, 3, 4, 5/, PRIOR/0.3333333, 0.3333333, 0.3333333/
!CALL GDATA (3, X, NOBS, NV)
!CALL DSCRM (NROW, NVAR, X, NGROUP, COV, COEF, ICLASS, PROB, &
CLASS, D2, STAT, IND=IND, IGRP=IGRP, IMTH=IMTH, &IPRINT=IPRINT, PRIOR=PRIOR, NI=NI, XMEAN=XMEAN, &NRMISS=NRMISS)
!END
例:線形判別(p.985) Fisherのirisデータ
IMSL Fortran Stat
OutputPRIOR, the prior probabilities
1 2 30.3333 0.3333 0.3333
NI, the number in each group1 2 3
50 50 50
CLASS, the classification table1 2 3
1 50.00 0.00 0.002 0.00 48.00 2.003 0.00 1.00 49.00
D2, the distances between group means1 2 3
1 0.0 89.9 179.42 89.9 0.0 17.23 179.4 17.2 0.0
Mahalanobisの距離D2の計算 (S:共分散行列)
( ) ( )2 1T
ij i j i jD x x S x x-= - -
142
www.vnij.comCh. 11 クラスタ分析
Cluster Analysis
1. 階層的(hierarchical)クラスタ分析– 距離(distance)、類似度行列(similarity matrix)の計算
– 階層的クラスタ分析
2. K-means法– 次の距離の和を 小にする分類を見つける
( )2
, ,1 1 1
i
im im im im
npK
v v v j v j iji j m
f w x xf d= = =
= -å å å
IMSL Fortran Stat
νim : 観測値行列xのi番のクラスタのm番の観測値の行番号
ni : xの中のグループiの行数 f : 観測の頻度 w : 重み
δ:観測値がNaNの場合はゼロ、それ以外は1 K :クラスタ数
:グループiの変量jの平均値 p : 観測値の数
ijx
ijx
143
www.vnij.comCh. 11 クラスタ分析
Cluster Analysis
USE IMSL_LIBRARIESINTEGER IPRINT, K, LDCM, LDSWT, LDX, NCOL, NOBS, NV, NVAR
PARAMETER (IPRINT=0, K=3, NCOL=5, NOBS=150, NV=5, NVAR=4, &LDCM=K, LDSWT=K, LDX=NOBS)
!INTEGER IC(NOBS), IND(NVAR), NC(K), NXCOL, NXROWREAL CM(K,NVAR), SWT(K,NVAR), WSS(K), X(NOBS,NV)
!DATA IND/2, 3, 4, 5/
!CALL GDATA (3, X, NXROW, NXCOL)
! Copy the cluster seeds into CMCALL SCOPY (NVAR, X(1:,2), LDX, CM(1:,1), LDCM)CALL SCOPY (NVAR, X(51:,2), LDX, CM(2:,1), LDCM)CALL SCOPY (NVAR, X(101:,2), LDX, CM(3:,1), LDCM)
!CALL KMEAN (X, CM, SWT, IC, NC, WSS, IND=IND)
!CALL WRRRN (’CM’, CM)CALL WRRRN (’SWT’, SWT)CALL WRIRN (’IC’, IC, 1, NOBS, 1)CALL WRIRN (’NC’, NC, 1, K, 1)CALL WRRRN (’WSS’, WSS, 1, K, 1)END
OutputCM
1 2 3 41 5.006 3.428 1.462 0.2462 5.902 2.748 4.394 1.4343 6.850 3.074 5.742 2.071
SWT1 2 3 4
1 50.00 50.00 50.00 50.002 62.00 62.00 62.00 62.003 38.00 38.00 38.00 38.00
IC1 2 3 ,,, 50 51 52 53 54 55 ,,, 149 1501 1 1 1 2 2 3 2 2 3 2
NC1 2 3
50 62 38
WSS1 2 3
15.15 39.82 23.88
例:K-means (p.1021) Fisherのirisデータ
あやめ3種、50個づつ、花弁とがくの大きさ2種
IMSL Fortran Stat
144
www.vnij.comCh. 11 クラスタ分析
Cluster Analysis
IMSL Fortran Stat
例:クラスタ分析の例(JMSLによる表示)
HR図(Hertzsprung-Russell diagram)
145
www.vnij.comCh. 12 標本分析
Sampling
1. 単純(simple)および層別(stratified)ランダムサンプリング
– 比例(proportion)の計算
– 比推定(ratio estimate)、回帰推定(regression estimate)
2. 1段クラスタサンプリング
3. 2段サンプリング
4. 単純ランダムサンプリング
5. 層別ランダムサンプリング
IMSL Fortran Stat
146
www.vnij.comCh. 12 標本分析
Sampling
USE UMACH_INTUSE SMPPR_INTINTEGER NINT, NOUT, NPOP, NSAMPREAL CONPER, SQRT, STAT(10), STDP, STDTINTRINSIC SQRT
!CALL UMACH (2, NOUT)NINT = 38NSAMP = 200NPOP = 3042CONPER = 0.0CALL SMPPR (NINT, NSAMP, NPOP, CONPER, STAT)STDP = SQRT(STAT(3))STDT = SQRT(STAT(4))WRITE (NOUT,99999) STAT(1), STAT(2), STDP, STDT, STAT(9)
99999 FORMAT (’ Estimate of proportion bad: ’, F5.3, /,&’ Estimate of total bad: ’, F5.0, /, &’ Standard deviation estimate, proportion: ’, F5.3, /, &’ Standard deviation estimate, total: ’, F5.1, /, &’ Coefficient of variation: ’, F5.1, &’%’)
END
OutputEstimate of proportion bad: 0.190Estimate of total bad: 578.Standard deviation estimate, proportion: 0.027Standard deviation estimate, total: 81.8Coefficient of variation: 14.1%
例:名前・住所のデータ3042から200を単純無作為抽出、38が住所の間違い。全部でい
くつ間違いデータがあるか。(p.1027)
IMSL Fortran Stat
147
www.vnij.comCh. 13 生存解析Survival Analysis, Life Testing and Reliability
1. 生存解析(survival analysis)– Kaplan-Meier(積極限法 Product-limit)の生存率の推定
– Greenwoodの分散の推定
– Turnbullの一般化Kaplan-Meier推定
– Coxの比例ハザードモデル(proportional hazards model)
– 一般化線形モデル(generalized linear model)– 様々なパラメトリックモデル
2. 保険数理表(actuarial table)– コーホート生命表(cohort life table)
IMSL Fortran Stat
148
www.vnij.comCh. 13 生存解析Survival Analysis, Life Testing and Reliability
USE KAPMR_INTUSE WRRRL_INTUSE UMACH_INTINTEGER ICEN, IFRQ, IGRP, IRT, ISRT,
LDSPRO, LDX, NCOL, NOBSPARAMETER (ICEN=3, IFRQ=4, IGRP=2, IRT=1,
ISRT=0, LDSPRO=33, &LDX=33, NCOL=6, NOBS=33)
!INTEGER NOUT, NRMISSREAL SPROB(LDSPRO,2), X(LDX,NCOL)CHARACTER XLABEL(7)*6, YLABEL(1)*6EQUIVALENCE (X(1,5), SPROB)
!DATA XLABEL/’OBS’, ’TIME’, ’GROUP’, ’CENSOR’,
’FREQ’, ’S-HAT’, &’SE’/
DATA YLABEL/’NUMBER’/DATA X/143, 164, 188, 190, 192, 206, 209, 213, 216,
220, 227, &230, 234, 246, 265, 304, 216, 244, 142, 156, 163,
198, 205, &232, 233, 239, 240, 261, 280, 296, 323, 204, 344,
18*5, &15*7, 16*0, 2*1, 13*0, 4*1, 2, 20*1, 2, 4, 3*1, 2*2,
3*1, &66*0/
CALL KAPMR (X, IRT, SPROB, IFRQ=IFRQ, ICEN=ICEN, IGRP=IGRP, &NRMISS=NRMISS)
!CALL WRRRL (’X/SPROB’, X, YLABEL, XLABEL, FMT=’(W10.6)’)CALL UMACH (2, NOUT)WRITE (NOUT,’(//’’ NRMISS = ’’, I5)’) NRMISSEND
OutputX/SPROB
OBS TIME GROUP CENSOR FREQ S-HAT SE1 143.000 5.000 0.000 1.000 0.947 0.0512 164.000 5.000 0.000 1.000 0.895 0.0703 188.000 5.000 0.000 2.000 0.789 0.0944 190.000 5.000 0.000 1.000 0.737 0.101
31 323.000 7.000 0.000 1.000 0.051 0.04932 204.000 7.000 1.000 1.000 0.810 0.08633 344.000 7.000 1.000 1.000 NaN NaN
NRMISS = 0
例:Kaplan-Meierの生存率の推定(p.1065)
ラットのがんと2つの治療法別の生存率
IMSL Fortran Stat
149
www.vnij.comCh. 14 多次元尺度法
Multidimensional Scaling
1. 多次元尺度法(MDS)のルーチン
– 個人差MDSの計算
2. ユーティリティルーチン
– 距離行列(distance matrix)の計算
– 入力データの標準化
– 非類似性行列(dissimilarity matrix)から正規化された積率行列(2重中心 double center)を計算
– 初期推定
– 様々なストレス基準
IMSL Fortran Stat
150
www.vnij.comCh. 14 多次元尺度法
Multidimensional Scaling
USE PGOPT_INTUSE MSIDV_INTINTEGER IPRINT, ISTRS, LDCFL, LDW, LNX, NDIM, NSTIM,
NSUB, IPAGEPARAMETER (IPRINT=2, ISTRS=1, LDCFL=10, LNX=45,
NDIM=2, &NSTIM=10, NSUB=1)
!REAL A(1), B(1), CFL(LDCFL,NDIM), DIST(45), RESID(LNX), &
STRS(1), STRSS, WT(1), X(45,1)!
DATA X/4, 22, 13, 8, 15, 12, 34, 31, 11, 24, 6, 21, 29, 18, 39, &10, 9, 27, 25, 42, 20, 35, 32, 16, 28, 2, 44, 43, 36, 30, &19, 33, 17, 45, 40, 7, 3, 5, 26, 23, 37, 14, 1, 41, 38/
! Call PGOPT to set page length for! the plotting
IPAGE =50CALL PGOPT (-2, IPAGE)
!CALL MSIDV (NSTIM, X, NDIM, DIST, CFL, A, B, WT, STRS, &
STRSS, RESID, ISTRS=ISTRS, IPRINT=IPRINT)!
END
OutputInitial parameter estimates.
CFL1 2
1 -0.762 0.1242 -0.451 -0.3493 0.496 0.0734 -0.151 0.6515 1.237 0.3926 -1.114 0.5887 -1.077 -0.5668 1.461 0.0349 1.321 -0.614
10 -0.961 -0.333
Iteration historyIter Source Stress Stress change Maximum Change1 INIT STRSS 0.3755E-021 CONFIG STRSS 0.3399E-02 0.3559E-03 0.8062E-1 LINES STRSS 0.3142E-02 0.2564E-03 0.8062E2 CONFIG STRSS 0.3068E-02 0.7382E-04 0.1022E-2 LINES STRSS 0.3047E-02 0.2156E-04 0.1022E
例:米国の都市間の距離のランク(対称非類似性行列)からユークリッド距離モデルで2次元の尺度を計算(p.1134)
IMSL Fortran Stat
151
www.vnij.comCh. 15 密度関数とハザードの推定
Density and Hazard Estimation
1. 密度関数の推定– 罰則付き尤度法(penalized likelihood)による推定
– 核関数法(kernel function)による推定
– 高速Fourier変換によるGauss核関数の推定
– 点推定(point estimate)
2. ハザード比(hazard rate)の各関数法による尤度推定(likelihood estimate)
– 平滑化パラメータ(smoothing parameter)の推定
– ハザード関数の推定
IMSL Fortran Stat
152
www.vnij.comCh. 15 密度関数とハザードの推定
Density and Hazard Estimation
PARAMETER (NOBS=10, NODE=13)INTEGER NOUTREAL BNDS(2), DENS(NODE), STAT(4), X(NOBS)
!DATA BNDS/-3., 3./DATA X/-.9471, -.7065, -.2933, -.1169, .2217, .4425,
.4919, .5752, 1.1439, 1.3589/!
CALL DESPL (X, NODE, BNDS, DENS, STAT)!
CALL UMACH (2, NOUT)WRITE (NOUT,’(’’ DENS = ’’,9F7.4, /, 9X, 4F7.4)’) DENSWRITE (NOUT,’(’’ Log-likelihood term = ’’, F7.3, /, && ’’ Log-penalty term = ’’, F7.3, /, && ’’ Mean = ’’, F7.3, /, && ’’ Variance = ’’, F7.3)’) STATEND
OutputDENS = 0.0000 0.0014 0.0356 0.1111 0.2132 0.3040 0.3575
0.3565 0.2947 0.1986 0.0986 0.0288 0.0000Log-likelihood term = -11.968Log-penalty term = -1.303Mean = 0.217Variance = 1.042
例:1次元ランダムサンプルデータから区間線形密度関数を推定(p.1173)
IMSL Fortran Stat
αはペナルティ係数(10がデフォルト)
153
www.vnij.comCh. 16 ラインプリンタ作図
Line Printer Graphics
• 現在はほとんど使われていない
• 旧バージョンとの互換性のために残されているルーチン– ヒストグラム
– 散布図
– ボックスプロット
– 幹葉図
– 累積分布図
– 2分木図
IMSL Fortran Stat
Fisher Iris Data:: * **
2.4 -: * 2: **** * * * *: * * *:: **** * *: **** * *: *2 * *: 32 * 2* * * *:: * *
P 1.6 -: * * * *e : * 5** 2**t : * 2 *2* *a :l : * 3222***
: ** * * *w : * **i : 2 2 * **d :t :h 0.8 -:
:: *:: *: * 3** *: 23* *:* 24875* *:: * 22
0.0 -::...............................................................: : : : : : :1. 2. 3. 4. 5. 6. 7.
Petal length
散布図の例: Fisherのあ
やめの花びらのデータ
154
www.vnij.com Ch. 17 確率分布関数とその逆関数Probability Distribution Functions and Inverses(特殊関数SFunのCh.11も参照)
1. 離散変数– 二項分布– 超幾何分布– Poisson分布
2. 連続変数– Kolmogorov-Smirnovの片側統計分布関数– Kolmogorov-Smirnovの両側統計分布関数– 標準正規(Gauss)分布
– ベータ分布– 2変量正規分布– χ2 分布– F 分布– Γ 分布– Studentのt 分布
3. 一般の連続確率変数
IMSL Fortran Stat
155
www.vnij.comCh. 18 乱数生成
Random Number Generation
1. ユーティリティ– 一様乱数発生器のタイプの選択など– シードの初期化など– シャッフルされた乱数発生器の初期化など– GFSR乱数発生器の初期化など– 複数の独立な乱数列生成のためのシード
2. 一様分布(1,0)– 次ページ参照(擬似乱数、準乱数)– ユーザ指定の乱数生成
3. 単変量離散分布– 二項分布– 一般離散分布– 幾何分布– 超幾何分布– 対数分布– 負の二項分布– Poisson分布– 離散一様分布
4. 単変量連続分布– ベータ分布– χ2 分布– Cauchy分布
– 指数分布– 2つの指数分布– Γ 分布
– 一般連続分布– 対数正規分布– 標準正規分布– 安定分布– Studentのt 分布
– 三角分布– Von Mises分布– Weibull分布
IMSL Fortran Stat
156
www.vnij.comCh. 18 乱数生成
Random Number Generation
5. 多変量分布– 直交行列と相関行列– 多変量分布(data-based multivariate)– 多項分布– 多変量正規分布– 円、球上の分布– 2元配置表(two-way table)
6. 順序統計(order statistics)– 正規分布– 一様分布
7. 確率過程– ARMAモデル– 非斉次(nonhomogeneous)Poisson過程
8. 標本と順列– ランダム順列(permutation)– ランダム標本(sampling)
9. 低不適合度の列(LDS : Low Discrepancy Sequence)– シャッフルされたFaure列 (準乱数)
IMSL Fortran Stat
157
www.vnij.com Ch. 18 乱数生成Random Number Generation(擬似乱数 pseudo random number)
1. 乗算合同法 (multiplicative congruential generator)xi = cxi-1 mod(231-1) (周期 231-2≒2.15x109)
c = 75 = 16807 (minimal standard generator)c = 2x72x4053103 = 397204094c = 23x118838297 = 950706376
2. シャッフルされた乗算合同法
3. 伏見正則(1990)のGFSR (Generalized Feedback Shift Register) xi = xi-1563 .XOR. xi-96 (周期 2521≒6.86x10156)
– 初期化に時間がかかるが、乗算合同法と同程度の速さ
IMSL Fortran Stat
158
www.vnij.com Ch. 18 乱数生成Random Number Generation(準乱数 quasi random number)
use faure_intimplicit nonetype (s_imsl_faure), pointer :: statereal(kind(1e0)) :: x(3)integer,parameter :: ndim=3integer :: k
! CREATE THE STRUCTURE THAT HOLDS! THE STATE OF THE SEQUENCE.
call faure_init(ndim, state)! GET THE NEXT POINT IN THE SEQUENCE
do k=1,5call faure_next(state, x)write(*,'(3F15.3)') x(1), x(2) , x(3)
enddo! FREE DATA ITEMS STORED IN! state STRUCTURE
call faure_free(state)end
Output0.334 0.493 0.0640.667 0.826 0.3970.778 0.270 0.1750.111 0.604 0.5090.445 0.937 0.842
例:3次元(単位立方体)中での一般化Faure列を5点求める。(p.1406)
IMSL Fortran Stat
159
www.vnij.comCh. 18 乱数生成
Random Number Generation
USE UMACH_INTUSE RNISD_INT
INTEGER ISEED1, ISEED2, ISEED3, ISEED4, NOUT!
CALL UMACH (2, NOUT)ISEED1 = 123457CALL RNISD (ISEED1, ISEED2)CALL RNISD (ISEED2, ISEED2)CALL RNISD (ISEED2, ISEED3)CALL RNISD (ISEED3, ISEED3)CALL RNISD (ISEED3, ISEED4)CALL RNISD (ISEED4, ISEED4)WRITE (NOUT,99999) ISEED1, ISEED2, ISEED3, ISEED4
!99999 FORMAT (’ Seeds for four separate streams: ’, /, ’ ’, 4I11)!
ENDOutputSeeds for four separate streams:
123457 2016130173 85016329 979156171
例:4つのオーバーラップしない乱数列を発生 (p.1315)
これらのシードによる4つの乱数列は200,000個離れており、オーバーラップは無い。
IMSL Fortran Stat
160
www.vnij.comCh. 18 乱数生成他社の乱数との比較:(Intelのホームページより)
IMSLの乱数は Intel MKLやNAGと比べて精度が高く、計算速度はNAGの2倍
速い結果が出ている。
Performance Comparison: Black-Scholes Option-Pricing Modelhttp://www.intel.com/cd/software/products/asmo-na/eng/220054.htm
IMSL Fortran Stat
Relative Error Ratio
Call Put Call Put Call Put16.7291 7.2184 0.0050 -0.0005
0.030 -0.007 4.55 -5.0016.7366 7.2164 -0.0025 0.0015
-0.015 0.021 -2.27 15.0016.7330 7.2178 0.0011 0.0001
0.007 0.001 1 116.7394 7.2162 -0.0053 0.0017
-0.032 0.024 -4.82 17.00
Exact Value 16.7341 7.2179 (Intel Xeon)
Option Value(Exact Value)
Absolute Error(Relative Error %)
Time(seconds)
Speedup(timesfaster)
7.246 4.09
MCG59 7.625 3.88
Library BasicGenerator
IMSL* MinimalStandard
Intel® MKL MCG31m1
29.63 1
NAG* Original 61.306 0.48
161
www.vnij.comCh. 19 ユーティリティ
Utilities (Math Ch.11も参照)
1. 印刷
2. ソート
3. 並べ替え
4. 検索
5. 文字列処理
6. 時間、日付、バージョン
7. 幾つかの標準データセットの読み込み
IMSL Fortran Stat
IMSL Fortran ライブラリ
並列処理と性能
163
www.vnij.com
並列処理の形態
IMSL Fortran
Memory Memory Memory Memory Memory
P P P P P P P
Single Thread 共有メモリ並列 分散メモリ並列
逐次処理
逐次処理
並列可能
Thread 生成
同期処理
Multi Thread Message Passing
同期
時間
164
www.vnij.com
IMSL Fortranライブラリのパラレル化
• IMSL Fortranは2種類のパラレル化に対応– OpenMP
• BLASの並列処理による上位ルーチンの並列化
• IMSL自身でもOpenMPディレクティブにより並列化。線形方程式、固有値解析、変換などが対応
• OSによって対応しているルーチンは異なる
• ユーザプログラムはパラレル化を意識してプログラミングする必要はない
– MPI• 行列操作関数、線形方程式、固有値解析、変換などが対応
• 全てのOS版のIMSL Fortranライブラリで同一のルーチンが対応
• ユーザープログラムでMPIの指定が必要、ただし通常のMPIの指定に比べて非常に簡便
IMSL Fortran
165
www.vnij.com
OpenMPのパラレル化方法
1. コンパイル・リンク時にOpenMP用の環境変数を指定
$F90 -o 実行モジュール名 $F90FLAGS ソース名 $LINK_F90_SMP(スタティックリンク時は$LINK_F90_STATIC_SMP)
2. 実行時に環境変数で使用スレッド数を指定
setenv OMP_NUM_THREADS スレッド数
※ ユーザープログラムでは特にパラレル化を意識する必要はない
IMSL Fortran
166
www.vnij.com
OpenMP対応ルーチン
• 多くの数学・統計ルーチンが直にOpenMPディレクティブを用いて並列化をサポートしています。
– 線形システム– 固有システム解析– 補間と近似– 微分方程式– 変換– 適化– 行列とベクトル演算– 回帰– カテゴリデータと離散データの解析– 時系列解析と予測– 共分散と因子分析– 判別分析– 多次元尺度法– 乱数
IMSL Fortran
167
www.vnij.com
C IMSL Name: L2TRG/DL2TRG (Single/Double precision version)C Purpose: Compute the LU factorization of a real general matrix.
SUBROUTINE DL2TRG (N, A, LDA, FAC, LDFAC, IPVT, SCALE)・
・
C update columns j of L and j+1 of AC$OMP PARALLEL DO PRIVATE(I) IF(N - J .GT. 29)
DO 30 I=J + 1, NFAC(I,J) = FAC(I,J)*TFAC(I,J+1) = FAC(I,J+1) + T1*FAC(I,J)
30 CONTINUEC$OMP END PARALLEL DO・
・
IMSL ソース内での
OpenMPパラレル化指定例
IMSL Fortran
168
www.vnij.comExample of OpenMP Performance(SGI Altix : Itanium2, Red Hat Linux)
LIN_SOL_LSQ : solves linear equation by least square method.LQRRR : QR decomposition using Householder transformationsDLQRRV :Least square solution using Householder transformation
IMSL Fortran Library 5.0 OpenMP Performanceon SGI Altix 3700 data size = 1000x1000
0
5
10
15
20
25
30
1 2 4 8
CPU
Ela
psed
Tim
e (
sec)
lin_sol_lsq
l2rrr(lqrrr)
dlqrrv
IMSL Fortran Library 5.0 OpenMP Performanceon SGI Altix 3700 data size = 1000x1000
0
2
4
6
8
10
12
1 2 4 8
CPU
Spe
edu
p ra
tio t
o 1
CP
U
lin_sol_lsq
l2rrr(lqrrr)
dlqrrv
IMSL Fortran
169
www.vnij.comExample of OpenMP Performance(Fujitsu PRIMEPOWER : UltraSPARC, Solaris)
LFTRG:LU factorization of real general matrix
LQRRV:Least square solution using Householder transformation
LFTCG:LU factorization of complex general matrix
IMSL Fortran
4
8
LFTRG
LQRRV
LFTCG
0.00
1.00
2.00
3.00
4.00
5.00
6.00
7.00
LFTRG
LQRRV
LFTCG
(Matrix Size 1000x1000)
170
www.vnij.com
MPIのパラレル化方法
1. IMSLのMPIインターフェースルーチン、MP_SETUP等を
使用して並列処理のソースを作成
2. コンパイル・リンク$MPIF90 -o 実行モジュール名 $F90FLAGS ソース名 $LINK_MPI
3. 実行
mpirun -np プロセス数 ./実行モジュール名
IMSL Fortran
171
www.vnij.com
MPI対応ルーチン一覧
オペレータ・関数名 機能
PARALLEL_NONNEGATIVE_LSQ 小2乗法による連立方程式の解 (Ax=b, x≧0)
PARALLEL_BOUNDED_LSQ 小2乗法による連立方程式の解 (Ax=b, α≦x≦ β).x. 行列とベクトルまたは行列の積 (AB)
.tx. 転置行列とベクトルまたは行列の積 (ATB)
.xt. 行列とベクトルまたは行列の転置の積 (ABT)
.hx. エルミート共役行列とベクトルまたは行列の積 (AHB)
.xh. ベクトルまたは行列とエルミート共役行列の積 (ABH)
.i. 逆行列あるいは一般化逆行列の計算 (A-1)
.ix. 逆行列とベクトルまたは行列の積 (A-1B)
.xi. ベクトルまたは行列と逆行列の積 (AB-1)CHOL 行列のコレスキー分解を計算COND 行列の条件数を計算DET 行列式を計算EIG (一般化)固有値・固有ベクトルを計算FFT_BOX 複素または実の離散フーリエ変換IFFT_BOX 複素または実の離散逆フーリエ変換NORM 階数1、又は階数2の配列のノルムを計算ORTH 階数2、又は階数3の配列の直交化RANK 階数2、又は階数3の階数を計算SVD 行列の特異値分解SCALAPACK_READ ファイルから行列データを読み込み、2次元のBLOCK-CYCLIC形式に変換するSCALAPACK_WRITE ファイルに行列データを書く
IMSL Fortran
172
www.vnij.com IMSL ソース内でのMPIパラレル化指定例
! SUBROUTINE d_parallel_nonnegative_lsq (A,B,X,RNORM,W,INDEX,IPART,IOPT)! COMPUTE AN N-VECTOR, X, THAT SOLVES THE LEAST SQUARES PROBLEM! A * X = B SUBJECT TO X >= 0
USE MPI_SETUP_INT
! Send local parts of dual from nodes to root for summary output.DO L=1,MP_NPROCS-1
IF(MP_RANK == L) THENCALL MPI_SEND(W(IPART(1,L+1):),max(0,IPART(2,L+1)-IPART(1,L+1)+1), &
MPI_DOUBLE_PRECISION ,0,L,MP_LIBRARY_WORLD,IERROR)END IFIF(MP_RANK == 0) THEN
CALL MPI_RECV(W(IPART(1,L+1):),max(0,IPART(2,L+1)-IPART(1,L+1)+1), &MPI_DOUBLE_PRECISION , L, L, MP_LIBRARY_WORLD, STATUS, IERROR)
END IFEND DO
! Broadcast the dual to all nodes at the end.IF(MP_NPROCS > 1) &
CALL MPI_BCAST(W, N, MPI_DOUBLE_PRECISION , 0, MP_LIBRARY_WORLD, IERROR)
IMSL Fortran
173
www.vnij.com
IMSL Fortran MPI使用方法(1/3)
• IMSLのMPIインターフェースルーチンMP_SETUPで簡単にMPIパラレルを開始&終了
– MP_SETUP() MPIを初期化
MPI_NODE_INTを初期化
– MP_SETUP(n)• MPI_SETUP()と同様の処理
• n x nのマトリックスを作成し、各ノードでマトリックスの乗算を計算して各ノードの性能を測定
• ノード番号を性能の良い順に配列MPI_NODE_PRIORITYに設定 → ユーザープログラム上で性能の良いノードをコントロール可能
– MP_SETUP(‘Final’)• IMSLのエラーメッセージを出力
• MPIの終了処理
IMSL Fortran
174
www.vnij.com
IMSL Fortran MPI使用方法(2/3)
IMSLのMPIインターフェースモジュール:– MPI_SETUP_INT
MP_SETUPを呼びだす時、指定が必要なモジュールMPI_NODE_INTを呼び出している
– MPI_NODE_INT MPI_SETUP_INTから呼び出されるため、MPI_SETUP_INTを使用しているとき
は特にユーザープログラムで指定する必要はない。下記変数を定義している
MP_SETUP() または MP_SETUP(n) で下記のデータを設定する
IMSL Fortran
MODULE MPI_NODE_INTINTEGER, ALLOCATABLE :: MPI_NODE_PRIORITY(:) ノードの実行優先順序
INTEGER, SAVE :: MP_LIBRARY_WORLD = huge(1) MPIのコミュニケータ
LOGICAL, SAVE :: MPI_ROOT_WORKS = .TRUE. ROOTノードでの実行の有無
INTEGER, SAVE :: MP_RANK = 0, MP_NPROCS =1 ノード番号、全ノード数
END MODULE
175
www.vnij.com
IMSL Fortran MPI使用方法(3/3)
ボックスデータタイプの使用:データを3次元に割り当て、3次元目はCPU数で割って、各CPUに割り当てる。
例:Dimension (6,6,4) A, B, Xx = A .ix. B
特にプログラム上で指定しない限りは、 4CPUで実行した場合はルートノードのデータが次のように自動的に各スレッドに割り付けられ、各ノードで.ix.の計算が行われる。
A(*,*, 4:4)B(*,*, 4:4)X(*,*, 4:4)
A(*,*, 3:3)B(*,*, 3:3)X(*,*, 3:3)
A(*,*, 2:2)B(*,*, 2:2)X(*,*, 2:2)
A(*,*,1:1)B(*,*,1:1)X(*,*,1:1)
変数
3210MP_RANK
※MP_RANK=スレッドのランク番号
計算終了後、結果はルートノードに送られ、ルート以外のノードの結果データエリアには 1 がセットされる
IMSL Fortran
176
www.vnij.com
MPI例題
use linear_operators 例:MATH User’s Guide P.1468 use mpi_setup_intimplicit none
integer, parameter :: n=32, nr=4real(kind(1e0)) :: one=1e0real(kind(1e0)), dimension(n, n, nr) :: A, b, x, err(nr)
MP_NPROCS=MP_SETUP() → MPIの初期化、MPI_NODE_INTA = rand(A); b=rand(b) 設定、並列処理開始x = A .ix. B → ボックスデータを各スレッドに割り付け: 計算結果はルートノードに送られるMP_NPROCS=MP_SETUP(‘Final’) → MPI終了、メッセージの確認:
その他の例題は別紙参照
n=32
n=32 A,b,x
IMSL Fortran
177
www.vnij.comMPI Performance(TITECH TSUBAME)(Sun X4600 Opteron SuSE Linux)
IMSL Fortran 5.0 MPI PerformanceTITECH Tsubame, Sun X4600 Cluster
AMD Opteron, SuSE Linux, Data size 500x500x256
1
10
100
1000
2 4 8 16 32 64 128 256
CPU
Ela
psed
tim
e (se
c)
det
cond
eig
.hx.
.x.
orth
rank
svd
norm
IMSL Fortran Library MPI Performance
AMD Opteron SuSE Linux, Data size 500x500x256
0
10
20
30
40
50
60
70
80
90
2 4 8 16 32 64 128 256
CPU
Spe
edu
p ra
tio t
o 2
CP
U det
cond
eig
.hx.
.x.
orth
rank
svd
178
www.vnij.com
IMSL Fortran 6.0 MPI PerformanceIntel Xeon cluster (4x2 Xeon dual core)
Windows CCS 2003, IVF 10.0, MKLEigenvalue analysis
0
20
40
60
80
100
120
1 2 4 8
Proc
Ela
pse
d T
ime (se
c)
500x500x8
1000x1000x8
IMSL Fortran 6.0 MPI PerformanceIntel Xeon cluster (4x2 Xeon dual core)
Windows CCS 2003, IVF 10.0, MKLEigenvalue analysis
0
1
2
3
4
5
6
7
1 2 4 8
Proc
Speed
up r
atio
to 1
core
500x500x8
1000x1000x8
IMSL MPI 並列処理性能例Windows CCS system
179
www.vnij.com
ScaLAPACKユーティリティ
• ScaLAPACKユーティリティ– ScaLAPACK_READ 行列データを読み込み、Block-cyclic形式に変換
– ScaLAPACK_WRITE Block-cyclic形式のデータを行列データとしてファイルに書き出す
• モジュールファイル– ScaLAPACK_Support 下のモジュールの全体
• ScaLAPACK_int ScaLAPACKインターフェース
• PBLAS_int 並列BLAS,PBLASのインターフェース
• BLACS_int BLACSへのインターフェース
• Tools_int 補助ルーチンへのインターフェース
• LAPACK_int LAPACKへのインターフェース
• ScaLAPACK_IO_int ScaLAPACK_READ,ScaLAPACK_WRITEルーチンの全インターフェース
• MPI_Node_int MPIコミュニケータモジュール
IMSL Fortran
180
www.vnij.com
IMSL C ライブラリ (CNL)
• 1990年にFortranライブラリをベースにファーストリリース。
• MATHとSTAT
• 各関数毎に単精度版と倍精度版。
• 一部ルーチンはベンダーライブラリとの置き換え可能
• オプション引数の使用
181
www.vnij.com
IMSL Cライブラリ ディレクトリ構成
/usr/local/imsl||- license|-imsl -cnl600 –linux64 - bin
|- examples|- lib|- include|- help
IMSL C福岡工業大学
182
www.vnij.com
IMSL Cライブラリ環境設定
環境設定はFortranと共通
C シェルユーザ
source /usr/local/imsl/imsl.cshBシェルまたはKシェルユーザ
. /usr/local/imsl.sh• 環境変数の設定は、ログイン毎の自動セットアップをお
勧めします。– 下記ファイルに上記のコマンドを追加
• .cshrc (C shell)• .profile (sh, ksh).
IMSL Fortran,C福岡工業大学
183
www.vnij.com
IMSL Cライブラリの環境変数
• $CTT_CC_COMPILER コンパイラバージョン• $CTT_EXAMPLES 例題のディレクトリ• $CTT_OS_VERSION OSバージョン• $CC Cコンパイラ• $CFLAGS Cのコンパイルオプション• $LINK_CNL_SHARED Cのリンクパス(Sharedリンク)• $LINK_CNL_STATIC Cのリンクパス(Staticリンク)• $LINK_CNL Cのリンクパス(デフォルト)• $VNI_LICENSE_NUMBER 製品のライセンス番号• $IMSLERRPATH Cのエラーメッセージ環境のパス
: 等
IMSL C
184
www.vnij.com
IMSL Cライブラリのコンパイル・リンク
$CC -o <実行モジュール> $CFLAGS <メインソース> $LINK_CNL
$CFLAGS : IMSL Cのコンパイルオプションとインクルードパス
$LINK_CNL : IMSL Cライブラリへのリンクパス
ダイナミックリンクの時は$LINK_CNLスタティックリンクの時は$LINK_CNL_STATICを使用
IMSL C福岡工業大学
185
www.vnij.com
IMSL Cライブラリ 例題
・$CNL_EXAMPLES/validate ディレクトリ
CNLに付属する例題
cmath.ccstat.c
MATH、 STAT双方の動作検証用プログラム
詳細は同ディレクトリのREADME参照
IMSL C
IMSL C ライブラリ (CNL)v6.0 仕様
187
www.vnij.com
IMSL C ライブラリ構成
• シェアード (WindowsではDLL) と スタティック
• C/MATH(数学)とC/STAT(統計)
IMSL C
188
www.vnij.com
IMSL C ライブラリ命名規則
• C Math Libraryデータタイプ 接頭辞
単精度 imsl_f_倍精度 imsl_d_整数 imsl_i_単精度複素数 imsl_c_倍精度複素数 imsl_z_
• C Stat Libraryデータタイプ 接頭辞
単精度 imsls_f_倍精度 imsls_d_整数 imsls_i_
IMSL C
189
www.vnij.com IMSL Cライブラリの
インクルードファイル
• インクルードファイルの使用方法 :• IMSLの関数を使用しているプログラムの先頭
に指定– C/MATH - #include <imsl.h>– C/STAT - #include <imsls.h>
IMSL C
190
www.vnij.com
IMSL Cライブラリの引数規則
• オプション引数の使用
• 引数の 後は必ず0
オプション引数
例: 必須の引数 オプション引数の値
x=imsl_f_lin_sol_gen(n, a, b, IMSL_INVERSE, &p_inva, 0);
引数の 後は0
IMSL C
191
www.vnij.com IMSL Cライブラリの
メモリーアロケーション
• 多くの関数での戻り値は結果の行列のポインタ– 関数はポインタを初期化して答をそこに格納する
• オプション引数
IMSL_RETURN_USER, float a[]– ユーザ提供の配列に答えが格納される。関数の
戻り値のポインタはユーザ提供の配列
IMSL C
192
www.vnij.com IMSL Cライブラリの
メモリーアロケーション例
• lin_sol_gen(連立一次方程式 Ax=b の解を求める)
– ポインタにアドレスを返すfloat *x;float a[] = {…float b[] = {…x = imsl_f_lin_sol_gen (n, a, b, 0);
– ユーザ提供の行列に値を返すfloat x[3];float a[] = {…float b[] = {…Imsl_f_lin_sol_gen (n, a, b, IMSL_RETURN_USER, x, 0);
IMSL C
193
www.vnij.com IMSL Cライブラリの
エラーハンドリング
IMSL C
根本的なエラー終了印字IMSL_TERMINAL
WARNINGと同じ。メッセージ
出力のタイミングが即時継続印字IMSL_WARNING_IMMEDI
ATEFATALと同じ。メッセージ出力
のタイミングが即時終了印字IMSL_FATAL_IMMEDIATE
プログラムを修正終了印字IMSL_FATAL
条件によってはプログラムを修正
継続印字IMSL_WARNINGアンダーフローの発生継続無IMSL_ALERT
エラーの可能性継続無IMSL_NOTE
エラーの内容プログラムの終了
メッセージの印字
エラーレベル
• 7種類のエラータイプ、各エラータイプごとにエラー後の処理のデフォルトを持つ
194
www.vnij.com
IMSL Cエラーハンドリング関数(1/4)
#include <imsl.h>
void imsl_error_options (IMSL_SET_PRINT, Imsl_error_type, int setting, /*プリント制御の指定*/IMSL_SET_STOP, Imsl_error_type, int setting, /*ストップ制御の指定*/IMSL_SET_TRACEBACK, Imsl_error_type, int setting,
/*トレースバック設定*/IMSL_FULL_TRACEBACK, int setting, /*トレースバック設定2*/IMSL_GET_PRINT, Imsl_error_type, int *psetting,/*プリント制御の確認*/IMSL_GET_STOP, Imsl_error_type, int *psetting, /*ストップ制御の確認*/IMSL_GET_TRACEBACK, Imsl_error_type, int *psetting,
/*トレースバック制御の確認*/
IMSL C
195
www.vnij.com
IMSL Cエラーハンドリング関数(2/4)
IMSL_SET_ERROR_FILE, FILE *file, /*エラー出力ファイルの指定*/IMSL_GET_ERROR_FILE, FILE **pfile,
/*エラー出力ファイルの確認*/IMSL_ERROR_MSG_PATH, char *path,
/*エラーメッセージファイルのパスの指定*/IMSL_ERROR_MSG_NAME, char *name,
/*エラーメッセージファイル名の指定*/IMSL_ERROR_PRINT_PROC, Imsl_error_print_proc print_proc,
/*ユーザ作成のエラープリント関数の指定*/IMSL_SET_SIGNAL_TRAPPING, int setting,
/*パラレル時の信号割り込みの指定*/0);
IMSL C
196
www.vnij.com
IMSL Cエラーハンドリング関数(3/4)
<引数例>imsl_error_options
(IMSL_SET_PRINT, Imsl_error_type, int setting,0);Imsl_err_type 0(ゼロ。全タイプ)
IMSL_NOTE IMSL_ALERTIMSL_WARNING IMSL_WARNING_IMMEDIATEIMSL_FATAL IMSL_FATAL_IMMEDIATEIMSL_TERMINAL
int setting -1:変更なし 1:出力あり
0:出力なし 2:既定値にもどす
<例> FATALエラーの時処理を続行し、ALERTエラーの時メッセージを印字する
imsl_err_options(IMSL_SET_STOP, IMSL_FATAL, 0,IMSL_SET_PRINT, IMSL_ALERT, 1, 0);
IMSL C
197
www.vnij.com
IMSL Cエラーハンドリング関数(4/4)
<使用例2>ユーザ作成のエラー出力関数を使用する。
imsl_error_options(IMSL_ERROR_PRINT_PROC, print_proc, 0);
:
void print_proc(Imsl_error type, long code, char *function_name)
{printf(“Error message type%d¥n”, type);printf(“Error code%d¥n”, code); printf(“Error function %s¥n”,function_name);printf(“%s¥n”,message);
}
IMSL C
198
www.vnij.com
IMSL Cエラー情報の取得
●エラーコード取得関数
imsl_error_code( )
<使用例>
x = imsl_f_lin_sol_nonnegdef(n, a, b, 0);If (imsl_error_code() ==IMSL_NOT_NONNEG_DEFINITE)
{エラー処理
}
IMSL C
199
www.vnij.com
IMSL Cエラーハンドリングの注意事項
Cライブラリのエラーハンドリングは、MATH、STATのルーチンで別々に処理される
<例>
MATHのルーチンに対するエラーハンドリング
#include <imsl.h>imsl_err_options (IMSL_SET_PRINT, …, 0);
STATのルーチンに対するエラーハンドリング
#include <imsls.h>imsls_err_options (IMSLS_SET_PRINT, …, 0);
IMSL C
200
www.vnij.com
IMSL Cのマルチスレッドでの使用
• IMSL Cライブラリ は100%のスレッドセーフを保証
• POSIXスレッドと WIN32 スレッドをサポート– マルチスレッドのアプリケーションからCNLを呼ぶ場合、
IMSLの信号処理をオフにする
– 各スレッドそれぞれでIMSL Cエラーハンドラの オプション
をセット。
IMSL C
201
www.vnij.com IMSL Cのマルチスレッドでのエラーハンドリング(1/3)
<例>複数スレッドでのエラー処理include <stdio.h> C/MATH Library User’s Guide P.823#include "imsl.h"void *ex1(void* arg);void *ex2(void* arg);void main( ){
pthread_t thread1; pthread_t thread2;
/* スレッド作成前にIMSLの信号処理をオフにする */imsl_error_options(IMSL_SET_SIGNAL_TRAPPING, 0, 0);
/* 2つのスレッドを作成 */if (pthread_create(&thread1, NULL ,ex1, (void *)NULL) != 0)
perror("pthread_create"), exit(1);if (pthread_create(&thread2, NULL ,ex2, (void *)NULL) != 0)perror("pthread_create"), exit(1);
(次ページに続く)
IMSL C
202
www.vnij.com IMSL Cのマルチスレッドでのエラーハンドリング(2/3)
/*スレッドの終了待ち */ (前ページからの続き)
if (pthread_join(thread1, NULL) != 0)perror(“pthread_join”),exit(1);
if (pthread_join(thread2, NULL) != 0)perror("pthread_join"),exit(1);
}void *ex1(void* arg) {
float res; /* ターミナルエラーで終了しない */imsl_error_options(IMSL_SET_STOP, IMSL_TERMINAL, 0, 0); res = imsl_f_beta(-1.0, .5); /* 例として故意に誤った引数を指定 */
}void *ex2(void* arg)
{ float res; /* ターミナルエラーで終了しない・トレースバックの出力を指定 */imsl_error_options(IMSL_SET_STOP, IMSL_TERMINAL, 0,
IMSL_SET_TRACEBACK, IMSL_TERMINAL, 1, 0); res = imsl_f_beta(-1.0); /* 例として故意に誤った引数を指定 */
}
IMSL C
203
www.vnij.com IMSL Cのマルチスレッドでのエラーハンドリング(3/3)
Output
*** TERMINAL Error from imsl_f_beta. Both "x" = -1.000000e+00 and "y" = *** 5.000000e-01 must be greater than zero. ← ex1のエラー
*** TERMINAL Error from imsl_f_gamma. The argument for the function can not *** be a negative integer. Argument “x” = -1.000000e+00.
↑ex2のエラー
Here is a traceback of the calls in reverse order. Error Type Error Code Routine ← ex2トレースバック
---------- ---------- -------IMSL_TERMINAL IMSL_NEGATIVE_INTEGER imsl_f_gamma
USER
※エラーのスレッドごとの出力順序は順不同。
IMSL C
204
www.vnij.com
アンダーフローとオーバーフロー
アンダーフロー• IMSLライブラリはアンダーフローによって計算が影響されないように作成さ
れている
• システムはレジスタを0にする
• エラーはIMSL_ALERTレベル
オーバーフロー• IMSL のコードはオーバーフローを回避するように作成されている
• 発生時はプログラムミスのチェックが必要
• エラーはIMSL_FATALレベル
• エラーコード例:
IMSL_LARGE_ARG_OVERFLOWIMSL_ZERO_ARG_OVERFLOWIMSL_SMALL_ARG_OVERFLOW 等
IMSL Fortran,C
205
www.vnij.com
欠測値
• IMSL Fortran と C の多くのルーチンは欠測値の取り扱いが可能
• 欠測値は “Not a Number” または NaN として特別な
値として取り扱う
• 実際の欠測値の値は、機種により異なる
– 次のサブルーチン・関数で参照可能• IMSL Fortran ライブラリ:AMACH または DMACH• IMSL C ライブラリ : imsl_f_machine
IMSL Fortran,C
206
www.vnij.com
IMSL C 行列格納モード
• 一般モード 正方 n x n 行列
• 矩形モード m x n 行列
• 対称モード AT = Aのような正方 n x n 行列
• エルミートモード
AH = ATのような正方 n x n 行列
• 疎行列対応座標格納モード
疎行列の非ゼロ要素の座標と値
• 帯格納モード
非ゼロ要素が主対角項に近い m x n 行列
• 圧縮した疎の列(CSC)フォーマット
IMSL C
207
www.vnij.com
サポートリソース: Cマニュアル
- 英語版4冊
『IMSL C Library V6.0 Function Catalog』
『User’s guide C Math Library』
『 User’s guide C Stat Library 』各2冊
- 日本語版2冊
『IMSL Cライブラリ V6.0関数カタログ』関数一覧
『IMSL C/Mathライブラリ V5.0日本語マニュアル』
『 IMSL C/Statライブラリ V5.0日本語マニュアル』各1冊
日本語マニュアルはCNL5.0英語ドキュメントの抜粋
各章の説明と主な関数の詳細
IMSL C
208
www.vnij.com
IMSL C マニュアル構成
• 各章の構成– 各章の先頭にその章全体の説明と注意事項
– 1ルーチン毎に引数、オプション引数、注意事項、エラーメッセージ等の記述
– 全てのルーチンに1つ以上のプログラム例
• 巻末・参考資料
エラーハンドリング・複素数関数– Appendix A : References– Appendix B : Alphabetical Summary of Routines
IMSL C
209
www.vnij.com
その他サポートリソース
• オンラインドキュメント(PDF・英語マニュアルと同じ)
http://www.vnij.com/products/imsl/documentation/index.html• TIPS データベース
http://www.vni.com/tech/imsl/tips.html• ホワイトペーパー
http://www.vni.com/company/whitepapers• Cross-language Technical Report (Calling Fortran from C,
Report # 8902)http://www.vni.com/tech/imsl/tn.html
IMSL Fortran,C
210
www.vnij.com
サポート連絡先
下記お問い合わせフォームよりご連絡下さい。
http://www.vnij.com/forms/tech_sprt_request.html
緊急時はメール・電話・FAXでのお問い合わせも承ります。
日本ビジュアルニューメリックス㈱
• サポート時間 土日、祭日を除く 10:00 ~ 17:00• Phone Number (03)5211-7760• Fax Number (03)5211-7769• E-mail support@vnij.co.jp
IMSL C ライブラリ
各章概要
212
www.vnij.com
IMSL C Math
1章: 線形システム2章: 固有システム解析3章: 補間と近似4章: 求積5章: 微分方程式6章: 変換7章: 非線形方程式8章: 適化9章: 特殊関数10章: 統計と乱数生成11章:印刷関数12章:ユーティリティ
IMSL C
213
www.vnij.com
IMSL C Stat
1章: 基本統計
2章: 回帰
3章: 相関と共分散
4章: 分散分析と実験計画法
5章: カテゴリデータと離散データの解析
6章: ノンパラメトリック統計
7章: 適合度の検定
8章: 時系列解析と予測
9章: 多変量解析
10章: 生存と信頼性解析
11章: 確率分布関数と逆関数12章: 乱数生成13章: ニューラルネットワーク14章: 印刷関数15章: ユーティリティ
IMSL C
214
www.vnij.comCh. 1 線形システム
Linear Systems
1. 連立方程式の解法: Ax=b を解く
2. 行列の分解、逆行列、行列式の計算など– 様々なタイプの行列をカバー
– 実・複素、対称、正定値、帯・三角、一般・疎など
3. 反復解法– 小残差法(GMRES : Generalized Minimum Residual method)– 共役勾配法(CG : Conjugate Gradient method)
4. 線形 小2乗法と分解:– 線形 小2乗法、QR分解 Ax≅b を解く
– 特異値分解(SVD : Singular Value Decomposition)– Moore-Penroseの一般逆行列の計算
IMSL C Math
A+ = VS+ UT
A = USVT
( )1 11,1 ,, , , 0, , 0i iS diag s s+ - -=
215
www.vnij.comCh. 1 線形システム
Linear Systems
IMSL C Math
#include <imsl.h>
main(){
int n = 3;float *x;float a[] = {1.0, 3.0, 3.0,
1.0, 3.0, 4.0,1.0, 4.0, 3.0};
float b[] = {1.0, 4.0, -1.0};/* Solve Ax = b for x */
x = imsl_f_lin_sol_gen (n, a, b, 0);/* Print x */
imsl_f_write_matrix ("Solution, x, of Ax = b", 1, 3, x, 0);}
OutputSolution, x, of Ax = b
1 2 3-2 -2 3
例:連立方程式の解法 (p.33) lin_sol_gen :
LU分解で Ax = b を解く。
Aは一般実行列。
その他の機能:
ATx = b を解く
Aの逆行列を求める
LU分解のみ行う
与えられたLUでxを求める
条件数L1の推定
x1 + 3x2 + 3x3 = 1x1 + 3x2 + 4x3 = 4x1 + 4x2 + 3x3 = -1
216
www.vnij.comCh. 1 線形システム
Linear Systems
IMSL C Math
#include <imsl.h>void amultp (float*, float*);void precond (float*, float*);
main(){
float b[] = {10.0, 7.0, 45.0, 33.0, -34.0, 31.0};int n = 6;float *x;int maxit = 1000;x = imsl_f_lin_sol_gen_min_residual (n, amultp, b,
IMSL_MAX_ITER, &maxit,IMSL_PRECOND, precond,0);
imsl_f_write_matrix ("Solution, x, to Ax = b", 1, n, x, 0);printf ("¥nNumber of iterations taken = %d¥n", maxit);
}
/* Set z = Ap */void amultp (float *p, float *z){
static Imsl_f_sparse_elem a[] = {0, 0, 10.0,1, 1, 10.0,1, 2, -3.0,1, 3, -1.0,(略)
例:GMRES法による反復解法(p.101) 前処理行列 M=diag(A)
/* Solve Mz = r */void precond (float *r, float *z){
static float diagonal_inverse[] ={0.1, 0.1, 1.0/15.0, 0.1, 1.0, 1.0/6.0};
int n = 6;int i;
for (i=0; i<n; i++)z[i] = diagonal_inverse[i]*r[i];
}Output
Solution, x, to Ax = b1 2 3 4 5 61 2 3 4 5 6
Number of iterations taken = 5
217
www.vnij.comCh. 1 線形システム
Linear Systems
IMSL C Math
#include <imsl.h>static void amultp (float*, float*);static void precond (float*, float*);static Imsl_f_sparse_elem *a;static int n = 2500;static int c = 50;static int nz;
void main(){(略)
/* Generate coefficient matrix *//* Set a predetermined answer and diagonal *//* Get right hand side *//* Solve with jacobi preconditioning */
x = imsl_f_lin_sol_def_cg (n, amultp, b,IMSL_MAX_ITER, &maxit, IMSL_JACOBI, diagonal,0);
/* Find max absolute error, print results *//* Solve same system, with different preconditioner */
x = imsl_f_lin_sol_def_cg (n, amultp, b,IMSL_MAX_ITER, &maxit, IMSL_PRECOND, precond,0);
printf ("iterations = %d, norm = %e¥n", maxit, norm);}
例:CG法による反復解法(p.107)
2つの前処理行列 :
(1) Jacobi : M=diag(A)
(2) Aの三重対角
Outputiterations = 115, norm = 1.382828e-05iterations = 75, norm = 7.319450e-05
218
www.vnij.comCh. 1 線形システム
Linear Systems
IMSL C Math
#include <imsl.h>main() {
int nra = 4; int nca = 3;int ncon = 1; float *x; float a[] = {3.0, 2.0, 1.0,
4.0, 2.0, 1.0, 2.0, 2.0, 1.0, 1.0, 1.0, 1.0};
float b[] = {3.3, 2.3, 1.3, 1.0}; float c[] = {1.0, 1.0, 1.0}; float xlb[] = {0.0, 0.0, 0.0}; float xub[] = {0.5, 0.5, 0.5}; int con_type[] = {1}; float bc[] = {1.0};x = imsl_f_lin_lsq_lin_constraints (nra, nca, ncon, a, b, c,
bc, bc, con_type, xlb, xub, 0);imsl_f_write_matrix ("Solution", 1, nca, x, 0); }
OutputSolution
1 2 30.5 0.3 0.2
例:線形拘束のある 小2乗問題の解法 (p.119)Ax ≅ b
条件: bl ≤ Cx ≤ bu
xl ≤ x ≤ xu
アルゴリズム:R.Hanson (VNI社) のペナ
ルティ法
3x1 + 2x2 + x3 = 3.34x1 +2x2 + x3 = 2.22x1 + 2x2 + x3 = 1.3x1 + x2 + x3 = 1.0
Subject tox1 = x2 + x3 ≤ 10 ≤ x1 ≤ 0.50 ≤ x2 ≤ 0.50 ≤ x3 ≤ 0.5
219
www.vnij.comCh. 2 固有システム解析
Eigensystem Analysis
1. 固有値と固有ベクトルの計算 Ax=λx2. 一般化固有値問題 Ax=λBx3. 様々なタイプの行列をカバー
– 実・複素、対称、正定値 など
IMSL C Math
220
www.vnij.comCh. 2 固有システム解析
Eigensystem Analysis
IMSL C Math
#include <imsl.h>
main() {int n = 3;float a[] = {8.0, -1.0, -5.0,
-4.0, 4.0, -2.0,18.0, -5.0, -7.0};
f_complex *eval;f_complex *evec;
/* Compute eigenvalues of A */eval = imsl_f_eig_gen (n, a,
IMSL_VECTORS, &evec,0);
/* Print eigenvalues and eigenvectors */imsl_c_write_matrix ("Eigenvalues", 1, n, eval, 0);imsl_c_write_matrix ("Eigenvectors", n, n, evec, 0);
}
OutputEigenvalues
1 2 3( 2, 4) ( 2, -4) ( 1, 0)
Eigenvectors1 2 3
1 ( 0.3162, 0.3162) ( 0.3162, -0.3162) ( 0.4082, 0.0000)2 ( 0.0000, 0.6325) ( 0.0000, -0.6325) ( 0.8165, 0.0000)3 ( 0.6325, 0.0000) ( 0.6325, 0.0000) ( 0.4082, 0.0000)
例:固有値と固有ベクトルの計算(p.143)
eig_gen :
Ax=λx Aは一般実行列
221
www.vnij.comCh. 2 固有システム解析
Eigensystem Analysis
IMSL C Math
#include <imsl.h>main() {
int n = 3; float a[] = {1.1, 1.2, 1.4,
1.2, 1.3, 1.5, 1.4, 1.5, 1.6};
float b[] = {2.0, 1.0, 0.0, 1.0, 2.0, 1.0, 0.0, 1.0, 2.0};
/* Solve for eigenvalues and eigenvectors */ eval = imsl_f_eig_symgen (n, a, b, IMSL_VECTORS, &evec,
0);/* Print eigenvalues and eigenvectors */
imsl_f_write_matrix ("Eigenvalues", 1, n, eval, 0); imsl_f_write_matrix ("Eigenvectors", n, n, evec, 0);
}OutputEigenvalues
1 2 3 1.386 -0.058 -0.003Eigenvectors
1 2 3 1 0.6431 -0.1147 -0.6817 2 -0.0224 -0.6872 0.7266 3 0.7655 0.7174 -0.0858
例:一般化固有値問題Ax=λBxの解法 (p.154)
A,Bは実対称、Bは正定値
222
www.vnij.comCh. 3 補間と近似
Interpolation and Approximation
1. Cubic Spline– 補間、積分計算など
2. 小2乗近似と平滑化
3. 散布データ補間– 秋間浩のsurface fitting法(5次)
– radial base関数による 小2乗近似
IMSL C Math
223
www.vnij.com
x
( )2
1
0 1
n m
i i j j ii j
w f a B x-
= =
é ù-ê ú
ë ûå å
IMSL C Math
例: Cubic Spline fit to noisy Least square Spline approximation routineImsl_f_spline_least_squares (p.221)
Default : min
( ) ( )1 1
, ,0 0
,n m
i i j j k ii j
F a w f a B x- -
= =
é ù= -ê ú
ë ûå å tt
Optimize knot locations : min
Ch. 3 補間と近似Interpolation and Approximation
224
www.vnij.comCh. 4 求積
Quadrature
1. 1次元積分
2. 2次元積分
3. 多次元積分– Gaussの公式
– 一般化Faure列によるMonte Carlo法
4. 微分– 1次、2次,3次微分
5. Gaussの求積ルールGauss, Gauss-Radau, Gauss-Lobatto
f は2N未満のオーダーの多項式
( ) ( )b
af x w x dxò
( )( )
( ),
b h x
a g xf x y dy dxò ò
( )1
11 1, ,n
n
b b
n na af x x dx dxò ò
( ) ( ) ( )1
Nb
i iai
f x w x dx f x w=
=åò
( )( )( )( )( )
( ) ( ) ( )( )
( ) ( )
2
2
2
1 1, 1 Legendre
1/ 1- 1, 1 Chebyshev 1st kind
1 1, 1 Chebyshev 2nd kind
, Hermite
1 1 1, 1 Jacobi0, Generalized Laguerre
1/ cosh Hyperbolic cosine
x
x
w x
x
x
e
x xe x
x
a b
a
-
-
-
-
- -
-¥ ¥
+ - -¥
-¥ ¥
Interval Name
IMSL C Math
225
www.vnij.comCh. 4 求積
Quadrature
IMSL C Math
#include <imsl.h>#include <math.h>
float fcn(int ndim, float x[]);
main(){
int k, ndim = 10;float q, a[10], b[10];
for (k = 0; k < ndim; k++) {a[k] = 0.0;b[k] = 1.0;
}
q = imsl_f_int_fcn_qmc (fcn, ndim, a, b, 0);printf ("integral=%10.3f¥n”, q);
}
float fcn (int ndim, float x[]){
int i, j;float prod, sum = 0.0, sign = -1.0;
for (i = 0; i < ndim; i++) {prod = 1.0;for (j = 0; j <= i; j++) {
prod *= x[j];}sum += sign * prod;sign = -sign;
}return sum;
}
Output
q = -0.333
例:準モンテカルロ法による積分(p.307)(n=10の場合の例)
QMC:Quasi-Monte Carlo法による求積。乱数列としてLow-discrepancyの一般化Faure列を
用いる。
( )1
1 1
0 01 1
1 11 13 2
niwi
j ni j
x d x d x= =
é ùæ ö- = - - -ê úç ÷è øê úë û
å Õò ò
226
www.vnij.comCh. 5 微分方程式
Differential Equations
1. 常微分方程式の解 (ODE)– 初期値問題
• Runge-Kutta法、Adams-Gear法– 境界値問題
• 有限差分法
2. 微分代数式の解– Petzold-Gear法
3. 偏微分方程式の解 (PDE)– ムービンググリッドによる解法(1D)– 直線法(method of lines)による解法 ut = f(x, t, u, ux, uxx)
– 2次元Laplace, Poisson, Helmholtz 方程式の高速Poisson解法
IMSL C Math
( )1, 1, ,,..., ...ii Ni
dyy t y y i N
dtf¢ == =
( )2 2
2 2,u u cu f x y
x y¶ ¶¶ ¶
+ + =
( ) ( ) ( )1, , , , , , , , 0T
Ng t y y g t y y g t y y¢ ¢ ¢= =é ùë û
( ) 0, , , ,t L R
uu f u x t x x x t tt
¶º = < < >¶
227
www.vnij.comCh. 5 微分方程式
Differential Equations
IMSL C Math
#include <imsl.h>
void fcn(int neq, float t, float y[], float yprime[]);
main(){
int neq = 2;float t = 0.0; /* Initial time */float tend; /* Final time */float y[2] = {1.0, 3.0}; /* Initial conditions */int k;int nstep;void *state;
/* Initialize the ODE solver */imsl_f_ode_runge_kutta_mgr(IMSL_ODE_INITIALIZE, &state,
IMSL_TOL, 0.0005,IMSL_NSTEP, &nstep,IMSL_NORM, 1,0);
printf("¥n Start End Density of Density of Number of" );printf("¥n Time Time Rabbits Foxes Steps¥n¥n");
for (k = 0; k < 10; k++) {tend = k + 1;imsl_f_ode_runge_kutta (neq, &t, tend, y, state, fcn);printf("%3d %12.3f %12.3f %12.3f %12d¥n", k, t, y[0], y[1], nstep);
}imsl_f_ode_runge_kutta_mgr(IMSL_ODE_RESET, &state, 0);
}
void fcn (int neq, float t, float y[], float yprime[]){
/* Density change rate for Rabbits: */yprime[0] = 2*y[0]*(1 - y[1]);
/* Density change rate for Foxes: */yprime[1] = -y[1]*(1 - y[0]);
}
例: 捕食-被食の関係式 (p.324)
Lotka-Volterra system :r’ = 2r-2rff’ = -f+rfr(0) = 1, f(0) = 3
r : ウサギの数
f : 狐の数
(JMSLによる表示)
228
www.vnij.comCh. 5 微分方程式
Differential Equations
IMSL C Math
#include <imsl.h> #include <math.h>main() {
void cnut(int, float, float, float *, float *, float *, float *); /* other lines are omitted *//* Set breakpoints and initial conditions */
for (i = 0; i < nx; i++) { xbreak[i] = (float) i / (float) (nx - 1); y[i] = sin(pi * xbreak[i]); y[nx + i] = 0.0; deriv[i] = pi * cos(pi * xbreak[i]); deriv[nx + i] = 0.0;
}/* Initialize the solver */
tol = sqrt(imsl_f_machine(4)); imsl_f_pde_method_of_lines_mgr(IMSL_PDE_INITIALIZE, &state,
IMSL_TOL, tol, IMSL_INITIAL_VALUE_DERIVATIVE, deriv, 0);
while (j <= nstep) { j++; tend += 0.01;
/* Solve the problem */imsl_f_pde_method_of_lines(npdes, &t, tend, nx, xbreak, y,
state, fcnut, fcnbc);
/* Look at output at steps of 0.01 and compute errors */
for (i = 0; i < nx; i++) { error[i] = y[i] - sin(pi * xbreak[i]) *
cos(pi *tend); erru = imsl_f_max(erru, fabs(error[i]));
} }
printf("Maximum error in u(x,t) = %e¥n", erru);}
OutputMaximum error in u(x,t) = 6.228203e-04
例:弦の振動 utt = uxx(p.419)初期条件:u(x,0)=sin(πx)境界条件:両端固定
解:u(x,t)=sin(πx)cos(πt)
229
www.vnij.comCh. 5 微分方程式
Differential Equations
IMSL C Math
#include <stdio.h>#include <math.h>#include "imsl.h"(略)imsl_d_pde_1d_mg_mgr (IMSL_PDE_INITIALIZE, &state,
IMSL_TIME_SMOOTHING, tau,IMSL_MAX_BDF_ORDER, max_bdf_order,IMSL_INITIAL_CONDITIONS, initial_conditions, 0);
fprintf (file1, "%f¥n", t0);tout = delta_t;do{
imsl_d_pde_1d_mg (npdes, ngrids, &t0, tout, u, xl,xr, state, pde_systems, boundary_conditions,IMSL_RELATIVE_TOLERANCE, rtol,IMSL_ABSOLUTE_TOLERANCE, atol, 0);
t0 = tout;if (t0 <= tend){
fprintf (file1, "%f¥n", tout);for (i = 0; i < npdes + 1; i++){
for (j = 0; j < ngrids; j++){
fprintf (file1, "%16.10f ", U (i, j));if (((j + 1) % 4) == 0)
fprintf (file1, "¥n");}fprintf (file1, "¥n");
}}tout = MIN ((tout + delta_t), tend);
} (略)
例:pde_1d_mgによる2つの波の干渉の計算(p.376) PV-WAVEで表示
( ) ( )( ) [ ]
( ) ( )( ) [ ]
100 ,100 ,
0.5 0.5,0 0.5
,0 0.5 1 10 , 0.3, 0.1 ,and
0,otherwise,
,0 0.5 1 10 0.1,0.3 ,and
0,otherwise,0 at both ends, t 0
t x
t x
u u uvv v uv
x tu x cos x x
v x cos x x
u v
p
p
= - -= -
- £ £ £ £
= + Î - -
=
= + Î
== = ³
230
www.vnij.comCh. 6 変換
Transforms
1. 高速 Fourier 変換 (FFT)– 実・複素
– cos, sin 変換
– 2次元複素FFT
2. たたみ込みと相関
3. 逆Laplace 変換
IMSL C Math
231
www.vnij.comCh. 6 変換
Transforms
IMSL C Math
#include "imsl.h" #include <math.h>#define NFLTR 5 #define NY 100
/* Define function */#define F1(A) exp(A) main() {
int i, k, nz; float fltr[NFLTR], fltrer, origer, total1, total2, twopi,
x, y[NY], *z, *noise;/* Set up the filter */
for (i = 0; i < NFLTR; i++) fltr[i] = 0.2;/* Set up y-vector for the nonperiodic case */
twopi = 2.0*imsl_f_constant ("Pi", 0); imsl_random_seed_set(1234579); noise = imsl_f_random_uniform(NY, 0);for (i = 0; i < NY; i++) {
x = (float)(i) / (NY - 1); y[i] = F1(x) + 0.5 *noise[i] - 0.25;
} /* Call the convolution routine for the
nonperiodic case. */z = imsl_f_convolution(NFLTR, fltr, NY, y, &nz, 0);
/* * Call test routines to check z & zhat here. Print results */for (i = 0; i < NY; i++) {
if (i >= NY-2)k = i - NY + 2;
else k = i + 2; x = (float)(i) / (float) (NY - 1); origer = fabs(y[i] - F1(x)); fltrer = fabs(z[i+2] - F1(x));
total1 += origer; total2 += fltrer;
} printf(" Average absolute error before filter: /*omitted */);
}OutputNonperiodic Case
x F1(x) Original Error Filtered Error 0.0000 1.0000 0.0811 0.3523
/* omitted */1.0000 2.7183 0.0154 1.1255 Average absolute error before filter: 0.12481 Average absolute error after filter: 0.06785
例:簡単なデジタルフィルター (p.457) 非周期的たたみ込みの計算
232
www.vnij.comCh. 7 非線形方程式
Nonlinear Equations
1. 多項式のゼロ点– Jenkins-Traub法
2. 関数のゼロ点– Müller法
3. 非線形連立方程式の解– 修正Powellハイブリッド法
IMSL C Math
233
www.vnij.comCh. 7 非線形方程式
Nonlinear Equations
IMSL C Math
#include <imsl.h>float fcn(float x);main() {
float xguess[ ] = {4.6, 0.0, -193.3};int nroot = 3;float eps = 1.0e-5;float err_abs = 1.0e-5;float err_rel = 1.0e-5;float eta = 1.0e-2;int max_itn = 100;float *x;
/* Solve fcn(x)=0 for x */x = imsl_f_zeros_fcn (fcn,
IMSL_XGUESS, xguess,IMSL_ERR_REL, err_rel,IMSL_ERR_ABS, err_abs,IMSL_ETA, eta,IMSL_EPS, eps,IMSL_NUM_ROOTS, nroot,IMSL_MAX_ITN, max_itn,0);
/* Print x */imsl_f_write_matrix ("x", 1, 3, x, 0);
}
float fcn(float x) {return x * x * x + 3.0 * x * x - 4.0 * x - 6.0;
}Output
x1 2 3
1.646 -1.000 -3.646
例:3次多項式の3つのゼロ点を求める。 (p.483) Müller’s method (空丸 ○ が初期推定値)
Plot of x3 + 3x2 - 4x - 6
Warning ErrorsIMSL_NO_CONVERGE_MAX_ITER Failure to converge within max_itn iterations for at least one of the nroot roots.
234
www.vnij.comCh. 8 適化
Optimization
• 拘束の無い場合– 単変量関数
• 関数値のみを使う• 関数値と1回微分を使う
– 多変量関数• 準Newton法• 修正Levengerg-Marquardt法による非線形 小2乗
• 線形拘束の場合– MPSファイルの読み込みルーチン– Kroghのアクティブセット法による高速な線形計画法– 改定Simplex法による線形計画法– Powellの手法による2次計画法– Powellの一般の目的関数の 小化法– 修正Levengerg-Marquardt法による区間拘束のある場合の非線形 小2乗
• 非線形拘束の場合– 一般の非線形プログラミング解法(Spellucciの方法)
IMSL C Math
( )minnx
f xÎR
( )
1 1
min
subject to nx
f x
A x bÎ
=R
( )
( )( )
1
1
min
subject to 0 for 1, 2, ...,
0 for 1, ...,
nx
i
i
f x
g x i m
g x i m m
Î
= =
³ = +
R
min subject to n
Tl x u
x
l u
c x b A b
x x xÎ
£ £
£ £R
235
www.vnij.comCh. 8 適化
Optimization
IMSL C Math
#include <stdio.h> #include <imsl.h>void main() {
int i, n=2; float *result, fx; static float rosbrk(int, float[]);
/* Minimize Rosenbrock function */result = imsl_f_min_uncon_multivar(rosbrk, n, 0); fx = rosbrk(n, result);
/* Print results */printf(" The solution is "); for (i = 0; i < n; i++) printf("%8.3f", result[i]); printf(“¥n¥n The function value is %8.3f¥n", fx);
} /* end of main */
static float rosbrk(int n, float x[]) {
float f1, f2;f1 = x[1] - x[0]*x[0]; f2 = 1.0 - x[0];return 100.0 * f1 * f1 + f2 * f2; }
/* end of function */OutputThe solution is 1.000 1.000The function value is 0.000
例:Rosenbrock関数 f(x) = 100(x2-x1
2)2 + (1-x1)2 の 小化(p.506) 初期推定 x=(-1.2,1.0)
236
www.vnij.comCh. 8 適化
Optimization
IMSL C Math
#include <imsl.h>
main(){
int m = 4; /* constraints */int n = 6; /* variables */double a[ ] = {1.0, 1.0, 1.0, 0.0, 0.0, 0.0,
1.0, 1.0, 0.0, -1.0, 0.0, 0.0,1.0, 0.0, 0.0, 0.0, 1.0, 0.0,0.0, 1.0, 0.0, 0.0, 0.0, 1.0};
double b[ ] = {1.5, 0.5, 1.0, 1.0};double c[ ] = {-1.0, -3.0, 0.0, 0.0, 0.0, 0.0};double *x;
/* Solve the LP problem */
x = imsl_d_linear_programming (m, n, a, b, c, 0);/* Print x */
imsl_d_write_matrix ("x", 1, 6, x, 0);}
Outputx
1 2 3 4 5 60.5 1.0 0.0 1.0 0.5 0.0
例:線形計画法 (p.529)F.Krogh(VNI社)のActive set strategy法による高速解法ルーチン
min f(x) = -x1 - 3x2
subject to
x1+x2+x3 = 1.5
x1+x2 -x4 = 0.5
x1 +x5 = 1.0
x2 +x6 = 1.0
0≦xi for i = 1,,,6
min subject to n
Tl x u
x
l u
c x b A b
x x xÎ
£ £
£ £R
237
www.vnij.com Ch. 8 適化 OptimizationNetlib benchmark problemshttp://www-fp.mcs.anl.gov/otc/Guide/TestProblems/LPtest/
IMSL C Library vs LSSOL (Fortran)
IMSL C library solves 100% but other LP can solve 60%
0.1
1.0
10.0
100.0
CAPRI
GRO
W7
ISRA
EL
SH
ARE1B
VTP_BAS
EB
RA
ND
YSC
ORPIO
NLO
TFI
SCSD
1E226
SCTAP1
BA
ND
MFIT
1D
SCFXM
1STAIR
STAN
DATA
AG
G3
AG
GAG
G2
ETA
MA
CR
OS
CSD
6FI
NN
ISSH
IP04S
SH
ELL
SCFXM
2G
FR
D-P
NC
STAN
DM
PS
GAN
GES
SH
IP04L
PIL
OT4
SH
IP08S
SIE
RRA
WO
OD
1PSH
IP12S
BN
L1S
HIP
08L
25FV47
CZPRO
BPE
RO
LDS
HIP
12L
PIL
OTN
OV
FIT
2D
BN
L2M
ARO
S-R
7
Rel
ativ
e Tim
e
IMSL Leading Dense LP Optimizer
IMSL C library performance is about 10 times faster than other
238
www.vnij.comCh. 8 適化
Optimization
IMSL C Math
#include "imsl.h"main() {
void fcn(int, float *, float *); int neq = 2; int ncon = 2; int nvar = 5;float a[] = {1.0, 1.0, 1.0, 1.0, 1.0,
0.0, 0.0, 1.0, -2.0, -2.0}; float b[] = {5.0, -3.0}; float xlb[] = {0.0, 0.0, 0.0, 0.0, 0.0}; float xub[] = {10.0, 10.0, 10.0, 10.0, 10.0}; float *x;x = imsl_f_min_con_gen_lin(fcn, nvar, ncon, neq, a, b, xlb, xub,
0);imsl_f_write_matrix("Solution", 1, nvar, x, 0);
}void fcn(int n, float *x, float *f) {
*f = x[0]*x[0] + x[1]*x[1] + x[2]*x[2] + x[3]*x[3] + x[4]*x[4] - 2.0*x[1]*x[2] - 2.0*x[3] * x[4] - 2.0*x[0];
} OutputSolution 1 2 3 4 5 1 1 1 1 1
例:線形拘束のある一般の目的関数の 小化 (p.546) M.J.D.Powellの方法によ
る線形拘束問題の解法
min f(x) = x12+x2
2+x32+x4
2+x52
-2x2x3-2x4x5-2x1
subject to
x1+x2+x3+x4+x5 = 5
x3-2x4-2x5 = -3
0≦x≦10
239
www.vnij.comCh. 8 適化
Optimization
IMSL C Math
include "imsl.h"#define M 2#define ME 1#define N 2void grad(int n, float x[], int iact, float result[]);void fcn(int n, float x[], int iact, float *result, int *ierr);void main(){int ibtype = 0;float *x, ans[2];static float xlb[N], xub[N];xlb[0] = xlb[1] = imsl_f_machine(8);xub[0] = xub[1] = imsl_f_machine(7);x = imsl_f_constrained_nlp(fcn, M, ME, N, ibtype, xlb, xub, 0);imsl_f_write_matrix ("The solution is", 1, N, x, 0);
}/* Himmelblau problem 1 */
void fcn(int n, float x[], int iact, float *result, int *ierr){float tmp1, tmp2;tmp1 = x[0] - 2.0e0;tmp2 = x[1] - 1.0e0;switch (iact) {case 0:*result = tmp1 * tmp1 + tmp2 * tmp2;break;
case 1:*result = x[0] - 2.0e0 * x[1] + 1.0e0;break;
例: P.SpellucciのSQP(sequential quadratic programming)法による非線形 適化 (p.563)
( ) ( ) ( )( )( )
2 21 2
1 1 2
22 1 2
min 2 1
subject to 2 1 02 / 4 1 0
F x x x
g x x x
g x x x
= - + -
= - + =
= - - + ³
case 2:*result = -(x[0]*x[0]) / 4.0e0 - x[1]*x[1] + 1.0e0;break;
default: ;break;
}*ierr = 0;return;
}
OutputThe solution is
1 20.8229 0.9114
240
www.vnij.comCh. 9 特殊関数
Special Functions
• 誤差関数
• ベータ関数
• ガンマ関数
• Bessel関数
• 楕円積分
• Fresnel積分
• Airy関数
• Kelvin関数
• 金融関数
• 債権関数
• 確率分布関数と逆関数
– 標準正規分布
– χ2分布
– F分布
– Studentのt 分布
– Γ分布
– 2項分布
– 超幾何分布
– Poisson分布
– β分布
– 2変量正規分布
IMSL C Math
241
www.vnij.com Ch. 10 統計と乱数生成Statistics and Random Number Generation
(Stat Ch.11, 12 参照)
• 単変量統計量の計算
• 1元度数分布表
• χ2適合度検定
• 分散-共分散、相関行列
• 線形回帰モデル
• 順位(rank)計算
• 擬似乱数の生成– 乗算合同法
• 一様分布
• 標準正規分布
• Poisson分布
• Γ分布
• β分布
• 指数分布
• 準乱数– シャッフルされたFaure列
IMSL C Math
242
www.vnij.com Ch. 11 印刷 Printing FunctionsCh.12 ユーティリティ Utilities
1. 印刷と設定
2. 出力ファイルの指定
3. 時間と日付
4. エラー操作
5. 定数、マシン定数
6. ソート
7. ベクトルのノルム
8. 線形代数演算のサポート– 行列の演算、ノルム
– テスト用行列の生成
IMSL C Math
243
www.vnij.comCh. 1 基本統計
Basic Statistics
1. 単変量の統計値 (平均、分散など)の計算
2. 1または2の正規母集団からの標本を用いて
平均と分散を推定
3. 1元または2元の度数分布表 (frequency table)を作成
4. 多変量データのソートと度数分布表作成
5. 順位(rank)と順序(order)統計量
IMSL C Stat
244
www.vnij.comCh. 1 基本統計
Basic Statistics
IMSL C Stat
#include <imsls.h>main(){#define N1_OBSERVATIONS 7#define N2_OBSERVATIONS 9
int df;float diff_means, lower_limit, upper_limit, t, p_value, sp2;float x1[N1_OBSERVATIONS] = {
72.0, 75.0, 77.0, 80.0, 104.0, 110.0, 125.0};float x2[N2_OBSERVATIONS] = {
111.0, 118.0, 128.0, 138.0, 140.0, 150.0, 163.0, 164.0, 169.0};
/* Perform analysis */diff_means = imsls_f_normal_two_sample(N1_OBSERVATIONS, x1,
N2_OBSERVATIONS, x2, IMSLS_POOLED_VARIANCE, &sp2,IMSLS_CI_DIFF_FOR_EQUAL_VARS, &lower_limit, &upper_limit,IMSLS_T_TEST_FOR_EQUAL_VARS, &df, &t, &p_value,0);
/* Print results */printf("¥nx1_mean - x2_mean = %5.2f¥n", diff_means);printf("Pooled variance = %5.2f¥n", sp2);printf("95%% CI for x1_mean - x2_mean is (%5.2f,%5.2f)¥n",
lower_limit, upper_limit);printf("df = %3d¥n", df);printf("t = %5.2f¥n", t);printf("p-value = %8.5f¥n", p_value);
}Outputx1_mean - x2_mean = -50.48Pooled variance = 43
例:2つの標本(テストの成績)の平均の検定 (p.17)• グループXはグループYより平
均は低いか?
• 2つの母集団の分散は同じとして t 検定を行う。
• 帰無仮説 μx<μyは5%の有意
水準で棄却される。
(1/ ) (1/ )x y
x yts n n
-=
+
245
www.vnij.comCh. 2 回帰
Regression
1. 多変量線形回帰分析– モデルの当てはめ
• 一般線形モデル
• 小2乗による多変量線形回帰モデル
– 統計的推論と診断• 回帰モデルの要約統計値、予測値
• 多変量線形仮説の検定
2. 変数の選択• Furnival-Wilsonの 良の線形回帰モデル
• Efroymson-Goodnightのステップワイズによる線形回帰モデル
3. 多項式回帰と非線形回帰• 多項式回帰モデル
• 改良Levenberg-Marquardt法による非線形回帰モデル yi = f(xi;q) + ei i = 1, 2, , n• PowellのSQP(Successive Quadratic Programming)による非線形回帰モデル
4. 小2乗以外での線形回帰モデルの当てはめ• 小絶対値(LAV, L1)、Lpノルム、 小 大値(Minimax, L∞)
IMSL C Stat
yi = b0 + b1xi + ei i = 1, 2, ..., n
1 1 2 2 ... 1, 2,...,i i i k ik iy x x x i nob b b b e= + + + + + =
21 2 .... 1, 2, ,k
i i i k i iy x x x i nob b b b e= + + + + + =
246
www.vnij.comCh. 2 回帰
Regression
IMSL C Stat
#include <imsls.h>#include <math.h>#define N_INDEPENDENT 2#define N_COEFFICIENTS N_INDEPENDENT + 1#define N_OBSERVATIONS 4main(){
int i;float *coefficients, w[N_OBSERVATIONS], anova_table[15],
power;float x[][N_INDEPENDENT] = {
-2.0, 0.0, -1.0, 2.0, 2.0, 5.0,7.0, 3.0};
float y[] = {-3.0, 1.0, 2.0, 6.0};char *anova_row_labels[] = {
“degrees of freedom for regression”, (omitted)"coefficient of variation (in percent)"};
/* Calculate weights */power = 0.0;for (i = 0; i < N_OBSERVATIONS; i++) {
power += 1.0;w[i] = 1.0 / (power*power);
}/*Perform analysis */
coefficients = imsls_f_regression(N_OBSERVATIONS, N_INDEPENDENT, (float *) x, y,IMSLS_WEIGHTS, w, IMSLS_ANOVA_TABLE_USER, anova_table,0);
例: Weighted least square fit (p.72)
yi = b0 + b1xi1 + b2xi2 + ei i = 1,2,,, 4
wi = 1/i2
Error sum of squares :
/* Print results */imsls_f_write_matrix("Least Squares Coefficients", 1,
N_COEFFICIENTS, coefficients, 0);imsls_f_write_matrix("* * * Analysis of Variance * * *¥n", 15,
1, anova_table,IMSLS_ROW_LABELS, anova_row_labels,IMSLS_WRITE_FORMAT, "%10.2f", 0);
}
OutputLeast Squares Coefficients
1 2 3-1.431 0.658 0.748
* * * Analysis of Variance * * *
degrees of freedom for regression 2.00 (omitted)
( )4
2
=1
ˆSSE= i i ii
w y y-å
247
www.vnij.comCh. 2 回帰
Regression
IMSL C Stat
#include <imsls.h>#include <stdio.h>void main(){
float xx[] = {1.0, 4.0, 2.0, 2.0, 3.0, 3.0, 4.0, 5.0};float yy[] = {1.0, 5.0, 0.0, 2.0, 1.5, 2.5, 2.0, 3.0};float p, tolerance, convergence_eps, square_of_scale, df_error,&
Lp_norm_residual;float R_matrix[4], residuals[8];int i, irank, iter, nrmiss;int n_row=2;int n_col=2;float *coefficients = NULL;tolerance = 100*imsls_f_machine(4);convergence_eps = 0.001;p = 1.0;for(i=0; i<4; i++){ coefficients = imsls_f_Lnorm_regression(8, 1, xx, yy,
IMSLS_METHOD_LLP, p,IMSLS_EPS, convergence_eps,IMSLS_RANK, &irank,IMSLS_ITERATIONS, &iter,IMSLS_N_ROWS_MISSING, &nrmiss,IMSLS_R_USER, R_matrix,IMSLS_DEGREES_OF_FREEDOM, &df_error,IMSLS_RESIDUALS_USER, residuals,IMSLS_SCALE, &square_of_scale,IMSLS_RESIDUALS_LP_NORM, &Lp_norm_residu0); (略)
p += 0.5;}
}
例:Lpノルムでの線形回帰モデル (p.178)p = 1, 1.5, 2, 2.5
1/1
0
ˆpn
Pi i
iy y
-
=
æ ö-ç ÷
è øåLp =
248
www.vnij.comCh. 3 相関と共分散
Correlation and Covariance
1. 分散共分散行列、相関行列の計算
2. 偏共分散(partial covariance)、偏相関(partial correlation)の計算
3. プールされた共分散行列の計算
4. 共分散行列のロバスト推定 (robust estimate)
– HuberおよびStahelの方法
IMSL C Stat
249
www.vnij.comCh. 3 相関と共分散
Correlation and Covariance
IMSL C Stat
include <imsls.h>#include <stdlib.h>main(){
int nobs = 150;int nvar = 4;int n_groups = 3;float percentage = 2.0;int igrp = 0;int ifrq = -1;int iwt = -1;int ind[4] = {1, 2, 3, 4};float *x, cov[16], rbcov[16];x = imsls_f_data_sets(3, 0);imsls_f_pooled_covariances(nobs, nvar, x, n_groups,
IMSLS_RETURN_USER, cov,IMSLS_X_INDICES, igrp, ind, ifrq, iwt, 0);
imsls_f_write_matrix("Pooled Covariance with No Outliers", nvar, nvar,cov, IMSLS_COL_NUMBER_ZERO,IMSLS_ROW_NUMBER_ZERO,IMSLS_PRINT_UPPER, 0);
imsls_f_robust_covariances(nobs, nvar, x, n_groups, IMSLS_RETURN_USER, rbcov,IMSLS_PERCENTAGE, percentage,IMSLS_X_INDICES, igrp, ind, ifrq, iwt, 0);
imsls_f_write_matrix("Robust Covariance with No Outliers", nvar, nvar, rbcov,
IMSLS_COL_NUMBER_ZERO,IMSLS_ROW_NUMBER_ZERO,IMSLS_PRINT_UPPER, 0);
/* Add Outliers */x[1] = 100.0;x[19] = 100.0;x[497] = -100.0;
imsls_f_pooled_covariances(nobs, nvar, x, n_groups, IMSLS_RETURN_USER, cov,IMSLS_X_INDICES, igrp, ind, ifrq, iwt, 0);
imsls_f_write_matrix("Pooled Covariance with Outliers", nvar, nvar, cov,
IMSLS_COL_NUMBER_ZERO,IMSLS_ROW_NUMBER_ZERO,IMSLS_PRINT_UPPER, 0);
imsls_f_robust_covariances(nobs, nvar, x, n_groups, IMSLS_RETURN_USER, rbcov,IMSLS_PERCENTAGE, percentage,IMSLS_X_INDICES, igrp, ind, ifrq, iwt, 0);
imsls_f_write_matrix("Robust Covariance with Outliers", nvar, nvar, rbcov,
IMSLS_COL_NUMBER_ZERO,IMSLS_ROW_NUMBER_ZERO,IMSLS_PRINT_UPPER, 0);
free(x);}
例:共分散行列のロバスト推定(p.210) Fisherのirisデータのうち3個をoutlier外れ値
としたものと比較。
250
www.vnij.comCh. 3 相関と共分散
Correlation and Covariance
IMSL C Stat
Output
Pooled Covariance with No Outliers0 1 2 3
0 0.2650 0.0927 0.1675 0.03841 0.1154 0.0552 0.03272 0.1852 0.04273 0.0419
Robust Covariance with No Outliers0 1 2 3
0 0.2474 0.0872 0.1535 0.03601 0.1073 0.0538 0.03222 0.1705 0.04123 0.0401
例:共分散行列のロバスト推定 (p.210) (続き)
pooled_covariances と robust_covariances の出力の比較
ロバスト推定は外れ値があってもそれ程影響を受けない。
Pooled Covariance with Outliers0 1 2 3
0 60.43 0.30 0.13 -1.561 70.53 0.17 -0.172 0.19 0.073 66.38
Robust Covariance with Outliers0 1 2 3
0 0.2555 0.0876 0.1553 0.03591 0.1127 0.0545 0.03222 0.1723 0.04123 0.0424
251
www.vnij.comCh. 4 分散分析と実験計画法Analysis of Variance and Designed Experiments
1. 一般的な分散分析 ANOVA– 1元配置モデル(one-way analysis)– 釣合い要因(balanced factorial design)の分析
– ランダムなネストされたモデルの分析– 固定効果・変量効果または混合モデルの分析
2. 実験計画法– 無作為またはブロック要因実験– ラテン方格子(Latin-square)実験– 格子(lattice)実験– split-plot(分割区法)またはsplit-split-plot実験– strip-plot(細分区法)またはstrip-split-plot実験
3. ユーティリティ– BartlettおよびLeveneの等分散性(homogeneity of variance)検定– 平均の多重比較検定(multiple comparisons of means)– Yatesの欠損値の推定
IMSL C Stat
252
www.vnij.comCh. 5 カテゴリ・データと離散データの解析
Categorical and Discrete Data Analysis
1. 2元分割表(two-way contingency table)の統計量の計算
– r x c 分割表のχ2検定、McNemar検定などの統計値の
計算
– 全体枚挙法(total enumeration method)による正確な計算
– ネットワークアルゴリズムによるFisherの正確な計算
2. 一般化カテゴリモデル– 一般化線形モデル(generalized linear model)
• ロジスティック、probit、Poisson、log その他のモデル
IMSL C Stat
253
www.vnij.comCh. 5 カテゴリ・データと離散データの解析
Categorical and Discrete Data Analysis
IMSL C Stat
#include <stdio.h>#include <imsls.h>
void main(){
int n_rows = 3;int n_columns = 5;float p;float table[15] = {20, 20, 0, 0, 0,
10, 10, 2, 2, 1,20, 20, 0, 0, 0};
double a, b;
printf("Asymptotic Chi-Squared p-value¥n");p = imsls_f_contingency_table(n_rows, n_columns, table, 0);
(略)printf("¥nNetwork Algorithm with Approximation¥n");a = imsls_ctime();p = imsls_f_exact_network(n_rows, n_columns, table, 0);
printf("¥nNetwork Algoritm without Approximation¥n");a = imsls_ctime();p = imsls_f_exact_network(n_rows, n_columns, table,
IMSLS_NO_APPROXIMATION, 0);
printf("¥nTotal Enumeration Method¥n");a = imsls_ctime();p = imsls_f_exact_enumeration(n_rows, n_columns, table, 0);
}
OutputAsymptotic Chi-Squared p-valuep-value = 0.0323
Network Algorithm with Approximationp-value = 0.0601Execution time = 0.0400
Network Algorithm without Approximationp-value = 0.0598Execution time = 0.4300
Total Enumeration Methodp-value = 0.0597Execution time = 3.1400
例:2元分割表のχ2分析といくつかの正確な手法での計算の比較(p.419)CPU時間(秒)に大きな差が出ている。
254
www.vnij.comCh. 6 ノンパラメトリック統計
Nonparametric Statistics
1. 1標本– 符号検定 (sign test)
• Wilcoxonの符号付き順位検定(signed rank test)– 傾向の検定(trend test)
• Noetherの循環傾向(cyclical trend)の検定• Cox-Stuartの傾向の検定
– 同順位統計(tie statistics)2. 2つ以上の標本
– Wilcoxonの順位和検定(rank sum test)– 同一母集団の中央値に対するKruskal-Wallis検定– 完備型ブロック計画(complete block design)に対するFriedman検定– 関連する観測に対するCochranのQ検定– 順序付けられた標本に対するk標本トレンド検定
IMSL C Stat
255
www.vnij.comCh. 7 適合度の検定
Test of Goodness of Fit
1. 一般的な適合度の検定(goodness-of-fit)– χ2適合度検定
– Shapiro-WilkあるいはLillieforsの正規性(normality) に対するW検定
– Kolmogorov-Smirnovの1および2標本検定
– Mardiaの多標本の正規性検定
2. ランダム度の検定• 連(run)検定、ペア検定、d2あるいは3重項検定
IMSL C Stat
256
www.vnij.comCh. 7 適合度の検定
Test of Goodness of Fit
IMSL C Stat
#include <imsls.h>#include <stdio.h>void main(){
float *statistics=NULL, *diffs = NULL, *x=NULL, *y=NULL;int nobsx = 100, nobsy = 60, nmissx, nmissy;imsls_random_seed_set(123457);x = imsls_f_random_uniform(nobsx, 0);y = imsls_f_random_uniform(nobsy, 0);statistics = imsls_f_kolmogorov_two(nobsx, x, nobsy, y,
IMSLS_N_MISSING_X, &nmissx,IMSLS_N_MISSING_Y, &nmissy,IMSLS_DIFFERENCES, &diffs,0);
printf("D = %8.4f¥n", diffs[0]);printf("D+ = %8.4f¥n", diffs[1]);
printf("D- = %8.4f¥n", diffs[2]);printf("Z = %8.4f¥n", statistics[0]);
printf("Prob greater D one sided = %8.4f¥n", statistics[1]);printf("Prob greater D two sided = %8.4f¥n", statistics[2]);printf("Missing X = %d¥n", nmissx);printf("Missing Y = %d¥n", nmissy);
}
OutputD = 0.1800D+ = 0.1800D- = 0.0100Z = 1.1023Prob greater D one sided = 0.0720Prob greater D two sided = 0.1440Missing X = 0Missing Y = 0
例:Kolmogorov-Smirnovの2標本検定(p.492)一様乱数から100個
および60個の標本を取り、それらの累積分布関数CDFが等
しいかを検定
(Ref. Fortran Stat Ch.7 KSONE)
257
www.vnij.comCh. 8 時系列解析と予測
Time Series Analysis and Forecasting
1. ARIMAモデル(Autoregressive Integrated Moving Average)– モーメント法、 小2乗法、 尤推定法によるARMAパラメータの推定– 単変量のARMAモデルの自動的な選択とフィティング
– データ前処理、外れ値の検出と推定– Auto_ARIMAモデル– 時系列の差分– ARモデルの季節変動パラメータの推定
2. モデルの構築と評価のユーティリティ– Box-Cox変換– 標本自己相関関数(autocorrelation function)– 標本偏自己相関関数(partial autocorrelation function)– 標本相互相関関数(cross-correlation function)– 多チャンネル相互相関関数– 不適合度検定(lack_of_fit)– 欠測値の推定
3. GARCHモデル(Generalized Autoregressive Conditional Heteroskedasticmodel)
4. 周波数モデル– Kalmanフィルター
IMSL C Stat
258
www.vnij.comCh. 8 時系列解析と予測
Time Series Analysis and Forecasting
IMSL C Stat
#include <imsls.h>void main(){
int p = 2;int q = 1;int i;int n_observations = 100;int max_iterations = 0;float w[176][2];float z[100];float *parameters;float relative_error = 0.0;
imsls_f_data_sets(2, IMSLS_X_COL_DIM, 2, IMSLS_RETURN_USER, w, 0);
for (i=0; i<n_observations; i++) z[i] = w[21+i][1];
parameters = imsls_f_arma(n_observations, &z[0], p, q,IMSLS_RELATIVE_ERROR, relative_error,IMSLS_MAX_ITERATIONS, max_iterations,0);
printf("AR estimates are %11.4f and %11.4f.¥n", parameters[1], parameters[2]);
printf("MA estimate is %11.4f.¥n", parameters[3]);}
モーメント法のOutput
AR estimates are 1.2443 and -0.5751.MA estimate is -0.1241.
例:1770年から100年間の太陽黒点数のデータ:ARMA(2,1)のパラメータを推定(p.519)
0 0 1 2 2 1 1t t t t tz z z A A- - -= q + f + f -q +
小2乗法のOutput
*** WARNING Error IMSLS_LEAST_SQUARES_FAILED from imsls_f_arma. Least*** squares estimation of the parameters has failed to converge.
AR estimates are 1.3926 and -0.7329.MA estimate is -0.1375.
259
www.vnij.comCh. 8 時系列解析と予測
Time Series Analysis and Forecasting
IMSL C Stat
#include <stdlib.h>#include <stdio.h>void main(void){float *parameters = NULL, *outlier_forecast = NULL;int *outlier_stat = NULL;int n_obs, n_predict, i, num_outliers;float aic, res_sigma;int model[4];float forecast_table[24];float x[141] = {
12.8,12.2,11.9,10.9,10.6,11.3,11.1,10.4,10.0,9.7,9.7,9.7,(略)n_predict = 6;n_obs = 135;parameters = imsls_f_auto_arima(n_obs, times, x, IMSLS_MODEL, model,
IMSLS_AIC, &aic,IMSLS_MAX_LAG, 5,IMSLS_CRITICAL, 4.0,IMSLS_NUM_OUTLIERS, &num_outliers,IMSLS_OUTLIER_STATISTICS, &outlier_stat,IMSLS_RESIDUAL_SIGMA, &res_sigma,IMSLS_NUM_PREDICT, n_predict,IMSLS_OUTLIER_FORECAST, &outlier_forecast,0);
(略)
OutputMethod 1: Automatic ARIMA model selection, no differencingModel chosen: p=5, q=0, s=1, d=0Number of outliers: 6Outlier statistics:
例:1994年1月から2005年9月までの米国の失業率のデータ:2004年1月から2005年3月のデータを解析、2005年4月から9月までの6ヶ月を推定。 (p.563)
Auto_ARIMA Forecast
6
7
8
9
10
11
12
Months
Unem
plo
yment
Rat
e Actual
Method 1 : noseasonal adjust
Method 2 : withseasonal adjust
Method 3 : Method2 + outlierdetection
260
www.vnij.comCh. 8 時系列解析と予測
Time Series Analysis and Forecasting
IMSL C Stat
例:AutoARIMAの例(PV-WAVEによるGUI)
261
www.vnij.comCh. 8 時系列解析と予測
Time Series Analysis and Forecasting
IMSL C Stat
#include <stdio.h>#include <imsls.h>#define NB 1#define NOBS 4#define NY 1void main(){
int nb = NB, nobs = NOBS, ny = NY;int ldcovb, ldcovv, ldq, ldr, ldt, ldz;int i, iq, it, n, nout;float alndet, b[NB], covb[NB][NB], covv[NY][NY],
q[NB][NB], r[NY][NY], ss,t[NB][NB], tol, v[NY], y[NY], z[NY][NB];
float ydata[] = {4.4, 4.0, 3.5, 4.6};z[0][0] = 1.0;r[0][0] = 1.0;q[0][0] = 4.0;t[0][0] = 1.0;b[0] = 4.0;covb[0][0] = 16.0;/* Initialize arguments for initial call to imsls_f_kalman. */n = 0;ss = 0.0;alndet = 0.0;printf("k/j b covb n ss alndet v covv¥n");for (i = 0; i < nobs; i++) {/* Update */y[0] = ydata[i];imsls_f_kalman(nb, b, (float*)covb, &n, &ss, &alndet,
IMSLS_UPDATE, ny, y, z, r, IMSLS_V_USER, v, IMSLS_COVV_USER, covv, 0);
printf("%d/%d %8.3f %8.3f %d %8.3f %8.3f %8.3f %8.3f¥n", i, i, b[0], covb[0][0], n, ss, alndet, v[0], covv[0][0]);
/* Prediction */imsls_f_kalman(nb, b, (float*)covb, &n, &ss, &alndet,
IMSLS_T, t,IMSLS_Q, q,0);
printf("%d/%d %8.3f %8.3f %d %8.3f %8.3f %8.3f %8.3f¥n", i+1, i, b[0], covb[0][0], n, ss, alndet, v[0], covv[0][0]);
}}
Outputk/j b covb n ss alndet v covv0/0 4.376 0.941 1 0.009 2.833 0.400 17.0001/0 4.376 4.941 1 0.009 2.833 0.400 17.0001/1 4.063 0.832 2 0.033 4.615 -0.376 5.9412/1 4.063 4.832 2 0.033 4.615 -0.376 5.9412/2 3.597 0.829 3 0.088 6.378 -0.563 5.8323/2 3.597 4.829 3 0.088 6.378 -0.563 5.8323/3 4.428 0.828 4 0.260 8.141 1.003 5.8294/3 4.428 4.828 4 0.260 8.141 1.003 5.829
例:Kalmanフィルター(p.633)
フィルターされた推定と1段階先の予測の誤差を計算
262
www.vnij.comCh. 8 時系列解析と予測
Time Series Analysis and Forecasting
IMSL C Stat
例:Kalmanフィルターと移動平均モデル (PV-WAVEによる表示例)
263
www.vnij.comCh. 9 多変量解析
Multivariate Analysis
1. 階層的(hierarchical)クラスタ分析
– 類似度行列(similarity matrix)の計算
– 階層的クラスタ分析
2. K-means法
3. 主成分分析(principal component analysis)
4. 因子分析(factor analysis)
5. 判別分析(discriminant analysis)
IMSL C Stat
264
www.vnij.comCh. 9 多変量解析
Multivariate Analysis
IMSL C Stat
因子分析のステップStep 1
Calculate Covariance (Correlation) MatrixIMSL routine imsls_f_covariances
(see Chapter 3, “Correlation and Covariance”)
Step 2
Initial Factor Extractionimsls_f_factor_analysis
Step 3
Prior Info.IMSLS_OBLIQUE_PROCRUSTES_ROTATION
Prior Info.IMSLS_ORTHOGONAL_PROCRUSTES_ROTATION
No Prior Info.IMSLS_OBLIQUE_PROMAX_ROTATIONIMSLS_DIRECT_OBLIMIN_ROTATIONIMSLS_OBLIQUE_PIVOTAL_PROMAX_ROTATION
No Prior Info.IMSLS_ORTHOMAX_ROTATION,
ObliqueOrthogonal
Factor Rotationusing imsls_f_factor_analysis’ optional arguments
Step 4
Factor Structure and Varianceimsls_f_factor_analysis
optional argumentIMSLS_FACTOR_STRUCTURE
265
www.vnij.comCh. 9 多変量解析
Multivariate Analysis
IMSL C Stat
例:クラスター分析の例(IMSL C#に
よる表示)
266
www.vnij.comCh. 10 生存と信頼性解析
Survival and Reliability Analysis
1. 生存解析(survival analysis)– Kaplan-Meierの生存確率の推定
– Coxの比例ハザードモデル(proportional hazards model) による生存と信頼性データの解析
– 一般化線形モデル(generalized linear model)による生
存データ解析
– 様々なパラメトリックモデルによる推定
2. ノンパラメトリック法によるハザード関数の推定
3. 保険数理テーブル(actuarial table)– 人口とコーホート生命表(cohort life table)の作成
IMSL C Stat
267
www.vnij.comCh. 11 確率分布関数とその逆関数Probability Distribution Functions and Inverses
1. 離散変数– 二項分布– 超幾何分布– Poisson分布
2. 連続変数– 標準正規(Gauss)分布
– ベータ分布– 2変量正規分布– χ2 分布– 非中心χ2 分布– F 分布– Γ 分布– Studentのt 分布– 非中心Studentのt 分布
IMSL C Stat
268
www.vnij.comCh. 12 乱数生成
Random Number Generation
1. 単変量離散分布– 二項分布
– 幾何分布
– 超幾何分布
– 対数分布
– 負の二項分布
– Poisson分布
– 離散一様分布
– 一般離散分布
2. 単変量連続分布– ベータ分布– χ2 分布– Cauchy分布
– 指数分布– 2つの指数分布– Γ 分布
– 一様分布– 対数正規分布– 標準正規分布– 安定分布– Studentのt 分布
– 三角分布– Von Mises分布– Weibull分布
– 一般連続分布
IMSL C Stat
269
www.vnij.comCh. 12 乱数生成
Random Number Generation
3. 多変量連続分布– 多変量正規分布– 直交行列と相関行列– 標本にもとづいた多変量分布– 多項分布– 円あるいはK次元球上の分布– 2元配置表の作成
4. 順序統計(order statistics)– 標準正規分布– 一様分布
5. 確率過程– ARMA過程– 非斉次(nonhomogeneous)Poisson過程
6. 標本と順列– ランダム順列(permutation)– ランダム標本(sampling)– 有限母集団から標本
7. 低不適合度の列(LDS : Low Discrepancy Sequence)
– シャッフルされた一般化Faure列
8. ユーティリティ– 一様乱数発生器のタイプの選択など– シードの初期化など– シャッフルされた乱数発生器の初期化
など– GFSR乱数発生器の初期化など– Mersenne Twisterによる乱数発生器
の初期化など
IMSL C Stat
270
www.vnij.comCh. 12 乱数生成
Random Number Generation
1. 乗算合同法 (multiplicative congruential generator)xi = cxi-1 mod(231-1) (周期 231-2≒2.15x109)
c = 75 = 16807 (minimal standard generator)c = 2x72x4053103 = 397204094c = 23x118838297 = 950706376
2. シャッフルされた乗算合同法
3. 伏見正則(1990)のGFSR (Generalized Feedback Shift Register)
xi = xi-1563 .XOR. xi-96 (周期 2521≒6.86x10156)– 初期化に時間がかかるが、乗算合同法と同程度の速さ
4. Mersenne Twister (松本眞、西村拓士)– 長周期 219937-1 ≒ 4.315x106001
– 623次元超立方体の中に 均等に分布
IMSL C Stat
271
www.vnij.comCh. 12 乱数生成
Random Number Generation
IMSL C Stat
#include <stdio.h>#include <imsls.h>float cdf(float);void main(){
int i, iopt=0, ndata= 100;float table[100][5], x = 0.0, *r;for (i=0;i<ndata;i++) {
table[i][0] = x;x += .01;
}imsls_f_continuous_table_setup(cdf, iopt, ndata, (float*)table);imsls_random_seed_set(123457);r = imsls_f_random_general_continuous (5, ndata, table, 0);imsls_f_write_matrix("Beta (3, 2) random deviates", 5, 1, r, 0);
}float cdf(float x){
return imsls_f_beta_cdf(x, 3., 2.);}
例: 一般連続分布での擬似乱数生成 (p.861)
Output*** WARNING Error from imsls_f_continuous_table_setup. The values of the*** CDF in the second column of table did not begin at 0.0 and end*** at 1.0, but they have been adjusted. Prior to adjustment,*** table[0][1] = 0.000000e+00 and table[ndata-1][1]= 9.994079e-01.
Beta (3, 2) random deviates1 0.92082 0.46413 0.76684 0.65365 0.8171
272
www.vnij.comCh. 12 乱数生成
Random Number Generation
IMSL C Stat
#include <imsls.h>void main(){
const unsigned long long init[] = {0x123, 0x234, 0x345, 0x456};float *r;int iseed = 123457; unsigned long long *itable;int nr = 5;/* Initialize 64-bit Mersenne Twister series with a seed */imsls_random_option (9);imsls_random_seed_set (iseed);r = imsls_f_random_uniform (nr, 0);imsls_f_write_matrix ("First stream output", 1, 5, r,
IMSLS_NO_COL_LABELS,IMSLS_NO_ROW_LABELS,0);
free(r);/* Reinitialize Mersenne Twister series with an array */imsls_random_option (9);imsls_random_MT64_init(4, init);/* Save the state of the series */imsls_random_MT64_table_get(&itable, 0);r = imsls_f_random_uniform (nr, 0);imsls_f_write_matrix ("Second stream output", 1, 5, r,
IMSLS_NO_COL_LABELS,IMSLS_NO_ROW_LABELS,0);
free(r);
例: 64bit Mersenne Twisterによる乱数の生成。4ストリーム (p.909)/* Restore the state of the series */imsls_random_MT64_table_set(itable);r = imsls_f_random_uniform (nr, 0);imsls_f_write_matrix ("Third stream output", 1, 5, r,
IMSLS_NO_COL_LABELS,IMSLS_NO_ROW_LABELS,0);
free(r);/* Reset the series - it will reinitialize from the seed */itable[0] = 1000;imsls_random_MT64_table_set(itable);r = imsls_f_random_uniform (nr, 0);imsls_f_write_matrix ("Fourth stream output", 1, 5, r,
IMSLS_NO_COL_LABELS,IMSLS_NO_ROW_LABELS,0);
free(r);}
OutputFirst stream output
0.5799 0.9401 0.7102 0.1640 0.5457Second stream output
0.4894 0.7397 0.5725 0.0863 0.7588Third stream output
0.4894 0.7397 0.5725 0.0863 0.7588Fourth stream output
0.5799 0.9401 0.7102 0.1640 0.5457
273
www.vnij.comCh. 12 乱数生成
Random Number Generation
IMSL C Stat
#include "stdio.h"#include "imsl.h"void main(){
Imsl_faure *state;float *x;int ndim = 3;int k;
state = imsl_faure_sequence_init(ndim, 0);for (k = 0; k < 5; k++) {
x = imsl_f_faure_next_point(state, 0);printf("%10.3f %10.3f %10.3f¥n", x[0], x[1], x[2]);
free(x);}imsl_faure_sequence_free(state);
}Output
0.334 0.493 0.0640.667 0.826 0.3970.778 0.270 0.1750.111 0.604 0.5090.445 0.937 0.842
例: 3次元の一般化Faure列を5点求める (p.914)
274
www.vnij.comCh. 12 乱数生成 (Fortran Stat Ch.18)他社の乱数との比較:(Intelのホームページより)
IMSLの乱数は Intel MKLやNAGと比べて精度が高く、計算速度はNAGの2倍
速い結果が出ている。
Performance Comparison: Black-Scholes Option-Pricing Modelhttp://www.intel.com/cd/software/products/asmo-na/eng/220054.htm
IMSL Fortran Stat
Relative Error Ratio
Call Put Call Put Call Put16.7291 7.2184 0.0050 -0.0005
0.030 -0.007 4.55 -5.0016.7366 7.2164 -0.0025 0.0015
-0.015 0.021 -2.27 15.0016.7330 7.2178 0.0011 0.0001
0.007 0.001 1 116.7394 7.2162 -0.0053 0.0017
-0.032 0.024 -4.82 17.00
Exact Value 16.7341 7.2179 (Intel Xeon)
Option Value(Exact Value)
Absolute Error(Relative Error %)
Time(seconds)
Speedup(timesfaster)
7.246 4.09
MCG59 7.625 3.88
Library BasicGenerator
IMSL* MinimalStandard
Intel® MKL MCG31m1
29.63 1
NAG* Original 61.306 0.48
275
www.vnij.comCh.13 ニューラルネットワーク
Neural Networks
• ネットワーク
– 多層フィードフォワードネットワークの作成と学習
– 予測計算
• 前処理フィルタ
– スケール処理
– 時系列データのフォーマットの変換
IMSL C Stat
276
www.vnij.comCh.13 ニューラルネットワーク
Neural Networks
IMSL C Stat
例: 4入力(3属性、1連続データ)2層ネット、中間層に3パーセプトロン、90データで学習、10データを予測(p.956)
#include "imsls.h"#include <stdio.h>voidmain (){
static int categorical[300] = {1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, (途中略)0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1
};static float continuous[100] = {4.007054658, 7.10028447, 4.740350984, 5.714553211, 6.205437459,(略)3.811953836, 5.78471629, 3.414486452, 9.345413015, 1.024053777
};static float output[100] = {18.01410932, 24.20056894, 19.48070197, 21.42910642, 22.41087492,(略)37.62390767, 41.56943258, 36.8289729, 48.69082603, 32.04810755
};/* 2D Array Definitions */
#define CATEGORICAL(i,j) categorical[i*n_cat+j]#define CATEGORICALOBS(i,j) categoricalObs[i*n_cat+j]Imsls_f_NN_Network *ffnet;float *stats;int n_obs = 100, n_cat = 3, n_cont = 1;int i, j;float *forecasts;/* for forecasting */int categoricalObs[3] = { 0, 0, 0 };float continuousObs[1] = { 0 };float x, y;float forecast[5];float *cont; (続く)
277
www.vnij.comCh.13 ニューラルネットワーク
Neural Networks
IMSL C Stat
for (i = 90; i < 100; i++){continuousObs[0] = continuous[i];for (j = 0; j < n_cat; j++)
{CATEGORICALOBS (0, j) = CATEGORICAL (i, j);
}forecasts = imsls_f_mlff_network_forecast (ffnet, n_cat, n_con
categoricalObs,continuousObs, 0);
x = output[i];y = forecasts[0];printf
("observation[%d] %8.4f Prediction %8.4f Residual %8.4f ¥n",
i, x, y, x - y);}
imsls_f_mlff_network_free (ffnet);#undef CATEGORICAL#undef CATEGORICALOBS
Output
Predictions for Observations 90 to 100: observation[90] 49.2975 Prediction 43.8761 Residual 5.4213 (略)observation[98] 48.6908 Prediction 43.2108 Residual 5.4800 observation[99] 32.0481 Prediction 23.1740 Residual 8.8742
/* Scale continuous attribute to the interval [0, 1] */cont = imsls_f_scale_filter (n_obs, continuous, 1,
IMSLS_SCALE_LIMITS, 0.0, 10.0, 0.0, 1.0, 0);ffnet = imsls_f_mlff_network_init (4, 1);imsls_f_mlff_network (ffnet,
IMSLS_CREATE_HIDDEN_LAYER, 3, IMSLS_LINK_ALL, 0);
for (i = 0; i < ffnet->n_links; i++){/* hidden layer 1 */if (ffnet->nodes[ffnet->links[i].to_node].layer_id == 1)
{ffnet->links[i].weight = .25;
}/* output layer */if (ffnet->nodes[ffnet->links[i].to_node].layer_id == 2)
{ffnet->links[i].weight = .33;
}}
stats = imsls_f_mlff_network_trainer (ffnet, n_obs - 10, n_cat, n_cont, categorical, continuous, output,
0);printf ("Predictions for Observations 90 to 100: ¥n");
(続く)
278
www.vnij.comCh.13 ニューラルネットワーク
Neural Networks
IMSL C Stat
例:ニューラルネットとARMAによる予測と
実際の値との比較。
JMSLによる表示例
279
www.vnij.com Ch.14 印刷 Printing FunctionsCh.15 ユーティリティ Utilities
• 印刷
– 行列の印刷など
• 出力ファイルの設定
• エラー処理
• 定数
• 行列演算、その他
IMSL C Stat
IMSL ライブラリの今後のリリース予定
281
www.vnij.com
IMSL Fortran v6.0
• AMD Opteron, SuSE Linux ES 9, Portland pgf90 7.0-5 対応
• Linear Programming– F.Krogh’s code (already in CNL, JMSL, C#NL)
• SuperLU– Sparse Linear Algebra package
• Mersenne Twister 乱数生成アルゴリズム
• LAPACK, ScaLAPACK Integration• ScaLAPACK utilities
282
www.vnij.com
LAPACK Integration
?POTRF, ?POCON, ?=S/DLFCDS
?POTRF, ?POTRS, ?=S/DLSLDS
?PORFS, ?POTRS, ?=S/DLSADS
?TRCON, ?=C/ZLFCCT
?TRTRS, ?=C/ZLSLCT
?TRCON, ?=S/DLFCRT
?TRTRS, ?=S/DLSLRT
?GETRF, ?GETRI, ?=C/ZLINCG
?GERFS,?GETRS, ?=C/ZLFICG
?GETRS, ?=C/ZLFSCG
?GETRF, ?=C/ZLFTCG
?GETRF, ?GECON, ?=C/ZLFCCG
?GETRF, ?GETRS, ?=C/ZLSLCG
?GETRF, GETRS, ?GECON, ?=C/ZLSACG
?GETRF, ?GETRI ?=S/DLINRG
?GETRS, ?=S/DLFIRG
?GETRS, ?=S/DLFSRG
?GETRF, ?=S/DLFTRG
?GETRF,?GECON, ?=S/DLFCRG
?GETRF, ?GETRS, ?=S/DLSLRG
?GERFS,?GETRF,?GECON, ?=S/DLSARG
LAPACKIMSL (? = S/D real or C/Z complex; single/double)
?HETRS, ?=C/ZLFSHF
?HETRF, ?=C/ZLFTHF
?HETRF, ?HECON, ?=C/ZLFCHF
?HECON, ?HETRF, ?HETRS, ?=C/ZLSLHF?HECON, ?HERFS, ?HETRF, ?HETRS, ?=C/ZLSAHF?PORFS, ?POTRS, ?=C/ZLFIDH
?TRTRS, ?=C/ZLFSDH
?POTRF, ?=C/ZLFTDH
?POTRF, ?POCON, ?=C/ZLFCDH
?TRTRS, ?POTRF, ?=C/ZLSLDH?POCON, ?POTRF, ?POTRS, ?=C/ZLSADH ?SYRFS, ?=S/DLFISF
?SYTRF, ?=S/DLFSSF
?SYTRF, ?=S/DLFTSF?SYTRF, ?SYCON, ?=S/DLFCSF?SYTRF, ?SYTRS, ?=S/DLSLSF?SYRFS, ?SYTRF, ?SYTRS, ?=S/DLSASF?POTRF, ?=S/DLINDS?PORFS, ?POTRS, ?=S/DLFIDS?POTRS, ?=S/DLFSDS
?POTRF, ?=S/DLFTDS
?GEEV, ?=C/ZEVCCG
?HSEQR, ?GEBAL, ?GEHRD, ?=C/ZEVLCG
?GEEVX, ?=S/DEVCRG
?GEBAL, ?GEHRD, ?HSEQR ?=S/DEVLRG
?ORGQR, ?=S/DLQERR
?TRTRS, ?ORMQR, ?=S/DLQRSL
?GESVD, ?=S/DLSGRR
?GESVD, ?=C/ZLSVCR
?GESVD, ?-S/DLSVRR
?GEQRF, ?=S/DLQRRR
?GEQRF, ?=S/DLSBRR
?GEQP3, ?GEQRF, ?ORMQR, ?=S/DLQRRV
?GEQP3, ?GEQRF, ?ORMQR, ?TRTRS. ?=S/DLSQRR
?GBTRS, ?GBRFS, ?=S/DLFIRB
?GBTRS, ?=S/DLFSRB
?GBTRF, ?=S/DLFTRB
?GBTRF, ?GBCON, ?=S/DLFCRB
?GBTRF, ?GBTRS, ?=S/DLSLRB
?GBTRF, ?GBTRS, ?GBRFS ?=S/DLSARB
?HERFS, ?HETRS, ?=C/ZLFIHF
?SYGV, ?=S/DGVCSP
?SYGV, ?=S/DGVLSP
?GEQRF, ?UMMQR, ?GGHRD, ?HGEQZ,?TGEVC, ?=C/ZGVCCG
?GEQRF, ?UMMQR, ?GGHRD, ?HGEQZ, ?=C/ZGVLCG
?GEQRF, ?ORMQR, ?GGHRD, ?HGEQZ, ?TGEVC, ?=S/DGVCRG
?GEQRF, ?ORMQR, ?GGHRD, ?HGEQZ, ?=S/DGVLRG
?HEEV, ?=C/ZEVCHF
?HEEV, ?=C/ZEVLHF
?SYEV, ?=S/DEVCSF
?SYEV, ?=S/DEVLSF
283
www.vnij.com MPI routines with ScaLAPACK interface
(? = S/D real or C/Z complex single/double)
P?TRCON, ?=C/ZLFCCT
P?TRTRS, ?=C/ZLSLCT
P?TRCON, ?=S/DLFCRT
P?TRTRS, ?=S/DLSLRT
P?GETRF, P?GETRI, ?=C/ZLINCG
P?GERFS,P?GETRS, ?=C/ZLFICG
P?GETRS, ?C/ZLFSCG
P?GETRF, ?C/ZLFTCG
P?GETRF, P?GECON, ?=C/ZLFCCG
P?GETRF, P?GETRS, ?=C/ZLSLCG
P?GETRF, P?GETRS, P?GERFS, ?=C/ZLSACG
P?GETRF, P?GETRI ?=S/DLINRG
P?GETRS, P?GERFS, ?=S/DLFIRG
P?GETRS, ?=S/DLFSRG
P?GETRF, ?=S/DLFTRG
P?GETRF,P?GECON, ?=S/DLFCRG
P?GETRF, P?GETRS, ?=S/DLSLRG
P?GERFS,P?GETRF,P?GETRS, ?=S/DLSARGScaLAPACKIMSL
P?ORGQR, ?=S/DLQERR
P?TRTRS, P?ORMQR, ?=S/DLQRSL
P?GESVD, ?=S/DLSGRR
P?GESVD, ?-S/DLSVRR
P?GEQRF, P?GEQPF, P?ORMQR, ?=S/DLQRRR
P?TRTRS, P?GEQRF, P?ORMQR, ?=S/DLQRRV
P?GEQPF, P?GEQRF, P?ORMQR, P?TRTRS, ?=S/DLSQRR
P?GBTRF, P?GBTRS, ?=S/DLSLRB
P?PORFS, P?POTRS, ?=C/ZLFIDH
P?POTRS, ?=C/ZLFSDH
P?POTRF, ?=C/ZLFTDH
P?POTRF, P?POCON, ?=C/ZLFCDH
P?POTRS, P?POTRF, ?=C/ZLSLDH
P?POTRF, P?PORFS, P?POTRS, ?=C/ZLSADH
P?GETRF, P?GETRI, ?=S/DLINDS
P?PORFS, P?POTRS, ?=S/DLFIDS
P?POTRS, ?-S/DLFSDS
P?POTRF, ?-S/DLFTDS
P?POTRF, P?POCON, ?=S/DLFCDS
P?POTRF, P?POTRS, ?=S/DLSLDS
P?PORFS, P?POTRF, P?POTRS, ?=S/DLSADS
284
www.vnij.com
ScaLAPACKユーティリティ(1/2)
ScaLAPACK使用のための補助ルーチン– プロセッサグリッドの設定– ローカル配列の大きさの計算– 行列の2D block-cyclicフォームへのファイル読み書き– グローバル配列から2D block-cyclic フォームのローカル配列にマップ
およびアンマップ
– ScaLAPACK_SETUP プロセッサグリッドをセットアップ– ScaLAPACK_GETDIM 行列の分散を計算– ScaLAPACK_READ block-cyclic形式にデータをファイルから読み込み– ScaLAPACK_WRITE block-cyclic形式からデータをファイルに出力– ScaLAPACK_MAP block-cyclic形式にデータを各スレッドにマップ– ScaLAPACK_UNMAP block-cyclic形式からデータをルートノードにマップ– ScaLAPACK_EXIT ScaLAPACKの使用終了
285
www.vnij.com
ScaLAPACKユーティリティ(2/2)
ScaLAPACKサポートモジュール– ScaLAPACK, PBLAS, BLACSを使う場合はこのモジュールを使うことを推薦。– 引数の不足や型(type, kind, rank)の不一致などをコンパイル時にチェックする
モジュール名 対応するルーチン、ライブラリ
– ScaLAPACK_Support 下記のルーチン全て
• ScaLAPACK_Int ScaLAPACK• PBLAS_Int parallel BLAS,PBLAS• BLACS_Int BLACS• TOOLS_Int ScaLAPACK補助ルーチン
• LAPACK_Int LAPACK• ScaLAPACK_IO_Int ScaLAPACK_READ, ScaLAPACK_WRITE• MPI_Node_Int MPIコミュニケータモジュール(MP_SETUP)
• GRIDINFO_Int ScaLAPACK_SETUP• ScaLAPACK_MAP_Int ScaLAPACK_MAP• ScaLAPACK_UNMAP_Int ScaLAPACK_UNMAP
IMSL Fortran
286
www.vnij.com
• 疎行列の計算 (SuperLUを組み込み)– 簡単で使いやすい
– Fortran 2003 の派生型を用いる
– サポートする演算• 疎行列の設定
• 疎行列の和
• 疎行列と密行列(密ベクトル)の積
• 線型方程式の解
• 条件数の計算
• 疎行列と密行列の変換
• ストーレジの管理
Ch. 10 線形演算子とジェネリック関数Linear Algebra Operators and Generic Functions
IMSL Fortran Math
287
www.vnij.comCh. 10 線形演算子とジェネリック関数Linear Algebra Operators and Generic Functions
! Sparse = Collection of TripletsUse linear_operatorsInteger i, j; real(kind(1.e0)) value, x(10000)Type (s_sparse) AType (s_hbc_sparse) H ! Define non-zero values of AA = s_entry ( I, J, value)! Convert to computational Harwell-Boeing formH = A! Compute with sparse matrix H, e.g.
X = H .ix. x
type s_entry
integer irow
integer jcol
real (kind(1.e0)) value
end type
! Sparse = Dense : H = D
! Dense = Sparse : D = H
! Scalar = value at intersection: value = s_hbc_entry(H, I, J)
s/d, c/z の型をサポート
IMSL Fortran Math
288
www.vnij.comCh. 10 線形演算子とジェネリック関数Linear Algebra Operators and Generic Functions
Y(1:r,1:m)Hmxn sparse, x(1:r,1:k),k≥nY = X .xt. HY = xrxnHT
y(1:m)Hmxn sparse, x(1:k),k≥ny = x .xt. Hy = xHT
Y(1:m,1:r)Hmxn sparse, x(1:k,1:r),k≥nY = H .xt. xY = HxTnxr
y(1:m)Hmxn sparse, x(1:k),k≥nY = H .xt. xy = HxT
Y(1:r,1:n)Hmxn sparse, x(1:k,1:r),k≥mY = X .tx. HY = xTrxmH
y(1:n)Hmxn sparse, x(1:k),k≥mY = x .tx. Hy = xTH
Y(1:n,1:r)Hmxn sparse, x(1:k,1:r),k≥mY = H .tx. XY = HTXnxr
y(1:n)Hmxn sparse, x(1:k),k≥my = H .tx. xy = HTx
Knxm sparseHmxn sparse, complexK = .h. HK = HH = H*T
Knxm sparseHmxn sparseK = .t. HK = HT
Y(1:r,1:n)Hmxn sparse, x(1:r,1:k),k≥mY = X .x. HY = xrxmH
Y(1:m,1:r)Hmxn sparse, x(1:k,1:r),k≥nY = H .x. xY = Hxnxr
y(1:n)Hmxn sparse, x(1:k),k≥my = x .x. Hy = xTH≡ HTx
y(1:m)Hmxn sparse, x(1:k),k≥ny = H .x. xy = Hx
Y(1:r,1:n)Hnxn sparse, x(1:r,1:n),k≥nY = X .xi. HY = xrxnH−1≡ (H−TXT)T
Y(1:n,1:r)Hnxn sparse, x(1:k,1:r),k≥nY = H .ix. xY = H−1xnxr
y(1:n)Hnxn sparse, x(1:k),k≥ny = x .xi. Hy = xTH−1≡ H−Tx
y(1:n)Hnxn sparse, x(1:k),k≥ny = H .ix. xy = H−1x
Output TermsInput TermsOperation NotationSparse Matrix Operation
IMSL Fortran Math
289
www.vnij.comCh. 10 線形演算子とジェネリック関数Linear Algebra Operators and Generic Functions
Y(1:r,1:m)Hmxn sparse, x(1:r,1:k),k≥nY = X .xh. HY = xrxnHH = XrxnH
*T
y(1:m)Hmxn sparse, x(1:k),k≥ny = x .xh. Hy = xHH = xH*T
Y(1:m,1:r)Hmxn sparse, x(1:k,1:r),k≥nY = H .xh. XY = HxTnxr = HX*T
nxr
y(1:m)Hmxn sparse, x(1:k),k≥ny = H .xh. Xy = HxH = Hx*T
Y(1:r,1:n)Hmxn sparse, x(1:k,1:r),k≥mY = X .hx. HY = XHrxmH = X*T
rxmH
y(1:n)Hmxn sparse, x(1:k),k≥mY = x .hx. Hy = xHH = x*TH
Y(1:n,1:r)Hmxn sparse, x(1:k,1:r),k≥mY = H .hx. XY = HHXmxr = H*TXmxr
Output TermsInput TermsOperation NotationSparse Matrix Operation
IMSL Fortran Math
290
www.vnij.comCh. 10 線形演算子とジェネリック関数Linear Algebra Operators and Generic Functions
use linear_operatorsimplicit none
! This is Example 1 for LIN_SOL_GEN, with operators and functions.
integer, parameter :: n=32 real(kind(1e0)) :: one=1.0e0, err real(kind(1e0)), dimension(n,n) :: A, b, x
! Generate random matrices for A and b: A = rand(A); b=rand(b)
! Compute the solution matrix of Ax = b. x = A .ix. b
! Check the results. err = norm(b - (A .x. x))/(norm(A)*norm(x)+norm(b)) if (err <= sqrt(epsilon(one))) &
write (*,*) 'Example 1 for LIN_SOL_GEN (operators) is correct.' end
例:連立一次方程式 Ax = b を解く (p.1562):
x = A-1b ; 残差 r = b - Ax
IMSL Fortran Math
[密行列の場合]
291
www.vnij.comCh. 10 線形演算子とジェネリック関数Linear Algebra Operators and Generic Functions
use wrrrn_intuse linear_operatorstype (s_sparse) Stype (s_hbc_sparse) Hinteger, parameter :: N=3real (kind(1.e0)) x(N,N), y(N,N), B(N,N)real (kind(1.e0)) errS = s_entry (1, 1, 2.0)S = s_entry (1, 3, 1.0)S = s_entry (2, 2, 4.0)S = s_entry (3, 3, 6.0)H = S ! sparseX = H ! dense equivalent of HB= rand(B)Y = H .ix. Bcall wrrrn ( 'H', X)call wrrrn ( 'B', b)call wrrrn ( 'H .ix. B ', y)! Check the results.
err = norm(y - (X .ix. B))if (err <= sqrt(epsilon(one))) then
write (*,*) 'Sparse example for .ix. operator is correct.'end if
end
[疎行列の場合] (p.1562)
IMSL Fortran Math
OutputH
1 2 31 2.000 0.000 1.0002 0.000 4.000 0.0003 0.000 0.000 6.000
B1 2 3
1 0.8292 0.5697 0.16872 0.9670 0.7296 0.06033 0.1458 0.2726 0.8809
H .ix. B1 2 3
1 0.4025 0.2621 0.01092 0.2417 0.1824 0.01513 0.0243 0.0454 0.1468
292
www.vnij.comCh. 10 線形演算子とジェネリック関数Linear Algebra Operators and Generic Functions
use linear_operatorsuse mpi_setup_intimplicit none
! This is the equivalent of Parallel Example 1 for .ix., with box data types! and functions.
integer, parameter :: n=32, nr=4real(kind(1e0)) :: one=1e0real(kind(1e0)), dimension(n,n,nr) :: A, b, x, err(nr)
! Setup for MPI.MP_NPROCS=MP_SETUP()
! Generate random matrices for A and b:A = rand(A); b=rand(b)
! Compute the box solution matrix of Ax = b.x = A .ix. b
! Check the results.err = norm(b - (A .x. x))/(norm(A)*norm(x)+norm(b))If (ALL(err <= sqrt(epsilon(one))) .and. MP_RANK == 0) &
write (*,*) 'Parallel Example 1 is correct.'
! See to any error messages and quit MPI.MP_NPROCS=MP_SETUP('Final')
end
[MPI並列の場合] (p.1570)
IMSL Fortran Math
293
www.vnij.comCh. 10 線形演算子とジェネリック関数Linear Algebra Operators and Generic Functions
USE MPI_SETUP_INTUSE LSARG_INTUSE WRRRN_INTUSE SCALAPACK_SUPPORTIMPLICIT NONEINCLUDE ‘mpif.h’
! INTEGER N, DESCA(9), DESCX(9)INTEGER INFO, MXLDA, MXCOLREAL, ALLOCATABLE :: A(:,:), B(:), X(:)REAL, ALLOCATABLE :: A0(:,:), B0(:), X0(:)PARAMETER (N=3)
! Set up for MPIMP_NPROCS = MP_SETUP()IF (MP_RANK .EQ. 0) THEN
ALLOCATE (A(N,N), B(N), X(N))! Set values for A and B
A(1,:) = (/ 33.0, 16.0, 72.0/)A(2,:) = (/-24.0, -10.0, -57.0/)A(3,:) = (/ 18.0, -11.0, 7.0/)B = (/129.0, -96.0, 8.5/)
ENDIF
[ScaLAPACKの場合] (p.85)
IMSL Fortran Math
! Set up a 1D processor grid and define its contextCALL SCALAPACK_SETUP(N, N, .TRUE., .TRUE.)
! Get the array descriptor entities MXLDA and MXCOLCALL SCALAPACK_GETDIM(N, N, MP_MB, MP_NB, MXLDA, MXCOL)
! Set up the array descriptorsCALL DESCINIT(DESCA, N, N, MP_MB, MP_NB, 0, 0, MP_ICTXT,
MXLDA, INFO)CALL DESCINIT(DESCX, N, 1, MP_MB, 1, 0, 0, MP_ICTXT,
MXLDA, INFO)! Allocate space for the local arrays
ALLOCATE (A0(MXLDA,MXCOL), B0(MXLDA), X0(MXLDA))! Map input arrays to the processor grid
CALL SCALAPACK_MAP(A, DESCA, A0)CALL SCALAPACK_MAP(B, DESCX, B0)
! Solve the system of equationsCALL LSARG (A0, B0, X0)
! Unmap the results from the distributed arrays back to! A non-distributed array.
CALL SCALAPACK_UNMAP(X0, DESCX, X)! Print results. Only Rank=0 has the solution, X.
IF (MP_RANK .EQ. 0) CALL WRRRN (’X’, X, 1, N, 1)IF (MP_RANK .EQ. 0) DEALLOCATE(A, B, X)DEALLOCATE(A0, B0, X0)
! Exit ScaLAPACK usageCALL SCALAPACK_EXIT(MP_ICTXT)MP_NPROCS = MP_SETUP(‘FINAL’)END
294
www.vnij.comCh. 10 線形演算子とジェネリック関数Linear Algebra Operators and Generic Functions
implicit noneinteger :: n,istat,info,i,j, sqrtnpreal(kind=8),dimension(:,:),allocatable :: areal(kind=8),dimension(:,:),allocatable :: creal(kind=8),dimension(:),allocatable :: solutioninteger,dimension(:),allocatable :: ipivreal(kind=8) :: valparameter (n = 13)
!! (omitted)! ----- Initialize the blacs.
call BLACS_PINFO ( iam, nprocs )!! ----- Set the dimension of the 2d processors grid.
sqrtnp = int( sqrt( dble(nproc) ) + 1 )do i=1,sqrtnp
if(mod(nproc,i).eq.0) nprow = iend donpcol = nproc/nprow
!
[Native ScaLAPACKの場合 1/2]
IMSL Fortran Math
! ----- Initialize a single blacs context. call BLACS_GET ( -1, 0, context )call BLACS_GRIDINIT ( context, 'r', nprow, npcol )call BLACS_GRIDINFO ( context, nprow, npcol, myrow, mycol )
! ----- Calculate the blocking factor for the matrix. nb = min ( n/nprow, n/npcol )if(nbuser.gt.0) then
nb = min ( nb, 64 )endifnb = max(nb,1)
! ----- Distributed matrices: get num. local rows/cols.! Create description.
l_nrowsa = NUMROC(n,nb,myrow,0,nprow)l_ncolsa = NUMROC(n,nb,mycol,0,npcol)call DESCINIT ( desca, n, n, nb, nb, 0, 0, context, l_nrowsa, info )l_nrowsc = NUMROC(n,nb,myrow,0,nprow)l_ncolsc = NUMROC(1,nb,mycol,0,npcol)call DESCINIT ( descc, n, 1, nb, nb, 0, 0, context, l_nrowsc, info )
! ----- Allocate LHS, RHS, pivot, and solution -----! (omitted)
295
www.vnij.comCh. 10 線形演算子とジェネリック関数Linear Algebra Operators and Generic Functions
! ----- Initialize LHS and RHSdo i= 1, n
val = i*100.0/ncall PDELSET (c,i,1,descc,val)
enddo
do j = 1, ndo i = 1, n
if (i.eq.j) thenval = 20.
elseval = 0.
endifcall PDELSET (a,i,j,desca,val)
enddoenddo
! ----- Do the work -----call PDGETRF ( n, n, a, 1, 1, desca, ipiv, info )call PDGETRS ( 'n', n, 1, a, 1, 1, desca, ipiv, c, 1, 1,
descc, info )
! ----- Reassemble solution on all processors. Print on 0do i= 1, n
call PDELGET ('A',' ',solution(i),c,i,1,descc)enddo
if (iam.eq.0) then write (6,*) "SOLUTION: "
endif! ----- Cleanup arrays -----
deallocate (a,c,ipiv,solution)! ----- Exit BLACS cleanly -----
call BLACS_GRIDEXIT ( context )call BLACS_EXIT ( 0 )end
[Native ScaLAPACKの場合 2/2]
Ref. Tom Baring, ARSC
www.arsc.edu/support/news/HPCnews.shtml
296
www.vnij.com
どうも有難うございました。
日本ビジュアル ニューメリックス株式会社
TEL:03-5211-7760
FAX:03-5211-7769
E-mail:[email protected]