Σa^2≧((Σa)^2)/nの証明

 n個の実数 a_1 a_2、…、 a_nがあるとき、
 \displaystyle \sum_{i=1}^n a_i^2 \geq \frac{1}{n} \left( \sum_{i=1}^n a_i \right)^2
が成り立つことを、数学的帰納法を用いて証明する。

1)  n=1の場合
 \displaystyle \sum_{i=1}^1 a_i^2 = a_1^2
また、
 \displaystyle \frac{1}{1} \left( \sum_{i=1}^1 a_i \right)^2 = \left( a_1 \right)^2 = a_1^2
よって、 k=1のとき、与えられた不等式は成り立つ。(常に等号成立)

2)  n=kの場合に、与えられた不等式が成り立つと仮定する。すなわち、
 \displaystyle \sum_{i=1}^k a_i^2 \geq \frac{1}{k} \left( \sum_{i=1}^k a_i \right)^2
が成り立つと仮定する。

このとき、
 \displaystyle \sum_{i=1}^{k+1} a_i^2
 \displaystyle = \sum_{i=1}^{k} a_i^2 + a_{k+1}^2
 \displaystyle \geq \frac{1}{k} \left( \sum_{i=1}^k a_i \right)^2 + a_{k+1}^2…①

ところで、 k \geq 1について、
 \displaystyle \frac{1}{k} = \frac{1}{k+1} + \frac{1}{k(k+1)}
が成り立つので、
 \displaystyle = \frac{1}{k+1} \left( \sum_{i=1}^k a_i \right)^2 + \frac{1}{k(k+1)} \left( \sum_{i=1}^k a_i \right)^2 + a_{k+1}^2…②
となる。

また、
 \displaystyle \frac{1}{k+1} \left( \sum_{i=1}^{k+1} a_i \right)^2
 \displaystyle = \frac{1}{k+1} \left( \sum_{i=1}^{k} a_i + a_{k+1} \right)^2
 \displaystyle = \frac{1}{k+1} \left( \sum_{i=1}^{k} a_i \right)^2 + \frac{2}{k+1} \left( \sum_{i=1}^{k} a_i \right) a_{k+1} + \frac{1}{k+1}a_{k+1}^2
なので、
 \displaystyle = \frac{1}{k+1} \left( \sum_{i=1}^{k+1} a_i \right)^2 + \frac{1}{k(k+1)} \left( \sum_{i=1}^k a_i \right)^2 + a_{k+1}^2
    \displaystyle - \frac{2}{k+1} \left( \sum_{i=1}^{k} a_i \right) a_{k+1} - \frac{1}{k+1}a_{k+1}^2
 \displaystyle = \frac{1}{k+1} \left( \sum_{i=1}^{k+1} a_i \right)^2 + \frac{1}{k(k+1)} \left( \sum_{i=1}^k a_i \right)^2  - \frac{2}{k+1} \left( \sum_{i=1}^{k} a_i \right) a_{k+1} + \frac{k}{k+1}a_{k+1}^2
 \displaystyle = \frac{1}{k+1} \left( \sum_{i=1}^{k+1} a_i \right)^2 + \frac{1}{k(k+1)} \left\{ \left( \sum_{i=1}^k a_i \right)^2  - 2k \left( \sum_{i=1}^{k} a_i \right) a_{k+1} + k^2 a_{k+1}^2 \right\}
 \displaystyle = \frac{1}{k+1} \left( \sum_{i=1}^{k+1} a_i \right)^2 + \frac{1}{k(k+1)} \left( \sum_{i=1}^k a_i - k a_{k+1} \right)^2
 \displaystyle \geq \frac{1}{k+1} \left( \sum_{i=1}^{k+1} a_i \right)^2
ゆえに、
 \displaystyle \sum_{i=1}^{k+1} a_i^2 \geq \frac{1}{k+1} \left( \sum_{i=1}^{k+1} a_i \right)^2が成り立ち、
 n=k+1のときも、与えられた不等式が成り立つ。

なお、等号成立条件は、
 \displaystyle \sum_{i=1}^k a_i = k a_{k+1}
のとき。すなわち、
 a_{k+1}が、 a_1から a_kまでの平均と等しいときである。


1)、2)より、数学的帰納法により、すべての自然数 nについて、
 \displaystyle \sum_{i=1}^n a_i^2 \geq \frac{1}{n} \left( \sum_{i=1}^n a_i \right)^2
は成り立つ。

等号成立条件は、 n-1以下のすべての自然数 kにおいて、
 a_{k+1}が、 a_1から a_kまでの平均と等しいときである。
これは、 k=1のときに
 a_2 a_1から a_1までの平均と等しい、すなわち、
 a_2 = a_1であることから、
 a_1 = a_2 = \cdots = a_n
を意味する。

繰り返しのある一元配置実験結果の単回帰分析方法(その2:2つの方法で導出される寄与率)

前回の記事では、繰り返しのある一元配置実験の結果に対して単回帰分析を行う際、データ処理の方法として2つの方法を紹介した。
いずれの方法であっても、得られる回帰直線式は同じであることを示した。
stacked-tip.hateblo.jp

分散分析や寄与率(決定係数) R^2は?

単回帰分析をする際には、回帰式の有意性を判断するために、分散分析結果や寄与率 R^2を確認する。
回帰直線式が同一であっても、分散分析結果や寄与率に差があると、実用上は解析結果の意味が変わってしまうことになる。

分散分析表は、以下のようにまとめる。

要因 平方和 S 自由度 \phi 平均平方 V  F_0
 R  S_R  \phi_R  V_R=S_R / \phi_R  V_R / V_e
 e  S_e  \phi_e  V_e=S_e / \phi_e
 S_T  \phi_T

ここで算出された F_0を、 F(\phi_R, \phi_e)_\alpha \alphaは危険率)と比較して、帰無仮説 H_0を棄却するかどうかを決める。

また、寄与率 R^2は次の式から算出する。
 \displaystyle R^2 = \frac{S_R}{S_T}

以下、2つの方法で分散分析結果や寄与率に差があるか確認する。
結論から言えば、2つの方法で、総平方和 S_Tに差がある。
また、自由度も異なるため、

 x_i y_{ij}をペアとする mn個のデータを用いる方法の場合

総平方和 S_Tは、
 \displaystyle S_T = S_{yy} = \sum_{i=1}^m \sum_{j=1}^n (y_{ij} - \bar y)^2 = \sum_{i=1}^m \sum_{j=1}^n y_{ij}^2 - \frac{1}{mn}(\sum_{i=1}^m \sum_{j=1}^n y_{ij})^2
となる。これは、さらに式変形することで、
 \displaystyle S_T = \sum_{i=1}^m \sum_{j=1}^n y_{ij}^2 - mn \bar y^2
となる。
また、回帰による平方和 S_Rは、
 \displaystyle S_R = \frac{{S_{xy}}^2}{S_{xx}}
であり、残差平方和 S_e
 \displaystyle S_e = S_T - S_R
で求めることができる。
これらの平方和の自由度は、それぞれ
 \phi_T = mn - 1
 \phi_R = 1
 \phi_e = \phi_T - \phi_R = mn - 2
である。

 x_i \overline{y_i}をペアとする m個のデータを用いる方法の場合

前節の各統計量と区別するため、それぞれにダッシュ(プライム)を付けて表記する。
総平方和 {S_T}'は、
 \displaystyle {S_T}' = {S_{yy}}' = \sum_{i=1}^m (\overline{y_i} - \bar y)^2 = \sum_{i=1}^m \overline{y_i}^2 - \frac{1}{m}(\sum_{i=1}^m \overline{y_i})^2
となる。これは、さらに式変形することで、
 \displaystyle {S_T}' = \sum_{i=1}^m \overline{y_i}^2 - m \bar y ^2
となる。
また、回帰による平方和 {S_R}'は、
 \displaystyle {S_R}' = \frac{{{S_{xy}}'}^2}{{S_{xx}}'}
であり、残差平方和 {S_e}'
 \displaystyle {S_e}' = {S_T}' - {S_R}'
で求めることができる。
これらの平方和の自由度は、それぞれ
 {\phi_T}' = m - 1
 {\phi_R}' = 1
 {\phi_e}' = {\phi_T}' - {\phi_R}' = m - 2
である。

ここまでの結果を表にまとめて比較する。

統計量 方法1 方法2
総平方和  \displaystyle S_T = \sum_{i=1}^m \sum_{j=1}^n y_{ij}^2 - mn \bar y^2  \displaystyle {S_T}' = \sum_{i=1}^m \overline{y_i}^2 - m \bar y ^2
回帰による平方和  \displaystyle S_R = \frac{{S_{xy}}^2}{S_{xx}}  \displaystyle {S_R}' = \frac{{{S_{xy}}'}^2}{{S_{xx}}'}
残差平方和  \displaystyle S_e = S_T - S_R  \displaystyle {S_e}' = {S_T}' - {S_R}'

ここで、以下の不等式が成り立つことを利用する。

 n個の実数 a_1 a_2、…、 a_nがあるとき、
 \displaystyle \sum_{i=1}^n a_i^2 \geq \frac{1}{n} \left( \sum_{i=1}^n a_i \right)^2
が成り立つ。

証明は、以下の記事を参照のこと。
stacked-tip.hateblo.jp

この不等式を用いると、
 \displaystyle \sum_{j=1}^n y_{ij}^2 \geq \frac{1}{n} \left( \sum_{j=1}^n y_{ij} \right)^2
が成り立つことがわかる。

これを用いると、
 \displaystyle S_T - n{S_T}'
 \displaystyle = \left(\sum_{i=1}^m \sum_{j=1}^n y_{ij}^2 - mn \bar y^2 \right) - n \left( \sum_{i=1}^m \overline{y_i}^2 - m \bar y ^2 \right)
 \displaystyle = \sum_{i=1}^m \sum_{j=1}^n y_{ij}^2 - n \sum_{i=1}^m \overline{y_i}^2
 \displaystyle = \sum_{i=1}^m \sum_{j=1}^n y_{ij}^2 - n \sum_{i=1}^m \left( \frac{1}{n} \sum_{j=1}^n y_{ij} \right)^2
 \displaystyle = \sum_{i=1}^m \left\{ \sum_{j=1}^n y_{ij}^2 - \frac{1}{n} \left( \sum_{j=1}^n y_{ij} \right)^2 \right\} \geq 0
となり、
 \displaystyle S_T \geq n{S_T}'
が証明できる。

前回の記事で示した
 \displaystyle S_{xx} = n{S_{xx}}'
 \displaystyle S_{xy} = n{S_{xy}}'
を用いると、
 \displaystyle S_R = \frac{{S_{xy}}^2}{S_{xx}} = \frac{({nS_{xy}}')^2}{{nS_{xx}}'} = n \frac{{S_{xy}}'^2}{{S_{xx}}'} = n {S_R}'
となる。寄与率は、
 \displaystyle R^2 = \frac{S_R}{S_T} \leq \frac{n{S_R}'}{n{S_T}'} = {R^2}'
となり、
 \displaystyle R^2 \leq {R^2}'
であることがわかる。

繰り返しのある一元配置実験結果の単回帰分析方法(その1:2つの方法で導出される回帰直線式)

繰り返しのある一元配置実験を行うとする。
水準が x_1 x_1、…、 x_mの合計 m個あり、
それぞれについて n回繰り返し評価を行った結果、
 y_{11} y_{12}、… y_{1n} y_{21} y_{22}、…、 y_{mn}
の、合計 mn個の結果を得たとする。
また、各水準の結果の平均 \displaystyle \overline{y_i}=\frac{1}{n}\sum_{j=1}^{n}y_{ij}を計算する。

表にまとめると以下のようになる。

1回目 2回目 n回目 平均
 x_1  y_{11}  y_{12}  y_{1n}  \overline{y_1}
 x_2  y_{21}  y_{22}  y_{2n}  \overline{y_2}
 x_m  y_{m1}  y_{m2}  y_{mn}  \overline{y_m}

今、 xを説明変数、 yを目的変数とする単回帰分析を行いたい。
モデル式を y_{ij}=\mu_i +  \varepsilon_{ij}とし、 \varepsilon_{ij}は互いに独立に N(0, \sigma^2)に従うこととする。

このとき、単回帰分析の方法として、

  1.  x_i y_{ij}をペアとする mn個のデータを用いる方法
  2.  x_i \overline{y_i}をペアとする m個のデータを用いる方法

の2種類の方法が考えられる。

この2種類の方法にはどのような違いがあるのかを確認する。

なお、本記事は、永田靖『入門 統計解析法』を大いに参考にしています。

母回帰係数の推定値 \hat \beta_1

母回帰係数 \beta_1の推定値 \hat \beta_1について考える。
 \hat \beta_1は、 x yの偏差積和 S_{xy}と、 xの偏差平方和 S_{xx}を用いて、
 \displaystyle \hat \beta_1 = \frac{S_{xy}}{S_{xx}}で求めることができる。

 x_i y_{ij}をペアとする mn個のデータを用いる方法の場合

 \displaystyle \bar x = \frac{1}{m} \sum_{i=1}^m x_i \displaystyle \bar y = \frac{1}{mn} \sum_{i=1}^m \sum_{j=1}^n y_{ij}とすると、
 \displaystyle S_{xy} = \sum_{i=1}^m \sum_{j=1}^n (x_i - \bar x)(y_{ij} - \bar y) = \sum_{i=1}^m \sum_{j=1}^n x_i y_{ij} - \frac{1}{mn}(\sum_{i=1}^m \sum_{j=1}^n x_i)(\sum_{i=1}^m \sum_{j=1}^n y_{ij})
 \displaystyle S_{xx} = \sum_{i=1}^m \sum_{j=1}^n (x_i - \bar x)^2 = \sum_{i=1}^m \sum_{j=1}^n x_i^2 - \frac{1}{mn}(\sum_{i=1}^m \sum_{j=1}^n x_i)^2
となる。

 \displaystyle S_{xy}の各項について、さらに式変形をすると、
 \displaystyle \sum_{i=1}^m \sum_{j=1}^n x_i y_{ij} = \sum_{i=1}^m x_i \sum_{j=1}^n y_{ij} = n \sum_{i=1}^m x_i \overline{y_i}
 \displaystyle \frac{1}{mn}(\sum_{i=1}^m \sum_{j=1}^n x_i)(\sum_{i=1}^m \sum_{j=1}^n y_{ij}) = \frac{1}{mn} (mn \bar x)(mn \bar y) = mn \bar x \bar y
となるので、
 \displaystyle S_{xy} = n(\sum_{i=1}^m x_i \overline{y_i} - m \bar x \bar y)
となる。

また、 \displaystyle S_{xx}についてもさらに式変形をすることで、
 \displaystyle S_{xx} = n(\sum_{i=1}^m x_i^2 - m{\bar x}^2)
となる。

 x_i \overline{y_i}をペアとする m個のデータを用いる方法の場合

先述の S_{xy} S_{xx}と区別するため、それぞれにダッシュ(プライム)を付けて、 {S_{xy}}' {S_{xx}}'とする。
 \displaystyle {S_{xy}}' = \sum_{i=1}^m (x_i - \bar x)(\overline{y_i} - \bar y) = \sum_{i=1}^m x_i \overline{y_i} - \frac{1}{m}(\sum_{i=1}^m x_i)(\sum_{i=1}^m \overline{y_i})
 \displaystyle {S_{xx}}' = \sum_{i=1}^m (x_i - \bar x)^2 = \sum_{i=1}^m x_i^2 - \frac{1}{m}(\sum_{i=1}^m x_i)^2
それぞれを、さらに式変形することで、
 \displaystyle {S_{xy}}' = \sum_{i=1}^m x_i \overline{y_i} - m \bar x \bar y
 \displaystyle {S_{xx}}' = \sum_{i=1}^m x_i^2 - m{\bar x}^2
となる。

以上の計算から、
 \displaystyle S_{xy} = n{S_{xy}}'
 \displaystyle S_{xx} = n{S_{xx}}'
の関係があることがわかる。
したがって、どちらの場合であっても、 \hat \beta_1の値は同一にあることがわかる。

母切片の推定値 \hat \beta_0

母切片 \beta_0の推定値 \hat \beta_0は、
 \hat \beta_0 = \bar y - \hat \beta_1 \bar x
から算出される。
したがって、どちらの方法であっても \hat \beta_1の値が同一である以上、
 \hat \beta_0についても、どちらの方法であっても値は同一となる。

結論

母回帰係数、母切片ともに、どちらの方法で求めても同じ値が得られるということは、
これらの期待値 E[\hat \beta_1]、 E[\hat \beta_0]や分散 V[\hat \beta_1]、 V[\hat \beta_0]についても、
どちらの方法であっても同一である。

したがって、

  1.  x_i y_{ij}をペアとする mn個のデータを用いる方法
  2.  x_i \overline{y_i}をペアとする m個のデータを用いる方法

のどちらの方法であっても、得られる回帰直線式 y = \hat \beta_0 + \hat \beta_1 xは同じである。

続き
stacked-tip.hateblo.jp

自由度2重調整済み寄与率(R**2)って何者なの?

仕事で日科技研製の統計ソフト「JUSE-StatWorks」を使っていたら、重回帰分析の結果に3つの寄与率(決定係数)が出てきた。
私は、

  • 寄与率 R^2
  • 自由度調整済み寄与率 R^{*2}

の2つしか知らなかったので、 R^{**2}って一体…?となり、今回調べることとした。

自由度2重調整済み寄与率

 R^{**2}は、「自由度2重調整済み寄与率」と呼ぶそうだ。
日科技研がインターネットで定義を公開している。
寄与率等の算出について(PDF)

自由度2重調整済み寄与率 R^{**2}は、1976年に芳賀らが提唱した統計量である。
www.jstage.jst.go.jp

この論文では、

  • 重回帰分析のモデル式の良否を決める指標として残差平方和がある
  • しかし、残差平方和は説明変数を多くするほど小さくなるので、残差平方和を指標にモデル式を作ると、すべての説明変数を使用することになる。(この欠点は寄与率 R^2も同じである。)
  • また、残差平方和( R^2も)は、与えられたデータへの当てはまりが最良であることを保証するが、予測精度の良さは保証しない。

と、既存の指標を批判した上で、「予測精度を良くするための指標」の作成に焦点を当てている。
ここで紹介されている自由度2重調整済み寄与率 R^{**2}は、予測精度の良いモデル式を作成するための指標として提唱されている。

自由度2重調整済み寄与率に対する批判

一方で、自由度2重調整済み寄与率 R^{**2}について、永田は以下の論文で批判している。
www.jstage.jst.go.jp

永田はここで

自由度調整済み寄与率や自由度2重調製済み寄与率は変数選択の立場から導入されたものである.変数選択の観点からよい統計量であるかどうかと,母寄与率の点推定の観点からよい統計量であるかどうかは別の問題である.

と問題提起し、母寄与率の点推定の立場から、各統計量を比較している。
永田は本論文で

推定精度の観点からは,どのタイプの寄与率もサンプルサイズがかなり大きくないと信頼しにくい.
このことを念頭に入れた上でモデルの適合度の尺度として用いるのならば,バイアスの程度とMSEの観点からR*^<2+>を用いるのが一番望ましい.
R^2には重大な上側へのバイアスが存在する.
また,自由度2重調製済み寄与率R**^2やその修正寄与率R**^<2+>は下側へのバイアスが重大であり,MSEも他の寄与率に比べて大きいので母寄与率の点推定量として適切ではない.

と結論付け、母寄与率の点推定の観点からは自由度調整済み寄与率 R^{*2}が最良であるとしている。

ここまでの流れに加え、 R^{**2}が40年以上前に提唱された指標であるにも関わらず、

  • RやSPSS、エクセルのデータ分析において、 R^{*2}は採用されているが R^{**2}は採用されていないこと
  •  R^{**2}を採用している論文が少ないこと*1

を踏まえると、取り立てて R^{**2}を使う理由はないかな、と思います。

芳賀らも先述の論文の最後に

これはまた, MallowsのCp統計量やAkaikeの情報量, AIC基準とも結果的に一致する.

と書いているので(この文の「これ」が何を指しているのかがいまいち読み取れなかったが)、
それならAICを使えばいいのではないでしょうか。

自由度2重調整済み寄与率と赤池情報量規準AIC

芳賀らは、先述の論文の前書きで

重回帰分析において説明変数の数pが30以上にもなると, その中から最適な組を選ぶのは容易ではない.

と書いており、説明変数となる候補が膨大にある中で、どれを説明変数として採用してよいのか、モデル式の仮説が立てられない状況下を想定して議論を始めている。
そのような際によく用いられる指標は、赤池情報量規準AIC)である。
AICは文字通り赤池が1973年に発表した統計量である。これは芳賀らが R^{**2}を提案した3年前である。
ci.nii.ac.jp

世界的には、圧倒的にAICの方がメジャーである。RでもAICは求められる。

*1:2020年11月28日の時点で、Google Scholarで"自由度2重調整"でヒットした論文は31件。うち2件は、先述の芳賀らの論文と永田の論文である。土木や品質管理の分野に偏っており、重複する著者も数人見られた。

micro:bitで矩形波を出力してみる(その3:PWMモジュールを使ってみる)

micro:bit矩形波を出力してみるシリーズ、第3弾。
前回まではSleep関数を使って矩形波を出力しようとしていましたが、
どうやらメインループが回るときにオーバーヘッドがあるらしく、
精度の良い矩形波が出力されない、という結論でした。
stacked-tip.hateblo.jp
stacked-tip.hateblo.jp

何かないのかと調べていましたら、
どうやらmicro:bitはPWMモジュールを持っていることがわかりました。
sanuki-tech.net

これを使えば矩形波を出せるんじゃないか?
ということで、試してみました。

まずは、周期1ms、つまり1kHzでトライしてみます。
f:id:stacked-tip:20190929095724p:plain:w400

micro:bitでは「アナログ出力」がPWM出力を意味するようです。
うーん…と思ってしまいますが、まぁここは流しましょう。

「最初だけ」のブロックで、

  • アナログで出力する 端子P0 値512
  • アナログ出力 パルス周期を設定する 端子P0 周期(マイクロ秒) 1000

と書いていますが、実はこの順番が大事です。

2番目の

  • アナログ出力 パルス周期を設定する 端子P0 周期(マイクロ秒) 1000

というブロックは、P0がアナログ出力端子として使用されていない時は無視される仕様になっているらしいので、

  • まずP0をアナログ出力端子として使用する
  • それからパルス周期を変更する

の順で処理してあげる必要があります。
f:id:stacked-tip:20190929100303p:plain:w400
ブロックにカーソルを合わせると、その旨を注意するメッセージが表示されます(英語だけどね)。

オシロスコープに繋いて、波形を見てみましょう。
f:id:stacked-tip:20190929094150j:plain:w400

さて、結果です。
f:id:stacked-tip:20190929091623j:plain:w400
1ms周期の矩形波がちゃんとでています。
PWMモジュールを使えば綺麗な矩形波が出力できることが分かりました。

できるとわかったら、「どこまでできるのか」を調べたくなるのが技術者です。
パルス周期をどんどん短くしてみましょう。

次は一気に0.01ms=10us、周期にして100kHzです。
f:id:stacked-tip:20190929100936p:plain:w400

結果はこちら。
f:id:stacked-tip:20190929092854j:plain:w400
問題なく100kHzの矩形波が出力されています。

次は5us、周期にして200kHz。
f:id:stacked-tip:20190929101106p:plain:w400

結果はこのとおり。
f:id:stacked-tip:20190929093443j:plain:w400
200kHzの矩形波が出力されて…はいますが、
よく見るとDuty比が50%になっていませんね。
ハイレベルが2usとローレベルが3usで、併せて5usになっています。
2.5usという制御ができない、最小単位が1usということなのですかね?

では、2us、周期にして500kHzにしてみますか。
f:id:stacked-tip:20190929101549p:plain:w400

結果はこちら。
f:id:stacked-tip:20190929093734j:plain:w400
今度は大丈夫です。無事、Duty比50%の500kHz矩形波が出力されました。
どうやら最小単位が1usで、小数点以下は切り捨てられてしまうようです。

じゃぁ1us、周期にして1MHzは…たぶんでないんだろうけど。
f:id:stacked-tip:20190929101834p:plain:w400

結果はこうなる。
f:id:stacked-tip:20190929094058j:plain:w400
波形は出力されません。
0.5usが切り捨てられて0usになり、ハイレベル部分がなくなってしまったのでしょう。

というわけで、
micro:bit矩形波を出力したい場合は、

  • PWMモジュールを使用する
  • 最小単位は1usであることに注意する

で、実現できることがわかりました。

実際のところ、どれくらいの周波数なら使い物になるのでしょうか。
精度を定量化して、この記事を終えましょう。
f:id:stacked-tip:20190929111505p:plain:w400

精度の指標として、Hiレベル時間の、理想と実際との比率でみてみようと思います。
実際のHiレベル時間が、理想のHiレベル時間と近いほど、高精度であると言えますから、
この比率が100%に近いほど良いということになります。

f:id:stacked-tip:20190929112316p:plain:w400

精度はあるところでストンと落ちて、そこからじりじりと上がっていき、
100%になったところでまたストンと落ちる、となっています。
500kHzを超えると、理想のHiレベル時間が1usを切るので、精度は0%になってそのまま上がってきません。

f:id:stacked-tip:20190929112542p:plain:w400
100kHzまでで拡大してみました。
35kHzまでなら、95%以上の精度になります。
11kHzまでに限定すれば、99%以上の精度になります。
実用範囲は10kHzまで、というところでしょうかね。

micro:bitで矩形波を出力してみる(その2:Pythonエディター)

micro:bit矩形波を出力しようとしています。
前回はMakeCodeエディターでプログラミングしてみましたが、
今回はPythonエディターでプログラミングしようと思います。
stacked-tip.hateblo.jp

まずは1ms、周期にして500Hzの矩形波を出力してみます。
Pythonコードは以下のとおり。
f:id:stacked-tip:20190928225110p:plain:w400

結果はこちら。
f:id:stacked-tip:20190928221335j:plain:w400

うーん。時間が長いところと短いところがありますね。

f:id:stacked-tip:20190928221523j:plain:w400
f:id:stacked-tip:20190928221607j:plain:w400

短いところは1.1ms、長いところは4.9msですか。
この4.9msというのはループの処理なのでしょうか。

f:id:stacked-tip:20190928222024j:plain:w400
でも0.24msという変な場所もあるんですよね。
割り込み処理でも入っているのかな?

次は10ms、周期にして50Hzの矩形波を出力してみましょう。
Pythonコードは以下のとおり。
f:id:stacked-tip:20190928224813p:plain:w400

結果はこちら。
f:id:stacked-tip:20190928222732j:plain:w400
f:id:stacked-tip:20190928222858j:plain:w400
ぱっと見るといい感じ?と思いましたが、
12ms前後で揺れています。
2~4msの遅延が発生していますね。

Pythonエディターで組んでも、それくらいの遅延が発生してしまいます。

続き
micro:bitはPWM出力ができるようですよ。
stacked-tip.hateblo.jp

micro:bitで矩形波を出力してみる(その1:MakeCodeエディター)

折角オシロスコープを買ったので、
micro:bit矩形波を出力してみましょう。
stacked-tip.hateblo.jp

micro:bitは組込み現場で役に立つの?
もう少し具体的に言うと、
少なくともミリ秒(ms)レベルの制御をmicro:bitは可能なのか?
という検証も兼ねています。

まずはブロックでプログラミングをしてみました。
f:id:stacked-tip:20190928212539p:plain:w400
100ms周期でP0ピンをパタパタしているので、5Hzの矩形波が出力されているはずです。

結果はこちら。
f:id:stacked-tip:20190928205740j:plain:w400
f:id:stacked-tip:20190928205811j:plain:w400

立ち上がり後は102msの間隔で、まぁそんなものなのかな、という感じですが、
立ち下がり後は126msの間隔で、既に26%のずれ…これはいけませんネ。

続いてこちらのプログラミング。
f:id:stacked-tip:20190928212648p:plain:w400
0.5ms周期のパタパタなので、プログラミング上では1kHzの矩形波…ですが。

f:id:stacked-tip:20190928210403j:plain:w400
f:id:stacked-tip:20190928210601j:plain:w400

立ち上がり後は6msって、これがmicro:bitの限界なのかな(少なくともブロックプログラミングでは)。
立ち下がり後は30ms?メインループ終了後になんか重い処理が入っているのでしょうか。
そう言えば、最初の5Hzの時も、立ち下がり後に26msの遅延がありましたね。
ここにきっと何かの制御が入っているのでしょう。

というわけで、少なくともブロックプログラミングでmicro:bitを制御するのでは、
組込み現場では使い物にならなそうだということが分かりました。

シリアル通信(UART)をする程度なら使えるのかも知れませんね、今回は試していませんけど。


続き
今度はPythonエディターでやってみました。
stacked-tip.hateblo.jp