自分のブログ名

物理の空き地 by M.E_K

日々の学び、感じたことを書いております。ブログ移行中->https://physics-mek.com

移転しました。

リダイレクトします。

python glob関数 ディレクトリ操作・ファイル操作

import glob
Directory = glob.glob("相対パスor絶対パス")
#globはリスト型で格納される

1つのfileを操作するだけならばpyfileを同じ階層に保存すればよいが、
操作したいfileの数が多ければ、glob関数を使ってディレクトリ操作をするとよい。

glob関数はディレクトリだけでなく、ファイルもリスト型に格納できる。

Files = glob.glob("../*.txt")
#*.txtによって.txtと名の付くファイルを全てリスト型に格納する

C++ Python 計算速度比較

はじめに

C++はよく計算が速いといわれ、Pythonは速度は出ないが対話的にコーディングが出来るといわれる気がする。C++が本当に速いかどうか、きになったので比較してみた。

評価手法

for文で10億回足し合わせる計算をPythonC++で同じ計算をした。
計測時間はmsecの分解能で測定した。
python

import time
x = 0
start_time = time.time()
for i in range(0,100000000):
    x +=1
elapsed_time = time.time()-start_time

C++

#include <iostream>
#include <chrono>
#include <stdio.h>
using namespace std;

int main()
{
    chrono::system_clock::time_point start, end;
    start = chrono::system_clock::now();
    int x = 0;
    for (int v = 0;v < 100000000;v++)
    {
        x +=1;
    }
    end = chrono::system_clock::now();
    double time = static_cast<double>(chrono::duration_cast
        <chrono::microseconds>(end - start).count()/1000.0);
}

使用スペック

CPU Intel(R) Core(TM) i5-7200U CPU @ 2.50 GHz
メインメモリ 8GB LPDDR3 SDRAM
結果
Python [sec] 27.126 25.162 27.291
C++ [sec] 0.000 0.000 0.000

Python = 26.526\pm1.184 sec
C++ = 0.000\pm0.000 sec

分かったこと

C++が爆速だということが分かった。CPU使用率やメモリ使用率にも依存するので正直正確には比べられないが、誤差の3\sigma以内でC++の方が速いことが分かる。C++が速い理由として、pythonではx = 0と置くのに対し、C++ではint x = 0とかく。C++は先に変数の型を決め、占有するメモリ量を宣言するが、pythonでは変数を自由な型で受けつけ、その分メモリ量を確保しているからだと私は考えている。あくまで推測なので、詳しくわかる人がいたらコメントしていただきたい。

単純な足し合わせでもpythonは時間がかかる。計算速度を求める場合、pythonではなくC++の方が圧倒的に良いだろう。

microsoft wordのバグ??

wordで数式ツールを使って、シンボルをつけるときに文字によってつくシンボルが変わるバグを発見した。

数式のショートカット\barを使うとオーバーラインのアクセントがつく。

しかし、y_4には横棒がつく。
その他のy_1y_8はオーバーラインがつくのだが、y_4は横棒になる。

そのほかに横棒になるものも探してみた。
T,O,vがオーバーラインにならず、横棒になる。
f:id:Monster_K:20201116170601p:plain

アクセントを平均の意味として用いる場合、統一していないととても恥ずかしいのでしっかりと統一するようにしよう。
f:id:Monster_K:20201116170406p:plain
先に枠だけ作る形になるので、バグに見舞われることもないだろう。

有効数字のすゝめ

はじめに

有効数字は多くの人が苦手意識を持つ。それは手法として覚えているからだと私は思う。そのため、物理的観点から理論として理解する。

有効数字(有効桁数)

信じることのできる桁数のことをさす。また、測定器が出せる分解能のことを指して、同様に用いることがある。

数字として信じられる有効桁数は以下の様になる。

測定データ 20.0 1441 5.14425 0.0004 1.342\times10^3
有効桁数 3ケタ 4ケタ 6ケタ 1ケタ 4ケタ

次に、測定器の分解能として信じてよい小数点以下の有効桁数は以下の様になる。

測定データ 20.0 1441 5.14425 0.0004 1.342\times10^3
小数点以下の有効数字 1ケタ 0ケタ 5ケタ 5ケタ 3ケタ

小数点以下の有効桁数とは、どこまで細かく測定できるかを見る桁数のことだ。

有効数字の四則演算

下のような実験があった場合を想定してやってみる。この緑と青の面積を求める。
f:id:Monster_K:20201115182743j:plain

O [m] X [m] Y [m]
0.521 157.0 156.50

0.521\ \mathrm{m} + 157.0\ \mathrm{m}\ =\ 157.521\ \mathrm{m}
計算の前と後で扱っている物理量(単位)が変わらない。そのため、測定の分解能の粗さで考えればよいだけだ。よって、小数点以下有効桁数1桁に合わせて
横=157.5\ \mathrm{m}となる。

加算、減算のような物理量(単位)が変わらない計算の場合は、小数点以下の有効桁数が一番粗いものに合わせればよい。物理量が変わらないので、計算後に分解能が高くなるのはおかしいと考えられるはずだ。

面積

157.5\ \mathrm{m} \times 156.50\ \mathrm{m} = 24648.75\  \mathrm{m^2}
計算の前後で物理量(単位)が変わっている。つまり、測定器では直接求められない。そのため、数字の有効桁数で考えればよく、有効桁数を4桁に合わせて、
面積=2.465\times10^4\ \mathrm{m^2}となる。

物理量(単位)が変わる場合、数字のもつ有効桁数が一番粗いものに合わせればよい。物理量が変わるので、測定器の分解能を考慮する必要はない。

発展
156.0 120.4 80.3 40.9 9.0

同じ測定器で条件を変えながら測定し、上のようなデータが取れたとする。この場合の有効数字を考える。
同じ測定器なので、小数点以下の有効桁数は変わらない。そこで、以下の様にする。

156.0 120.4 080.3 040.9 009.0

本来は見えない数字をあえて、露出することで有効桁数を合わせることが出来る。また、その測定器の持つ粗い有効桁数を示すことが出来るため、物理的意味も持った数字として扱うことが出来る。しかし、レポートでは、このように書くことはおかしいので、計算の都合上、表しているだけだということは理解しておきたい。

誰にでも見せられるグラフ

f:id:Monster_K:20201107122226p:plain
系列を増やしたグラフを作成する時、おそらく多くの人がこのようなグラフを書くだろう。
しかし、このグラフは白黒にした時、色盲の人が見た時、どういったグラフに見えるのだろうか。
f:id:Monster_K:20201107122454p:plain
白黒にするとこうだ。これではせっかくの系列を分けたグラフが読み取りづらく、読み手にストレスを与える。
そこで、一工夫を加える。それはマーカーの形を変えることだ。
f:id:Monster_K:20201107122655p:plain
このように変えることで、白黒になったとしても、色盲の方が読んだとしても伝えたいことをダイレクトに伝えれられる。

Excelでのマーカーの変え方

f:id:Monster_K:20201107231706j:plain
グラフツールの書式設定で系列の書式設定を表示する。
f:id:Monster_K:20201107231703j:plain
上のような書式設定から、マーカーのオプションを自動から組み込みに変え、マーカーの形やサイズを変えられる。

近似曲線の求め方~三角関数の二乗~

はじめに

y=a+bx

のような関数は微・積分が非常に楽で最小二乗法で面倒な作業計算を必要としない。

y=a\cos\{x+b\}+c

上の三角関数を含むような式における最小二乗法は微・積分によって\sin\cosを繰り返すため計算が煩雑になる。偏光実験における近似曲線の求め方を備忘録として記録した。関数は以下の関数だ。

y=a\cos^2{\{x+b\}}+c

パラメータの導出

y=A\cos2x-B\sin2x+C\cdots①とすると、
A=\frac{a}2\cos2bB=\frac{a}2\sin2bC=\frac{a}2+c\cdots②となり
a=\pm2\sqrt{A^2+B^2}b=\frac1 2\tan^{-1}\frac{B}Ac=C-\frac a 2\cdots③となる。
ここの式変形は倍角の公式やらを駆使すればできる。ぜひ自分の手で解いてみてほしい。

さらに、

f(x)=\cos2xg(x)=\sin2xh(x)=1とすると、

y=Af(x)-Bg(x)+Ch(x)となる。
ここまでくれば,\sin\cosが出てこないので,後は3変数の最小二乗法をやるだけである.


S=\sum^{i=-90}_{i=90}\{y_i-(Af(x_i)-Bg(x_i)+Ch(x_i))\}^2が最小となるA、B、Cを求める。

\frac{\partial S}{\partial A}=-2\sum^{i=-90}_{i=90}\{y_i-(Af(x_i)-Bg(x_i)+Ch(x_i))\bullet f(x)\}=0
\frac{\partial S}{\partial B}=-2\sum^{i=-90}_{i=90}\{y_i-(Af(x_i)-Bg(x_i)+Ch(x_i))\bullet g(x)\}=0
\frac{\partial S}{\partial C}=-2\sum^{i=-90}_{i=90}\{y_i-(Af(x_i)-Bg(x_i)+Ch(x_i))\bullet h(x)\}=0

\sum f(x)=[f]、\sum \{g(x)\bullet f(x)\}=[gf]のように簡易的に書き示すと、

\frac{\partial S}{\partial A}=[fy]-A[f^2]+B[fg]-C[hf]=0
\frac{\partial S}{\partial B}=[gy]-A[fg]+B[g^2]-C[hg]=0
\frac{\partial S}{\partial C}=[hy]-A[fh]+B[gh]-C[h^2]=0となり、この三式の行列を解けばABCが求まる。

論文や研究発表で考えるべき事

1.現在までに分かっていることは何か。

多くは研究背景と呼ばれるものだ。自分のやっていることの方向性が聞き手に理解できるよう、研究室の概要や自分の研究の大元を書く。

2.何を新しく知ろうとしているか。

自分の研究テーマの大元からもう少し深ぼった内容を書く。先輩の実験の引き継ぎをしている場合のような実験テーマを書く。

3.なぜこの仕事が重要か、何が面白いか。

自分の研究によって解明されること、また研究することで得られる結果の重要性を書く。この章では、自分が実際にやった研究の話をし、その研究が世の中になにをもたらすかを示す。つまり、ここが弱いということは自分の研究が意味のない研究であることを自分から示すことになる。聞き手に自分の研究の面白さを力説するように書く。

4.実際の仕事の結果として分かったことは何か。

これまでにやった研究成果を書く。解析手法や、評価手法などの実験方法からはじめ、その結果と考察を書く。自分の苦労話をするのではなく、それが実際にどういったことを世にもたらすかを書く。

(5.その結果がその分野で何をもたらすか)

本来は4章で書いたことが1章への解答であるべきだ。しかし、研究のすべてが世の利益となるものであるとは言えない。世の利益となる研究をするための研究だってあるわけだ。そんな時に、自分の成果がなにを自分の分野にもたらすかを書く。