雑感等

音楽,数学,語学,その他に関するメモを記す.

フラクショナルブラウン運動の生成プログラム

正規分布に従う乱数を分数階積分してフラクショナルブラウン運動を生成し,csv形式に出力するプログラム.
下記のC++11のコンパイラで動作を確認

  • Embarcadero Technologies Inc. bcc32c version 3.3.1
  • Microsoft Visual Studio Community 2015 Version 14.0.25431.01 Update 3
//>>bcc32c fBm_generator.cpp
//>>fBm_generator.exe 
//または
//>>fBm_generator.exe [Hurst指数]
#include<iostream>
#include<math.h>
#include <random>
#include <fstream>
#include <stdlib.h>

////////設定項目////////

//Hurst指数 下記の値または,コマンドライン引数の一番目
#define HURST_EXPONENT (0.5)
//出力する時系列データの点数
#define DATALEN (65536)

//fBmの時系列データを出力するファイル名.ただし,出力形式はcsv
#define fBm_FILENAME ("fBm.csv")

//fBmの生成に使用する乱数の時系列データを出力するファイル名.ただし,出力形式はcsv
#define WHITE_NOISE_FILENAME ("white.csv")


////////計算プログラム////////

//分数階積分する関数"FractionalIntegral"は下記のサイトから引用,一部改変した.
//http://www.geocities.co.jp/Technopolis-Mars/1795/study/fractint.html
#define MAXKAISUU s //積分演算をおこなう時に利用する過去の情報の最大数
#define m_chk_mean false //最終的に平均値を零とする処理をおこなうかどうか
#define m_DT 1.0 //時系列のサンプリング時間間隔

//入力信号をそのまま微分する
//*data・・・微分をおこなう対象データのポインタ
//sekibun・・・積分階数
//s・・・データの大きさ
void FractionalIntegral(double *data, double sekibun, int s)
{
	register int m, t;

	//sekibunが整数かどうか判別する(整数の時には動作が異なる)
	int kaisuu = (sekibun == (int)sekibun) ? (int)sekibun : MAXKAISUU;
	double* ganma = new double[kaisuu + 1];

	//ガンマ関数の値をストックする    (n+1)C(m+1)
	//ついでに符号も保存する
	ganma[0] = 1.0;
	for (m = 1; m <= kaisuu; m++)
		ganma[m] = -ganma[m - 1] * (sekibun - m + 1) / (double)m;

	//非整数階積分をする
	double p = pow(m_DT, sekibun); //h^d
								   // for(t = s; t; data[--t] -= data[0]);  //積分の場合はいらない

	register double f;
	int M;
	for (t = 0; t < s; t++) {
		M = (t < kaisuu) ? t : kaisuu;
		for (f = data[t] * p, m = 1; m <= M; f -= ganma[m] * data[t - m], m++);
		data[t] = f;
	}
	delete[] ganma;

	//データの平均を0に
	if (m_chk_mean) {
		for (f = 0.0, t = s; t; f += data[--t]);
		for (f /= s, t = s; t; data[--t] -= f);
	}
}

//正規分布に従う乱数を発生させる関数"randnormal"は下記のサイトを引用,改変した.
//https://cpprefjp.github.io/reference/random.html
double randnormal(double mean, double stdDev) {
	// メルセンヌ・ツイスター法による擬似乱数生成器を、
	// ハードウェア乱数をシードにして初期化
	std::random_device seed_gen;
	std::mt19937 engine(seed_gen());

	// 正規分布
	// 平均mean、標準偏差stdDevで分布させる
	std::normal_distribution<> dist(mean, stdDev);
	return dist(engine);
}


int main(int argc, char *argv[]) {
	double signal[DATALEN];

	//正規分布に従う乱数を発生
	for (int i = 0; i < DATALEN; ++i) {
		signal[i] = randnormal(0, 1);
	}
	std::cout << "乱数の一番目の値:" << signal[0] << std::endl;
	//正規分布に従う乱数を保存
	std::ofstream filew(WHITE_NOISE_FILENAME);
	for (int i = 0; i < DATALEN; ++i) {
		filew << signal[i] << "\n";
	}

	//Hurst指数に0.5を加算し,乱数時系列信号を分数階積分する階数integrateOrderを決定
	double integrateOrder = HURST_EXPONENT + 0.5;

	if (argc > 1) {
		char *strtod_error;
		double input = strtod(argv[1], &strtod_error);
		if (*strtod_error != '\0') {
			std::cout << "Hurst指数として設定できない文字列:" << strtod_error << std::endl;
		}
		integrateOrder = input + 0.5;
	}
	std::cout << "Hurst指数:" << integrateOrder - 0.5 << std::endl;
	//分数階積分を実行
	FractionalIntegral(signal, integrateOrder, DATALEN);

	//フラクショナルブラウン運動信号を保存
	std::ofstream file(fBm_FILENAME);
	for (int i = 0; i < DATALEN; ++i) {
		file << signal[i] << "\n";
	}

	file.close();
	filew.close();
	return 0;
}

指数関数表記のシフト演算子

(p. 174)方程式 x' (\lambda)=wx(\lambda)を満たし,かつ条件 x(\lambda_{0})=kを満たすような演算子関数 x(\lambda)はたかだか一つしか存在しない.
(p. 175) wが数ならば,指数関数 x(\lambda)=e^{\lambda w}は方程式 x' (\lambda)=wx(\lambda)および条件 x(0)=1を満足する.
(p. 172) h^{\lambda}は, (h^{\lambda})'=-sh^{\lambda},\, h^{0}=1を満たす.
(p. 175)シフト演算子(移動演算子 h^{\lambda}=e^{-\lambda s}と書く.

  1. ヤン・ミクシンスキー. 演算子法: 上巻. 松村英之, 松浦重武訳. 新版, 裳華房, 299p.

不変測度(不変密度)がフロベニウス=ペロン方程式を満たすことの証明

文献[1]でロジスティック写像リアプノフ指数を解析的に求めるために,不変測度とフロベニウス=ペロン方程式について述べていた.

  • ロジスティック写像 x_{n+1}=f(x_n)=4 x_{n} (1-x_{n})

以下では不変測度とフロベニウス=ペロン方程式の詳細についてまとめる.

不変測度(不変密度)がフロベニウス=ペロン方程式を満たすことの証明

  • 不変測度: \rho(x)=\lim_{T \rightarrow \infty} {\frac{1}{T} \sum^{T-1}_{n=0} {\delta (x-x_{n})}}
  • フロベニウス=ペロン方程式: \rho(x)= \int d\xi \delta (x - f(\xi)) \rho (\xi)
  • フロベニウス=ペロン方程式に不変測度を代入する.

 \rho(x)= \int d\xi \delta (x - f(\xi)) \{ \lim_{T \rightarrow \infty} {\frac{1}{T} \sum^{T-1}_{n=0} {\delta (\xi-x_{n})}} \}

  \int d\xi \delta (\xi - f(\xi))は極限の Tに依存しないから,  \int d\xi \delta (x - f(\xi))を移動する.
 \rho(x)= \lim_{T \rightarrow \infty} \frac{1}{T} \int d\xi \delta (x - f(\xi))   \sum^{T-1}_{n=0} {\delta (\xi-x_{n})}

  • 積分と総和の順番を変える.

 \rho(x)= \lim_{T \rightarrow \infty} \frac{1}{T}  \sum^{T-1}_{n=0} \int d\xi \delta (x - f(\xi))   \delta (\xi-x_{n})

 \rho(x)= \lim_{T \rightarrow \infty} \frac{1}{T}  \sum^{T-1}_{n=0} \delta (x - f(x_{n}))

  •  x_{n+1}=f(x_n)を用いる.

 \rho(x)= \lim_{T \rightarrow \infty} \frac{1}{T}  \sum^{T-1}_{n=0} \delta (x - x_{n+1})

上式までの変形から, x_nで表される不変測度 \rho (x)をフロベニウス=ペロン方程式に代入すると,不変測度 \rho (x) x_{n+1}で表されることが示される.

 x_n=x_{n+1}が成立しなければ不変測度 \rho (x)をフロベニウス=ペロン方程式を満たさない.不変測度 \rho (x)をフロベニウス=ペロン方程式を満たすためには, x_nが「定常状態」であれば良い.

  • 従って x_n=x_{n+1}が成立すると仮定する.

 \rho(x)= \lim_{T \rightarrow \infty} \frac{1}{T}  \sum^{T-1}_{n=0} \delta (x - x_{n})

以上から,不変測度(不変密度)がフロベニウス=ペロン方程式に対して不変であることを示した.

不変測度(不変密度)

文献[2]では,「軌道上の状態 xが微小区間 [  x, x+dx ]に滞在する割合が \rho (x) dxと表させるとき, \rho (x)を不変密度(invariant density)という.」と述べている.

文献[1], [2]ではエルゴード仮説が正しいと仮定して,時間平均と統計平均(アンサンブル平均)とが等しいと仮定している.

  • 関数 h (x)の時間平均: \lim_{T \rightarrow \infty} {\frac{1}{T} \sum^{T-1}_{n=0} {h( x_n )} }
  • 関数 h (x)の統計平均:  < h > = \int {\rho (x) h (x) dx}

フロベニウス=ペロン方程式

文献[2]では,おおよそ次のように説明している.

初期時刻において滑らかな確率密度関数 \rho_0従う無数の初期点を写像 x_{n+1}=f(x)で発展させる.このとき時刻 nにおいて微小区間 [  x, x+dx ]に存在する点の割合が \rho_n (x) dxと表されるとする.この \rho_n (x)の時間発展は以下のフロベニウス=ペロン方程式に従う.

  • フロベニウス=ペロン方程式: \rho_{n}=\int \rho_n (y) \delta \{ x-f(y) \} dy

さらに同書には,「ここで右辺は,時刻 n確率密度関数 \rho_n (y)に従って分布する状態点 yのうち
写像 fにより新たな状態点 x= f(y)に移される点のみを集めたものが,時刻 n+1における状態 xの密度 \rho_{n+1} (y)を与えることを意味している.」と示されている.

文献

[1] 中川匡弘: カオス・フラクタル感性情報工学. 日刊工業新聞社, 2010.
[2] 中尾裕也ほか: ネットワーク・カオス―非線形ダイナミクス複雑系と情報ネットワーク. コロナ社, 2018.

Windows10 April Update 2018(バージョン1803)アップデート失敗時の対応

アップデート失敗により発生した問題

下記のような問題が発生した.

  • 「C:\Windows\System32\config\Systemprofile\Desktopは利用できない場所を参照しています。このコンピュータのハードドライブ上、 ...」と表示される.
  • タスクバーの色やデスクトップ背景が黒くなり,タスクバー位置が下(デフォルトの配置)になる.
  • スタートボタン(Windowsボタン)やタスクバーが機能しない.
    • 一部の設定画面にアクセスできない
  • Winキー+Rで「ファイル名を指定して実行」から「explorer」を起動しようとしても「存在しないトークンを参照しようとしました」などと表示され「explorer」が起動しない.
  • キーボード配列が英語キーボードになる.

最終的な対応:インストールメディアによる修復セットアップ(上書きインストール)

上書きインストールではOSのみを上書きし,OSの修復を試みる.
よって,ユーザがインストールしたプログラムやユーザが作成したファイルは削除されない.

手順

  1. Windows 10 のダウンロードから「ツールを今すぐダウンロード」をクリックし,「MediaCreationTool」をダウンロードした.
  2. 別PCで「MediaCreationTool」を実行した.下記のページが示す手順に沿った.windowsfaq.net
    • 内容が消えてもよいUSBメモリ(16GB)にインストールメディアを使った.
  3. 問題のPC上で,USBメモリのルートフォルダ内「setup.exe」を実行した.下記のページが示す手順に沿った.windowsfaq.net
    • セーフモードでは上書きインストールできないと表示されたため,普通に起動してsetup.exeを実行した.
    • USBメモリを差し込んでも認識しなかったため後述の方法でUSBメモリにアクセスした.
  4. 上書きインストール終了後,自身のアカウントにログインし,正常に動作することを確認した.

USBメモリを差し込んでも認識しない問題:mountvolコマンドでディスクをマウント

USBメモリを差し込んでから,cmd上で「a:」から[z:]まで実行しても,
インストールメディアが入ったUSBメモリにアクセスできなかった.
しかし,デバイスマネージャーでは,目的のUSBメモリの項目と思われるものが表示されていた.

下記ページを参考に,USBメモリをマウントし,ドライブレターを割り当てようと試みた.
Windowsコマンド集:(mountvol)

オプションなしで「mountvol」を実行すると「\\?\Volume{~~}\」が羅列されるが,
どれが目的のUSBメモリに対応するのかがわからなかった.
そのため,今回はドライブレターを割り当てられていないすべての「\\?\Volume{~~}\」に
ドライブレターを割り当てた.
各ドライブレターを参照してdirコマンド実行し,setup.exeが含まれる目的のUSBメモリにアクセスできたことを確認した.

※すべての「\\?\Volume{~~}\」にドライブレターを割り当てた場合,
ユーザのアクセスを想定していないドライブ(OS再インストール用のファイルが入ったドライブなど)にも
アクセスできるようになる場合があるが,そういったドライブは「mountvol (該当ドライブレター):\ \d」を実行し,
即座にアンマウントしたほうがよいと思われる.

白色点の色度(Y=100で正規化)

D65光源の色度はITU-R BT.709-6 (06/2015)を参照した.

CIE L*a*b*, CIE L*u*v*を計算する際は,
Y=100に正規化された白色点のXYZ三刺激値を用いる.

光源 x y X Y Z
D65 0.3127 0.3290 31270/329 100 35830/329
E 1/3 1/3 100 100 100

XYZデータとsRGBデータの相互変換

JIS X 9204 高精細カラーディジタル標準画像(XYZ/SCID)を参照した.
逆行列等の計算は十進BASIC Version 7.8.3の有理数モードを使用した.

変数

8ビットに符号化されたsRGBのコード値:
0\leq R_{\rm 8bit} ,\,G_{\rm 8bit} ,\, B_{\rm 8bit} \leq 255
sRGB値:
0\leq R_{\rm sRGB} ,\,G_{\rm sRGB} ,\, B_{\rm sRGB} \leq 1
CIE 1931 XYZ 三刺激値(相対値):
0\leq X,\,Y,\,Z \leq 1

XYZの絶対的な三刺激値を求めるには,上記のX, Y, Z値をそれぞれ80倍する.
"80"という数値はsRGBの白色点の輝度が 80\,cd/m^{3}であることによる.
https://www.w3.org/Graphics/Color/srgb

 R_{\rm 8bit} ,\,G_{\rm 8bit} ,\, B_{\rm 8bit} \rightarrow X,\,Y,\,Z


f_{\rm 8bit\rightarrow sRGB} (Q)=
\left\{ \begin{array}{ll}
    (Q/255)/12.92 & (Q \leq 0.04045\times 255) \\
    ((Q/255+0.055)/1.055)^{2.4} & (otherwise)
  \end{array} \right.
として

R_{\rm sRGB}=f_{\rm 8bit\rightarrow sRGB} \left(R_{\rm 8bit} \right) \\
G_{\rm sRGB}=f_{\rm 8bit\rightarrow sRGB} \left(G_{\rm 8bit} \right) \\
B_{\rm sRGB}=f_{\rm 8bit\rightarrow sRGB} \left(B_{\rm 8bit} \right) \\


\left[
\begin{array}{c}
 X \\ Y \\ Z 
\end{array}
\right]=

\left[
\begin{array}{ccc}
0.4124  & 0.3576  & 0.1805 \\
0.2126  &  0.7152  &  0.0722 \\
0.0193 & 0.1192 & 0.9505
\end{array}
\right]
\left[
\begin{array}{c}
R_{\rm sRGB} \\ G_{\rm sRGB} \\ B_{\rm sRGB}
\end{array}
\right]

 X,\,Y,\,Z \rightarrow R_{\rm 8bit} ,\,G_{\rm 8bit} ,\, B_{\rm 8bit}


\left[
\begin{array}{c}
R_{\rm sRGB} \\ G_{\rm sRGB} \\ B_{\rm sRGB}
\end{array}
\right] =

\left[
\begin{array}{ccc}
28154000/8687829 & -13355000/8687829  & -1444000/2895943    \\
 -418089250/431495507 &  1618760625/862991014   & 17914625/431495507  \\
484000/8687829  & -1772500/8687829   & 3061000/2895943
\end{array}
\right]
\left[
\begin{array}{c}
X \\ Y \\ Z
\end{array}
\right]
ここで,

f_{\rm sRGB \rightarrow 8bit} (Q)=
\left\{ \begin{array}{ll}
    255 \times 12.92 \times Q & (Q \leq 0.04045/12.92) \\
    255 \, (1.055\,Q^{1/2.4}-0.055) & (otherwise)
  \end{array} \right.
として

R_{\rm 8bit}=f_{\rm 8bit\rightarrow sRGB} \left(R_{\rm sRGB} \right) \\
G_{\rm 8bit}=f_{\rm 8bit\rightarrow sRGB} \left(G_{\rm sRGB} \right) \\
B_{\rm 8bit}=f_{\rm 8bit\rightarrow sRGB} \left(B_{\rm sRGB} \right) \\

XYZ表色系におけるCIE 1931 RGB原刺激の値

十進BASIC Version 7.8.3において有理数モードを使用して分数表記に直し,
JIS Z 8781-1に示される等色関数のXYZ値を線形補間して求める.

CIE 1931 RGBの原刺激は,
[R]: 700 nm
[G]: 546.1 nm
[B]: 435.8 nm
と定められる.

[R]のXYZ値:

\left[
\begin{array}{c}
 X \\ Y \\ Z 
\end{array}
\right]=
\left[
\begin{array}{c}
 283979/25000000 \\ 2051/500000  \\ 0
\end{array}
\right]=
\left[
\begin{array}{c}
0.01135916   \\  0.004102000 \\ 0.000000000000
\end{array}
\right]

[G]のXYZ値:

\left[
\begin{array}{c}
 X \\ Y \\ Z 
\end{array}
\right]=
\left[
\begin{array}{c}
37553947/100000000  \\ 49221249/50000000   \\ 2441339/200000000
\end{array}
\right]=
\left[
\begin{array}{c}
0.3755395  \\  0.9844250 \\ 0.01220670
\end{array}
\right]

[B]のXYZ値:

\left[
\begin{array}{c}
 X \\ Y \\ Z 
\end{array}
\right]=
\left[
\begin{array}{c}
 4164763/12500000  \\ 277717/15625000   \\ 2577681/1562500
\end{array}
\right]=
\left[
\begin{array}{c}
0.3331810  \\ 0.01777389  \\ 1.6497158
\end{array}
\right]