Class | Statistics |
In: |
statistics.f90
|
統計解析関係のルーチン集
Subroutine : | |||
x(:) : | real, intent(in)
| ||
anor(size(x)) : | real, intent(inout)
| ||
error : | real, intent(in), optional
|
1 次元データ配列の偏差を返す
subroutine Anomaly_1d( x, anor, error ) ! 1 次元データ配列の偏差を返す implicit none real, intent(in) :: x(:) ! データ real, intent(inout) :: anor(size(x)) ! 各 x(i) に対応する偏差 anor(i) real, intent(in), optional :: error ! 欠損値が存在するデータセットの場合の欠損値 integer :: i integer :: nx ! データの要素数 real :: ave if(present(error))then call Mean_1d( x, ave, error ) do i=1,nx if(x(i)==error)then anor(i)=error else anor(i)=x(i)-ave end if end do else call Mean_1d( x, ave ) do i=1,nx anor(i)=x(i)-ave end do end if end subroutine Anomaly_1d
Subroutine : | |||
x(:,:) : | real, intent(in)
| ||
anor(size(x,1),size(x,2)) : | real, intent(inout)
| ||
error : | real, intent(in), optional
|
2 次元データ配列の偏差を返す
subroutine Anomaly_2d( x, anor, error ) ! 2 次元データ配列の偏差を返す implicit none real, intent(in) :: x(:,:) ! データ real, intent(inout) :: anor(size(x,1),size(x,2)) ! 各 x(i,j) に対応する偏差 anor(i,j) real, intent(in), optional :: error ! 欠損値が存在するデータセットの場合の欠損値 integer :: i, j integer :: nx ! データの要素数 1 integer :: ny ! データの要素数 2 real :: ave nx=size(x,1) ny=size(x,2) if(present(error))then call Mean_2d( x, ave, error ) do j=1,ny do i=1,nx if(x(i,j)==error)then anor(i,j)=error else anor(i,j)=x(i,j)-ave end if end do end do else call Mean_2d( x, ave, error ) do j=1,ny do i=1,nx anor(i,j)=x(i,j)-ave end do end do end if end subroutine Anomaly_2d
Subroutine : | |||
x(:,:,:) : | real, intent(in)
| ||
anor(size(x,1),size(x,2),size(x,3)) : | real, intent(inout)
| ||
error : | real, intent(in), optional
|
3 次元データ配列の偏差を返す
subroutine Anomaly_3d( x, anor, error ) ! 3 次元データ配列の偏差を返す implicit none real, intent(in) :: x(:,:,:) ! データ real, intent(inout) :: anor(size(x,1),size(x,2),size(x,3)) ! 各 x(i,j,k) に対応する偏差 anor(i,j,k) real, intent(in), optional :: error ! 欠損値が存在するデータセットの場合の欠損値 integer :: i, j, k integer :: nx ! データの要素数 1 integer :: ny ! データの要素数 2 integer :: nz ! データの要素数 3 real :: ave nx=size(x,1) ny=size(x,2) nz=size(x,3) if(present(error))then call Mean_3d( x, ave, error ) do k=1,nz do j=1,ny do i=1,nx if(x(i,j,k)==error)then anor(i,j,k)=error else anor(i,j,k)=x(i,j,k)-ave end if end do end do end do else call Mean_3d( x, ave, error ) do k=1,nz do j=1,ny do i=1,nx anor(i,j,k)=x(i,j,k)-ave end do end do end do end if end subroutine Anomaly_3d
Subroutine : | |||
x(:) : | real, intent(in)
| ||
y(size(x)) : | real, intent(in)
| ||
cc : | real, intent(inout)
| ||
error : | real, intent(in), optional
|
2 データの相関係数を計算するルーチン
subroutine Cor_Coe( x, y ,cc, error ) ! 2 データの相関係数を計算するルーチン implicit none real, intent(in) :: x(:) ! データ要素 1 real, intent(in) :: y(size(x)) ! データ要素 2 real, intent(inout) :: cc ! 相関係数 real, intent(in), optional :: error ! 欠損値 integer :: i integer :: nx ! データ個数 real :: cov, anor1, anor2 nx=size(x) if(present(error))then call covariance( x, y, cov, error ) call stand_vari( x, anor1, error ) call stand_vari( y, anor2, error ) else call covariance( x, y, cov ) call stand_vari( x, anor1 ) call stand_vari( y, anor2 ) end if cc=cov/(sqrt(anor1)*sqrt(anor2)) end subroutine Cor_Coe
Subroutine : | |||
x(:) : | real, intent(in)
| ||
y(size(x)) : | real, intent(in)
| ||
slope : | real, intent(inout)
| ||
intercept : | real, intent(inout)
| ||
undef : | real, intent(in), optional
|
最小二乗法による傾きと切片計算
subroutine LSM( x, y, slope, intercept, undef ) ! 最小二乗法による傾きと切片計算 implicit none real, intent(in) :: x(:) ! データ要素 1 real, intent(in) :: y(size(x)) ! データ要素 2 real, intent(inout) :: slope ! 最適な傾き real, intent(inout) :: intercept ! 最適な切片 real, intent(in), optional :: undef ! undef real :: u(size(x)), v(size(x)) integer :: i, j, k integer :: nx ! データ数 real :: a, b, c, d nx=size(x) a=0.0 b=0.0 c=0.0 d=0.0 !$omp parallel do shared(u, v, x, y) private(i) do i=1,nx u(i)=x(i)*x(i) v(i)=x(i)*y(i) end do !$omp end parallel do call summ(v,a,undef) call summ(x,b,undef) call summ(y,c,undef) call summ(u,d,undef) slope=(nx*a-b*c)/(nx*d-b**2) intercept=(c*d-a*b)/(nx*d-b**2) end subroutine LSM
Subroutine : | |||
x(:) : | real, intent(in)
| ||
y(size(x)) : | real, intent(in)
| ||
a(:) : | real, intent(inout)
| ||
intercept : | real, intent(inout)
| ||
undef : | real, intent(in), optional
|
LSM の多項式近似バージョン. LSM では, F(x)=a_0+a_1x の直線近似を行っていたが, LSM_poly では, F(x)=sum^{N}_{n=0}{a_nx^n} の任意次数の多項式曲線近似を行うことが可能. アルゴリズムは最小二乗法を用いており, 係数のソルバには gausss ルーチンを使用.
subroutine LSM_poly( x, y, a, intercept, undef ) ! LSM の多項式近似バージョン. ! LSM では, F(x)=a_0+a_1x の直線近似を行っていたが, ! LSM_poly では, F(x)=\sum^{N}_{n=0}{a_nx^n} ! の任意次数の多項式曲線近似を行うことが可能. ! アルゴリズムは最小二乗法を用いており, 係数のソルバには gausss ルーチンを使用. use Algebra implicit none real, intent(in) :: x(:) ! データ要素配列 1 real, intent(in) :: y(size(x)) ! データ要素配列 2 real, intent(inout) :: a(:) ! 多項式の係数 real, intent(inout) :: intercept ! y 切片. ! a に組み込むと引数を渡すとき, poly_n+1 で渡す必要が ! あり, 紛らわしいと判断したため, a_0 である y 切片を ! 独立で引数として渡すことにした. real, intent(in), optional :: undef ! 未定義値. integer :: i, j, k, l, m, n integer :: nx ! データの個数 integer :: poly_n ! 近似する曲線の最高次数. 1 なら, LSM と同じ. real :: coe(0:size(a)), tmpa_coe(0:size(a),0:size(a)), tmpb_coe(0:size(a)) ! coe は a_n が入る. tmp_coe はデータの総和が入る. ! [注意] : 第一要素が行. 第二要素が列. real :: tmp(size(x)) ! べき乗計算の一時配列 nx=size(x) poly_n=size(a) !-- gausss に渡しやすいように, 用意した配列に引数を代入. if(present(undef))then do k=0,poly_n ! 列成分の計算 do j=0,poly_n ! 行成分の計算. 行成分の計算が先に回ることに注意. if(j >= k)then ! 行成分(j)より列成分(k)の要素数が小さい場合, 値を ! まじめに計算する. do i=1,nx if(x(i)/=undef)then tmp(i)=x(i)**(j+k) else tmp(i)=undef end if end do call summ( tmp, tmpa_coe(j,k), undef ) else ! 行成分(j)より列成分(k)の要素数が大きい場合, 解く係数行列が ! 対称行列であることから, 値の参照代入のみ行う. tmpa_coe(j,k)=tmpa_coe(k,j) ! 対称成分の代入(すでに計算済み) end if end do end do do j=0,poly_n do i=1,nx if(x(i)/=undef)then tmp(i)=y(i)*(x(i)**j) else tmp(i)=undef end if end do call summ( tmp, tmpb_coe(j), undef ) end do else ! undef 処理がないとき. do k=0,poly_n ! 列成分の計算 do j=0,poly_n ! 行成分の計算. 行成分の計算が先に回ることに注意. if(j >= k)then ! 行成分(j)より列成分(k)の要素数が小さい場合, 値を ! まじめに計算する. do i=1,nx tmp(i)=x(i)**(j+k) end do call summ( tmp, tmpa_coe(j,k), undef ) else ! 行成分(j)より列成分(k)の要素数が大きい場合, 解く係数行列が ! 対称行列であることから, 値の参照代入のみ行う. tmpa_coe(j,k)=tmpa_coe(k,j) ! 対称成分の代入(すでに計算済み) end if end do end do do j=0,poly_n do i=1,nx tmp(i)=y(i)*(x(i)**j) end do call summ( tmp, tmpb_coe(j), undef ) end do end if ! 以上で係数行列に値が入った. call gausss( poly_n+1, tmpa_coe(0:poly_n,0:poly_n), tmpb_coe(0:poly_n), coe(0:poly_n) ) do i=1,poly_n a(i)=coe(i) end do intercept=coe(0) end subroutine
Subroutine : | |||
x(:) : | real, intent(in)
| ||
ave : | real, intent(inout)
| ||
error : | real, intent(in), optional
|
1 次元配列平均値計算ルーチン
subroutine Mean_1d( x, ave, error ) ! 1 次元配列平均値計算ルーチン implicit none real, intent(in) :: x(:) ! データ real, intent(inout) :: ave ! 計算する平均値 real, intent(in), optional :: error ! 欠損値が存在するデータセットの場合の欠損値 integer :: i, nt integer :: nx ! データの要素数 real :: summ summ=0.0 nt=0 nx=size(x) if(present(error))then do i=1,nx if(x(i)/=error)then summ=summ+x(i) nt=1+nt end if end do if(nt/=0)then ave=summ/nt else ave=0.0 end if else do i=1,nx summ=summ+x(i) end do ave=summ/nx end if end subroutine Mean_1d
Subroutine : | |||
x(:,:) : | real, intent(in)
| ||
ave : | real, intent(inout)
| ||
error : | real, intent(in), optional
|
2 次元配列平均値計算ルーチン
subroutine Mean_2d( x, ave, error ) ! 2 次元配列平均値計算ルーチン implicit none real, intent(in) :: x(:,:) ! データ real, intent(inout) :: ave ! 計算する平均値 real, intent(in), optional :: error ! 欠損値が存在するデータセットの場合の欠損値 integer :: i, j, nt integer :: nx ! データの要素数 1 integer :: ny ! データの要素数 2 real :: summ, tmp summ=0.0 nt=0 nx=size(x,1) ny=size(x,2) if(present(error))then do j=1,ny do i=1,nx if(x(i,j)/=error)then summ=summ+x(i,j) nt=1+nt end if end do end do if(nt/=0)then ave=summ/nt else ave=0.0 end if else do j=1,ny do i=1,nx summ=summ+x(i,j) end do end do ave=summ/(nx*ny) end if end subroutine Mean_2d
Subroutine : | |||
x(:,:,:) : | real, intent(in)
| ||
ave : | real, intent(inout)
| ||
error : | real, intent(in), optional
|
3 次元配列平均値計算ルーチン
subroutine Mean_3d( x, ave, error ) ! 3 次元配列平均値計算ルーチン implicit none real, intent(in) :: x(:,:,:) ! データ real, intent(inout) :: ave ! 計算する平均値 real, intent(in), optional :: error ! 欠損値が存在するデータセットの場合の欠損値 integer :: i, j, k, nt integer :: nx ! データの要素数 1 integer :: ny ! データの要素数 2 integer :: nz ! データの要素数 2 real :: summ, tmp summ=0.0 nt=0 nx=size(x,1) ny=size(x,2) nz=size(x,3) if(present(error))then do k=1,nz do j=1,ny do i=1,nx if(x(i,j,k)/=error)then summ=summ+x(i,j,k) nt=1+nt end if end do end do end do if(nt/=0)then ave=summ/nt else ave=0.0 end if else do k=1,nz do j=1,ny do i=1,nx summ=summ+x(i,j,k) end do end do end do ave=summ/(nx*ny*nz) end if end subroutine Mean_3d
Subroutine : | |||
x(:) : | real, intent(in)
| ||
y(size(x)) : | real, intent(in)
| ||
slope : | real, intent(inout)
| ||
intercept : | real, intent(inout)
|
LSM を用いて回帰直線の傾き slope と切片 intercept を計算するルーチン
subroutine Reg_Line( x, y, slope, intercept ) ! LSM を用いて回帰直線の傾き slope と切片 intercept を計算するルーチン implicit none real, intent(in) :: x(:) ! データ要素 1 real, intent(in) :: y(size(x)) ! データ要素 2 real, intent(inout) :: slope ! 最適な傾き real, intent(inout) :: intercept ! 最適な切片 real :: u(size(x)), v(size(x)) integer :: nx ! データ数 nx=size(x) call Anomaly_1d( x, u ) call Anomaly_1d( y, v ) call LSM( u, v, slope, intercept ) end subroutine
Subroutine : | |||
x(:) : | real, intent(in)
| ||
y(size(x)) : | real, intent(in)
| ||
cov : | real, intent(inout)
| ||
error : | real, intent(in), optional
|
2 つの 1 次元データの共分散を計算 共分散$sigma $の定義は, $$sigma =sum^{nx}_{i=1}{(x-\bar{x})(y-\bar{y})} $$
subroutine covariance( x, y, cov, error ) ! 2 つの 1 次元データの共分散を計算 ! 共分散$\sigma $の定義は, ! $$\sigma =\sum^{nx}_{i=1}{(x-\bar{x})(y-\bar{y})} $$ implicit none real, intent(in) :: x(:) ! データ 1 real, intent(in) :: y(size(x)) ! データ 2 real, intent(inout) :: cov ! 標準偏差 real, intent(in), optional :: error ! 欠損値 integer :: i integer :: nx ! データ数 real :: an1(size(x)), an2(size(x)) nx=size(x) cov=0.0 if(present(error))then call Anomaly_1d( x, an1, error ) call Anomaly_1d( y, an2, error ) do i=1,nx if(x(i)/=error)then cov=cov+an1(i)*an2(i) end if end do else call Anomaly_1d( x, an1 ) call Anomaly_1d( y, an2 ) do i=1,nx cov=cov+an1(i)*an2(i) end do end if end subroutine covariance
Subroutine : | |||
x(:) : | real, intent(in)
| ||
point : | real, intent(in)
| ||
i : | integer, intent(inout)
| ||
undeff : | real, intent(in), optional
|
漸増配列(要素数が増えるごとに値が大きくなる配列)のなかで, point の前に来る要素番号を出力する.
subroutine interpo_search_1d( x, point, i, undeff ) ! 漸増配列(要素数が増えるごとに値が大きくなる配列)のなかで, ! point の前に来る要素番号を出力する. implicit none real, intent(in) :: x(:) ! 漸増配列 real, intent(in) :: point ! この点 integer, intent(inout) :: i ! point の値を越えない最大の値をもつ要素番号 real, intent(in), optional :: undeff ! 探索範囲の配列要素より小さい値を探索しようとした際, undef を返すが, その undef 値を設定する. default では 0. integer :: nx, j integer :: just nx=size(x) if(present(undeff))then just=int(undeff) else just=0 end if do j=1,nx if(x(1)>point)then write(*,*) "****** WARNING ******" write(*,*) "searching point was not found." write(*,*) "Abort. Exit.!!!" i=just exit end if if(present(undeff))then if(x(j)/=undeff)then if(x(j)<=point)then i=j else exit end if end if else if(x(j)<=point)then i=j else exit end if end if end do end subroutine interpo_search_1d
Subroutine : | |||
x(:) : | real, intent(in)
| ||
y(:) : | real, intent(in)
| ||
pointx : | real, intent(in)
| ||
pointy : | real, intent(in)
| ||
i : | integer, intent(inout)
| ||
j : | integer, intent(inout)
| ||
undeff : | real, intent(in), optional
|
漸増配列(要素数が増えるごとに値が大きくなる配列)のなかで, point の前に来る要素番号を出力する.
subroutine interpo_search_2d( x, y, pointx, pointy, i, j, undeff ) ! 漸増配列(要素数が増えるごとに値が大きくなる配列)のなかで, ! point の前に来る要素番号を出力する. implicit none real, intent(in) :: x(:) ! 漸増配列 x real, intent(in) :: y(:) ! 漸増配列 y real, intent(in) :: pointx ! この点 x real, intent(in) :: pointy ! この点 y integer, intent(inout) :: i ! pointx の値を越えない最大の値をもつ要素番号 integer, intent(inout) :: j ! pointy の値を越えない最大の値をもつ要素番号 real, intent(in), optional :: undeff ! 探索範囲の配列要素より小さい値を探索しようとした際, undef を返すが, その undef 値を設定する. default では 0. integer :: just if(present(undeff))then just=int(undeff) call interpo_search_1d( x, pointx, i, real(just) ) call interpo_search_1d( y, pointy, j, real(just) ) else call interpo_search_1d( x, pointx, i ) call interpo_search_1d( y, pointy, j ) end if end subroutine interpo_search_2d
Subroutine : | |||
x(:) : | real, intent(in)
| ||
y(:) : | real, intent(in)
| ||
z(:) : | real, intent(in)
| ||
pointx : | real, intent(in)
| ||
pointy : | real, intent(in)
| ||
pointz : | real, intent(in)
| ||
i : | integer, intent(inout)
| ||
j : | integer, intent(inout)
| ||
k : | integer, intent(inout)
| ||
undeff : | real, intent(in), optional
|
漸増配列(要素数が増えるごとに値が大きくなる配列)のなかで, point の前に来る要素番号を出力する.
subroutine interpo_search_3d( x, y, z, pointx, pointy, pointz, i, j, k, undeff ) ! 漸増配列(要素数が増えるごとに値が大きくなる配列)のなかで, ! point の前に来る要素番号を出力する. implicit none real, intent(in) :: x(:) ! 漸増配列 x real, intent(in) :: y(:) ! 漸増配列 y real, intent(in) :: z(:) ! 漸増配列 z real, intent(in) :: pointx ! この点 x real, intent(in) :: pointy ! この点 y real, intent(in) :: pointz ! この点 z integer, intent(inout) :: i ! pointx の値を越えない最大の値をもつ要素番号 integer, intent(inout) :: j ! pointy の値を越えない最大の値をもつ要素番号 integer, intent(inout) :: k ! pointz の値を越えない最大の値をもつ要素番号 real, intent(in), optional :: undeff ! 探索範囲の配列要素より小さい値を探索しようとした際, undef を返すが, その undef 値を設定する. default では 0. integer :: just if(present(undeff))then just=int(undeff) call interpo_search_1d( x, pointx, i, real(just) ) call interpo_search_1d( y, pointy, j, real(just) ) call interpo_search_1d( z, pointz, k, real(just) ) else call interpo_search_1d( x, pointx, i ) call interpo_search_1d( y, pointy, j ) call interpo_search_1d( z, pointz, k ) end if end subroutine interpo_search_3d
Subroutine : | |||
tmin : | real, intent(in)
| ||
tmax : | real, intent(in)
| ||
xmin : | real, intent(in)
| ||
xmax : | real, intent(in)
| ||
point : | real, intent(in)
| ||
val : | real, intent(inout)
|
1 次の線形内挿ルーチン
subroutine interpolation_1d( tmin, tmax, xmin, xmax, point, val ) ! 1 次の線形内挿ルーチン implicit none real, intent(in) :: tmin ! 内挿点の左端 real, intent(in) :: tmax ! 内挿点の右端 real, intent(in) :: xmin ! tmin での値 real, intent(in) :: xmax ! tmax での値 real, intent(in) :: point ! 内挿点 real, intent(inout) :: val ! 内挿点での値 real :: fd, dt dt=point-tmin fd=(xmax-xmin)/(tmax-tmin) val=xmin+dt*fd end subroutine interpolation_1d
Subroutine : | |||
x(2) : | real, intent(in)
| ||
y(2) : | real, intent(in)
| ||
z(2,2) : | real, intent(in)
| ||
point(2) : | real, intent(in)
| ||
val : | real, intent(inout)
|
2 次の重線形内挿ルーチン 本ルーチンは直線直交座標空間でのみ使用可能.
subroutine interpolation_2d( x, y, z, point, val ) ! 2 次の重線形内挿ルーチン ! 本ルーチンは直線直交座標空間でのみ使用可能. implicit none real, intent(in) :: x(2) ! 内挿の空間点 x 方向の左右端 real, intent(in) :: y(2) ! 内挿の空間点 y 方向の左右端 real, intent(in) :: z(2,2) ! x, y での各点での値, (i,j) について, i<=x, j<=y real, intent(in) :: point(2) ! 内挿点 point(1)<=x 座標, point(2)<=y 座標 real, intent(inout) :: val ! 内挿点での値 real :: valx(2) ! y(1) での x 方向の内挿点での値 call interpolation_1d( x(1), x(2), z(1,1), z(2,1), point(1), valx(1) ) ! y(2) での x 方向の内挿点での値 call interpolation_1d( x(1), x(2), z(1,2), z(2,2), point(1), valx(2) ) ! x の内挿点からの y 方向の内挿点での値(これが求める内挿点) call interpolation_1d( y(1), y(2), valx(1), valx(2), point(2), val ) end subroutine interpolation_2d
Subroutine : | |||
x(2) : | real, intent(in)
| ||
y(2) : | real, intent(in)
| ||
z(2) : | real, intent(in)
| ||
u(2,2,2) : | real, intent(in)
| ||
point(3) : | real, intent(in)
| ||
val : | real, intent(inout)
|
3 次の重線形内挿ルーチン 本ルーチンは直線直交座標空間でのみ使用可能.
subroutine interpolation_3d( x, y, z, u, point, val ) ! 3 次の重線形内挿ルーチン ! 本ルーチンは直線直交座標空間でのみ使用可能. implicit none real, intent(in) :: x(2) ! 内挿の空間点 x 方向の左右端 real, intent(in) :: y(2) ! 内挿の空間点 y 方向の左右端 real, intent(in) :: z(2) ! 内挿の空間点 z 方向の左右端 real, intent(in) :: u(2,2,2) ! x, y, z での各点での値, (i,j,k) について, i<=x, j<=y, k<=z real, intent(in) :: point(3) ! 内挿点 point(1)<=x 座標, point(2)<=y 座標, point(3)<=z 座標 real, intent(inout) :: val ! 内挿点での値 real :: valx(2) ! z(1) での x-y 平面での重線形内挿の値 call interpolation_2d( x, y, u(:,:,1), point(1:2), valx(1) ) ! z(2) での x 方向の内挿点での値 call interpolation_2d( x, y, u(:,:,2), point(1:2), valx(2) ) ! z(1) の内挿点からの z 方向の内挿点での値(これが求める内挿点) call interpolation_1d( z(1), z(2), valx(1), valx(2), point(3), val ) end subroutine interpolation_3d
Subroutine : | |||
x(:) : | real, intent(in)
| ||
point : | real, intent(in)
| ||
i : | integer, intent(inout)
| ||
undeff : | real, intent(in), optional
|
1 次元最近傍探索ルーチン interpo_search_1d から値を求め, その値と +1 した値の距離を比較して 距離の短い方を選択する.
subroutine nearest_search_1d( x, point, i, undeff ) ! 1 次元最近傍探索ルーチン ! interpo_search_1d から値を求め, その値と +1 した値の距離を比較して ! 距離の短い方を選択する. implicit none real, intent(in) :: x(:) ! 漸増配列 real, intent(in) :: point ! この点 integer, intent(inout) :: i ! point の最近傍地点の要素番号 real, intent(in), optional :: undeff ! 探索範囲の配列要素より小さい値を探索しようとした際, undef を返すが, その undef 値を設定する. default では 0. real :: tmp1, tmp2 integer :: j if(present(undeff))then call interpo_search_1d( x, point, j, undeff ) else call interpo_search_1d( x, point, j ) end if tmp1=x(j) tmp2=x(j+1) if(abs(point-tmp1)>=abs(tmp2-point))then if(size(x)>=j+1)then ! j+1 が配列参照外の場合の処理 i=j+1 else i=j end if else i=j end if if(j==0)then write(*,*) "WARNING: j is undef value." end if if(present(undeff))then if(j==int(undeff))then write(*,*) "WARNING: j is undef value." end if end if end subroutine nearest_search_1d
Subroutine : | |||
x(:) : | real, intent(in)
| ||
y(:) : | real, intent(in)
| ||
pointx : | real, intent(in)
| ||
pointy : | real, intent(in)
| ||
i : | integer, intent(inout)
| ||
j : | integer, intent(inout)
| ||
undeff : | real, intent(in), optional
|
2 次元最近傍探索ルーチン nearest_search_1d から値を求める. 本来, 2 次元であるため, 周囲 4 点の最近を計算する必要があるが, ここでは直交直線座標を考えているので, 各軸方向独立で最近点を計算し, どちらも最近の点が求めたい 2 次元の最近点となる.
subroutine nearest_search_2d( x, y, pointx, pointy, i, j, undeff ) ! 2 次元最近傍探索ルーチン ! nearest_search_1d から値を求める. ! 本来, 2 次元であるため, 周囲 4 点の最近を計算する必要があるが, ! ここでは直交直線座標を考えているので, 各軸方向独立で最近点を計算し, ! どちらも最近の点が求めたい 2 次元の最近点となる. implicit none real, intent(in) :: x(:) ! 漸増配列 x real, intent(in) :: y(:) ! 漸増配列 y real, intent(in) :: pointx ! この点 x real, intent(in) :: pointy ! この点 y integer, intent(inout) :: i ! pointx の最近要素番号 integer, intent(inout) :: j ! pointy の最近要素番号 real, intent(in), optional :: undeff ! 探索範囲の配列要素より小さい値を探索しようとした際, undef を返すが, その undef 値を設定する. default では 0. if(present(undeff))then call nearest_search_1d( x, pointx, i, undeff ) call nearest_search_1d( y, pointy, j, undeff ) else call nearest_search_1d( x, pointx, i ) call nearest_search_1d( y, pointy, j ) end if end subroutine nearest_search_2d
Subroutine : | |||
x(:) : | real, intent(in)
| ||
y(:) : | real, intent(in)
| ||
z(:) : | real, intent(in)
| ||
pointx : | real, intent(in)
| ||
pointy : | real, intent(in)
| ||
pointz : | real, intent(in)
| ||
i : | integer, intent(inout)
| ||
j : | integer, intent(inout)
| ||
k : | integer, intent(inout)
| ||
undeff : | real, intent(in), optional
|
2 次元最近傍探索ルーチン nearest_search_1d から値を求める. 本来, 2 次元であるため, 周囲 4 点の最近を計算する必要があるが, ここでは直交直線座標を考えているので, 各軸方向独立で最近点を計算し, どちらも最近の点が求めたい 2 次元の最近点となる.
subroutine nearest_search_3d( x, y, z, pointx, pointy, pointz, i, j, k, undeff ) ! 2 次元最近傍探索ルーチン ! nearest_search_1d から値を求める. ! 本来, 2 次元であるため, 周囲 4 点の最近を計算する必要があるが, ! ここでは直交直線座標を考えているので, 各軸方向独立で最近点を計算し, ! どちらも最近の点が求めたい 2 次元の最近点となる. implicit none real, intent(in) :: x(:) ! 漸増配列 x real, intent(in) :: y(:) ! 漸増配列 y real, intent(in) :: z(:) ! 漸増配列 z real, intent(in) :: pointx ! この点 x real, intent(in) :: pointy ! この点 y real, intent(in) :: pointz ! この点 z integer, intent(inout) :: i ! pointx の最近要素番号 integer, intent(inout) :: j ! pointy の最近要素番号 integer, intent(inout) :: k ! pointz の最近要素番号 real, intent(in), optional :: undeff ! 探索範囲の配列要素より小さい値を探索しようとした際, undef を返すが, その undef 値を設定する. default では 0. integer :: just if(present(undeff))then call nearest_search_1d( x, pointx, i, undeff ) call nearest_search_1d( y, pointy, j, undeff ) call nearest_search_1d( z, pointz, k, undeff ) else call nearest_search_1d( x, pointx, i ) call nearest_search_1d( y, pointy, j ) call nearest_search_1d( z, pointz, k ) end if end subroutine nearest_search_3d
Subroutine : | |||
x(:) : | real, intent(in)
| ||
anor : | real, intent(inout)
| ||
error : | real, intent(in), optional
|
1 次元データの標準偏差を計算 標準偏差$sigma $の定義は, $$sigma =sum^{nx}_{i=1}{epsilon ^2} $$ ただし, $epsilon $は平均値からのずれ$x-\bar{x}$である.
subroutine stand_vari( x, anor, error ) ! 1 次元データの標準偏差を計算 ! 標準偏差$\sigma $の定義は, ! $$\sigma =\sum^{nx}_{i=1}{epsilon ^2} $$ ! ただし, $\epsilon $は平均値からのずれ$x-\bar{x}$である. implicit none real, intent(in) :: x(:) ! データ real, intent(inout) :: anor ! 標準偏差 real, intent(in), optional :: error ! 欠損値 integer :: i integer :: nx ! データ数 real :: an(size(x)) nx=size(x) anor=0.0 if(present(error))then call Anomaly_1d( x, an, error ) do i=1,nx if(x(i)/=error)then anor=anor+an(i)**2 end if end do else call Anomaly_1d( x, an ) do i=1,nx anor=anor+an(i)**2 end do end if end subroutine stand_vari