【Office Word】ページ番号のつけ方
Wordでレポートをカッコよく書きたい,または書かなければならない人に向けた記事を紹介する.
物理学実験では以下のサイトを参考されたし.
phbe.hateblo.jp
最小二乗法解くなら行列が楽って話
実験式がであるとき
最小二乗法の原理より,誤差の二乗の和を作ると,同じ精度を持つ測定の場合
nはデータセットの個数である.
行列式に置き換えて,
(1)を見ると,逆行列を計算することと,行列積を求めるだけでパラメータが決定できる.
データ
エクセルで逆行列
逆行列を計算する関数はMINVERSE関数.求まる逆行列の大きさに等しいセル範囲を選択した状態で下記のように数式を入力して、[Ctrl]+[Shift]+[Enter]を押すと結果が得られる.
エクセルで行列積
行列の積を計算する関数はMMULT関数.求まる逆行列の大きさに等しいセル範囲を選択した状態で下記のように数式を入力して、[Ctrl]+[Shift]+[Enter]を押すと結果が得られる.
結果
となった.
最確値の確率誤差の計算
に平均誤差はの誤差がないものとすれば,
分母である自由度の個数はポイント数からパラメータの個数を引いたものである.
ゆえに,の確率誤差は
の確率誤差は,誤差の伝搬法より,
エクセルで計算するには
の計算は非常に単純なので,割愛.
の計算を行列で表すと,
MINVERSE関数は分数の△も含むので,の計算だけすればよく,エクセルで計算すると,
結果の対角成分が確率誤差になる.
まとめ
エクセルのシートを載せた.最小二乗法を連立方程式で解けばそれまでではあるが,エクセルだとどうしても計算ミスが怖い.
高次の計算こそ行列で済ませるととても早くなるので,ぜひ活用していただきたい.
「行列でやってみたい」「やってみてもうまくいかない」となった人はぜひ私に聞きに来てほしい.
C/C++ double型からint型へ変換
(int)で型を変換すると,切り下げになる.
#include<iostream> int main() { double d = 10.811; int i; i = (int)d;#doubleからintへ変換している std::cout << i << std::endl; }
#output 10
そのため,四捨五入がしたい場合は,double型に対して0.5を足してdouble型の状態で繰り上げておく必要がある.
#include<iostream> int main() { double d = 10.811; int i; i = (int)(d +0.5);#double型に対して0.5を足してint型に変換する std::cout << i << std::endl; }
#output 11
C/C++で二次関数のFitting
【やったこと】
C/C++で二次関数の最小二乗法を行った.計算では,逆行列・行列の積をやった.
【わかったこと】
C/C++にはPythonのような最小二乗法のライブラリはない
(おそらく,あるなら教えてほしい)
行列は簡単(手計算は地獄).ちなみにfor文でぶんまわすだけ.
【計算式】
二次関数の最小二乗法
【コード】
double A[3][3] = { {x4,x3,x2},{x3,x2,x},{x2,x,N} }; double inv_A[3][3], c[3], buf, term; int i, j, k;//for文のための準備 int n = 3;//3×3行列用 //単位行列を作る for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { inv_A[i][j] = (i == j) ? 1.0 : 0.0; } } //逆行列を計算する for (i = 0; i < n; i++) { buf = 1 / A[i][i]; for (j = 0; j < n; j++) { A[i][j] *= buf; inv_A[i][j] *= buf; } for (j = 0; j < n; j++) { if (i != j) { buf = A[j][i]; for (k = 0; k < n; k++) { A[j][k] -= A[i][k] * buf; inv_A[j][k] -= inv_A[i][k] * buf; } } } } //行列の積 for (i = 0; i < n; i++) { term = 0; for (k = 0; k < n; k++) { term = term + inv_A[i][k] * B[k]; } C[i] = term; } //結果の出力 for (i = 0; i < n; i++) { std::cout << C[i] << " "; } std::cout << std::endl;
【今回使ったデータセット】
https://gitlab.com/-/snippets/2163095/raw/main/sample.txt?inline=false
【結果】
13.0000 22.0148 -10.0188
VSCodeでPythonコードが実行できない対処法
原因:VSCodeがpython.exeのパスを読めていない.
対処法:設定ファイルを開きたい.以下の順に開いていき,jsonファイルを開く.
File->Preferences->Setting->OpenSetting
{ "files.encoding": "shiftjis", "workbench.editorAssociations":{ "*.ipynb"."jupyter-notebook" } }
こんな感じのjsonファイルを開いて,以下を追加
"python.pythonPath":"C:\\Users\\name\\AppData\\Local\\Programs\\Python37\\python.exe" //nameは自分のusernameを使う
IrfanView おすすめの設定
「IrfanView」定番の画像ビューワー - 窓の杜
IrfanViewはpngやjpgを開くのにおすすめのソフトフェアである.
しかし,初期設定では画像を最後まで開くと,
こんな感じで毎回聞かれるためだるい.
そこで,画像送りをループ設定にするとよい.
Options->Properties/Setting->Browising/Editingを開き,Loop current folderにチェック.
C/C++ filesystem ディレクトリから指定拡張子をvectorに詰める
pythonのglob関数をC/C++で使いたい.
それができるといわれる"glob.h"なるものがあるらしい.しかし,それはLinuxのライブラリらしくWindowsでは使えそうになかった.(私の知識不足感は否めない)そこで,filesystemと呼ばれるライブラリでも同じようにglob的なことができるようだ.
本記事では,ディレクトリからpngファイルを取得し,vectorに詰めるコードを記す.
#include <iostream> #include <string> #include <vector> #include <filesystem> int main() { std::string dir_name = "C:/Users/MEK/test"; std::vector<std::string> files; std::filesystem::path dir_path(dir_name); //例外処理 if (!std::filesystem::is_directory(dir_path)) { std::cout << "No Dir" << std::endl; return -1; } //pngファイルをvectorに詰める auto dir = std::filesystem::directory_iterator(dir_path); for (auto& p : dir) { std::string pathname = p.path().string(); if (pathname.find(".png") != std::string::npos) { std::cout << p.path().string() << std::endl; files.push_back(pathname); std::cout << std::endl; } } }
注意事項
VisualStudio2019では,プロジェクトプロパティの全般からC++標準をC++17にする必要がある.