Python: Python-Controlのインストール

Python-ControlをAnacondaへインストール。MATLAB互換機能がこんなに簡単にPythonで使えるようになっているとは思わなかった。

>conda install -c conda-forge control slycot
Collecting package metadata (current_repodata.json): done
Solving environment: done

## Package Plan ##

  environment location: C:\Users\oshiro\Anaconda3

  added / updated specs:
    - control
    - slycot


The following packages will be downloaded:

    package                    |            build
    ---------------------------|-----------------
    ca-certificates-2020.4.5.2 |       hecda079_0         184 KB  conda-forge
    certifi-2020.4.5.2         |   py37hc8dfbb8_0         152 KB  conda-forge
    clangdev-5.0.0             |          flang_3       189.0 MB  conda-forge
    conda-4.8.3                |   py37hc8dfbb8_1         3.1 MB  conda-forge
    control-0.8.3              |           py37_1         350 KB  conda-forge
    libblas-3.8.0              |8_h8933c1f_netlib         188 KB  conda-forge
    libcblas-3.8.0             |8_h8933c1f_netlib          88 KB  conda-forge
    libflang-5.0.0             |h6538335_20180525         519 KB  conda-forge
    liblapack-3.8.0            |8_h8933c1f_netlib         2.7 MB  conda-forge
    openmp-5.0.0               |           vc14_0         576 KB  conda-forge
    python_abi-3.7             |          1_cp37m           4 KB  conda-forge
    slycot-0.4.0.0             |   py37h9a9bad4_1         1.2 MB  conda-forge
    ------------------------------------------------------------
                                           Total:       198.0 MB

The following NEW packages will be INSTALLED:

  clangdev           conda-forge/win-64::clangdev-5.0.0-flang_3
  control            conda-forge/win-64::control-0.8.3-py37_1
  libblas            conda-forge/win-64::libblas-3.8.0-8_h8933c1f_netlib
  libcblas           conda-forge/win-64::libcblas-3.8.0-8_h8933c1f_netlib
  libflang           conda-forge/win-64::libflang-5.0.0-h6538335_20180525
  liblapack          conda-forge/win-64::liblapack-3.8.0-8_h8933c1f_netlib
  openmp             conda-forge/win-64::openmp-5.0.0-vc14_0
  python_abi         conda-forge/win-64::python_abi-3.7-1_cp37m
  slycot             conda-forge/win-64::slycot-0.4.0.0-py37h9a9bad4_1

The following packages will be UPDATED:

  ca-certificates     pkgs/main::ca-certificates-2020.1.1-0 --> conda-forge::ca-certificates-2020.4.5.2-hecda079_0
  certifi              pkgs/main::certifi-2020.4.5.1-py37_0 --> conda-forge::certifi-2020.4.5.2-py37hc8dfbb8_0
  conda                       pkgs/main::conda-4.8.3-py37_0 --> conda-forge::conda-4.8.3-py37hc8dfbb8_1

The following packages will be SUPERSEDED by a higher-priority channel:

  openssl                                         pkgs/main --> conda-forge


Proceed ([y]/n)? y


Downloading and Extracting Packages
openmp-5.0.0         | 576 KB    | ############################################################################ | 100%
clangdev-5.0.0       | 189.0 MB  | ############################################################################ | 100%
certifi-2020.4.5.2   | 152 KB    | ############################################################################ | 100%
ca-certificates-2020 | 184 KB    | ############################################################################ | 100%
python_abi-3.7       | 4 KB      | ############################################################################ | 100%
libcblas-3.8.0       | 88 KB     | ############################################################################ | 100%
conda-4.8.3          | 3.1 MB    | ############################################################################ | 100%
liblapack-3.8.0      | 2.7 MB    | ############################################################################ | 100%
control-0.8.3        | 350 KB    | ############################################################################ | 100%
slycot-0.4.0.0       | 1.2 MB    | ############################################################################ | 100%
libblas-3.8.0        | 188 KB    | ############################################################################ | 100%
libflang-5.0.0       | 519 KB    | ############################################################################ | 100%
Preparing transaction: done
Verifying transaction: done
Executing transaction: done

コード例

from control import matlab                   # MATLAB互換モジュールの読み込み
import numpy as np                           # 数値計算モジュールの読み込み
from matplotlib import pyplot as plt         # グラフ描画モジュールの読み込み

sys1 = matlab.tf([0, 0, 1], [0.1, 0.1, 1.0]) # 伝達関数の設定(分子、分母多項式)
y1, t1 = matlab.step(sys1, T = np.arange(0, 10, 0.01))  # ステップ応答の算出(t=0~10)
plt.plot(t1, y1)                                        # 応答描画

bd = matlab.bode(sys1)                       # ボード線図の描画


リンク

常用対数の近似値の算出

対数は「底$x$の値を何乗したら$z$になるか?」の指数を求めるもの、指定するものと捉える。
$z=x^y$での$y$を知りたい場合に$y=\log_{x}z$と書く。

常用対数は、対数の底が10のもの。
(※自然対数は対数の底がeのもの。${\rm e}^x$は微分しても${\rm e}^x$のままなので便利)

$\log_{10} 1 = 0, (10^0=1)$
$\log_{10} 2 \fallingdotseq 0.3$

$\log_{10} 2^{10}=\log_{10} 1024\fallingdotseq \log_{10} 1000=\log_{10}10^3=3\log_{10}10=3\cdot 1=3$

$\Rightarrow 10\log_{10}2\fallingdotseq3 \Rightarrow \log_{10}2\fallingdotseq \displaystyle\frac{3}{10}=0.3$

$\log_{10}3\fallingdotseq 0.475, (10^{0.5}=\sqrt{10}\fallingdotseq \sqrt{9}=3)$

$\log_{10}3^4=\log_{10}(9\cdot 9)=\log_{10}{81}\fallingdotseq \log_{10}80=\log_{10}(2^3\cdot 10) \Rightarrow 3\log_{10}2 + \log_{10}10 \fallingdotseq 3\cdot 0.3 + 1 = 1.9$
$\Rightarrow 4\log_{10}3\fallingdotseq 1.9 \Rightarrow \log_{10}3\fallingdotseq\displaystyle\frac{1.9}{4}=0.475$

$\log_{10}4\fallingdotseq 0.6$

$\log_{10}4=\log_{10}2^2=2\log_{10}2\fallingdotseq 2\cdot0.3=0.6$

$\log_{10}5\fallingdotseq 0.7$

$\log_{10}5=\log_{10}\displaystyle\frac{10}{2}=\log_{10}10-\log_{10}2\fallingdotseq 1-0.3 = 0.7$

$\log_{10}6\fallingdotseq 0.775$

$\log_{10}6=\log_{10}(2\cdot 3)=\log_{10}2 + \log_{10}3\fallingdotseq 0.3 + 0.475 = 0.775$

$\log_{10}7=0.85$

$\log_{10}7^2=\log_{10}49\fallingdotseq \log_{10}50 = \log_{10}(5\cdot10) = \log_{10}5+\log_{10}10\fallingdotseq 0.7+1$
$\Rightarrow 2\log_{10}7\fallingdotseq 1.7 \Rightarrow \log_{10}7\fallingdotseq \displaystyle\frac{1.7}{2}=0.85$
高精度版)
$\log_{10}7^4=\log_{10}2401\fallingdotseq \log_{10}2400 = \log_{10}(24\cdot100) = \log_{10}8+\log_{10}3+\log_{10}100$
$=\log_{10}2^3+\log_{10}3+\log_{10}10^2=3\log_{10}2+\log_{10}3+2\log_{10}10\fallingdotseq 3\cdot 0.3 + 0.475 + 2\cdot 1.0=3.375$
$\Rightarrow4\log_{10}7=3.375\Rightarrow\log_{10}7\fallingdotseq 3.375/4=0.84375\fallingdotseq 0.844$

$\log_{10}8\fallingdotseq 0.9$

$\log_{10}8=\log_{10}2^3=3\log_{10}2\fallingdotseq 3\cdot 0.3 = 0.9$

$\log_{10}9\fallingdotseq 0.95$

$\log_{10}9=\log_{10}3^2=2\log_{10}3\fallingdotseq 2\cdot 0.475=0.95$
高精度版)
$\log_{10}9^7=\log_{10}4782969\fallingdotseq \log_{10} 4800000 = \log_{10} (6\cdot 8\cdot 10^5) = \log_{10} 6 + \log_{10} 8 + \log_{10} 10^5$
$= 0.775 + 0.9 + 5.0=6.675$
$\Rightarrow 7\log_{10}9=6.675 \Rightarrow \log_{10}9 \fallingdotseq 6.675/7=0.9537\cdots\fallingdotseq 0.954$

$\log_{10}10=1, (10^1=10)$

おまけ:$\log_{10}11\fallingdotseq 1.04$

$\log_{10}11^5=\log_{10}161051\fallingdotseq \log_{10}160000=\log_{10}2^4\cdot10^4=4(\log_{10}2+\log_{10}10)\fallingdotseq 4(0.3+1.0)$
$\Rightarrow 5\log_{10}11=4\cdot1.3\Rightarrow \log_{10}11\fallingdotseq \displaystyle\frac{4}{5}1.3=0.8\cdot 1.3=1.04$

この近似をプロットすると下図のようになる。$\log_{10}7$と$\log_{10}9$は他に比べて誤差が大きいので、高精度版を赤色として示した。

1 2 3 4 5 6 7 8 9 10
近似値 0 0.3 0.475 0.6 0.7 0.775 0.85 0.9 0.95 1
真値 0.000 0.3010 0.4771 0.6021 0.6990 0.7782 0.8451 0.9031 0.9542 1.000
誤差 0 0.0010 0.0021 0.0021 0.0010 0.0032 0.0049 0.0031 0.0042 0

観察

  • 1~10で、$\log_{10}$は0~1になる。
  • 3で$\log_{10}$は約0.45で、ざっくり半分に到達する。
  • 2は$\log_{10}$は約0.3で、$4=2^2$, $8=2^3$だと$\log_{10}$はそれぞれ2,3倍の約0.6,0.9となる。8の際に既にほぼ1に近いことに注意。
  • 5は10/2で、$\log_{10}$は$1-\log_{10}2$となるので約0.7。1と10の両端側からの距離でいうと2の場合と同じで約0.3。
  • 倍になると、対数では同じだけ増加する。
    例)
    $\log_{10}2=0.3\stackrel{\times 2}{\longrightarrow}\log_{10}4=0.6\stackrel{\times 2}{\longrightarrow}\log_{10}8=0.9$,
    $\log_{10}3=0.475\stackrel{\times 3}{\longrightarrow}\log_{10}9=0.95$,
    $\log_{10}5=0.7\stackrel{\times 2}{\longrightarrow}\log_{10}10=1.0$
    $\log aM=\log a + \log M$より、$a$倍されていれば、$\log a$分だけ増加する(割れば$\log a$だけ減少する)。$\rightarrow$掛け算・割り算が同じ距離の変化になる。

  • 2で割ると$\log_{10}$では0.3減少するので、これを用いると

    $\log_{10}3/2(=\log_{10}1.5)\fallingdotseq 0.475-0.3=0.175$
    $\log_{10}5/2(=\log_{10}2.5)\fallingdotseq 0.7-0.3=0.4$
    $\log_{10}7/2(=\log_{10}3.5)\fallingdotseq 0.85-0.3=0.55$
    $\log_{10}9/2(=\log_{10}4.5)\fallingdotseq 0.95-0.3=0.65$

    となる。1/2も求めてみると、

    $\log_{10}1/2(=\log_{10}0.5)\fallingdotseq 0-0.3=-0.3$

    となる。

    $\log_{10}0.5=\log_{10}\displaystyle\frac{5}{10}=\log_{10}5-\log_{10}10\fallingdotseq 0.7-1=-0.3$

    でも結果は同様。

参考リンク

Zoom:バーチャル背景用の単色系の背景画像を作った

新型コロナウィルスの対応で会議や講義にZoomを使うことになってきたが、そのままだと部屋が映り込みまくる。

バーチャル背景の機能も優秀でスクリーンなしでも背景を置き換えてくれるようだが、そのままだと元から用意されている背景画像が、宇宙やらビーチやら壮大、軽快過ぎてちょっと会議等の状況にそぐわない。

単なる単色も用意しておいてくれたらよかったが、それはないのでいくつか自前で作成することにした。

とはいえ、単なる単色だけだと味気ないので、ほんのりグラデーションを入れた。左側を少し明るめで右側を暗めにするほうがいいみたい。

グラデーション生成にはInkscapeを使った。

バーチャル背景の設定は、画面上部右端のプロフィールボタンから、設定⇒バーチャル背景と選び、任意の画像を指定する。

このとき、設定下部の「グリーンスクリーンがあります。」がオンとなっていると、合成用のスクリーンがある前提での動作になってしまうので、スクリーンを使わない場合はこれは外しておく。

Zoomは脆弱性等が問題山積みになっているようだが、今のところ一択ツール。なんとか修正・改善されて無事に使えますように…。

どこまで使い物になるか不明だが、同種のオープンソースツールもある。

あと、Zoomの紹介動画をいくつか。


A6とハガキの用紙サイズの違い

前にハガキに印刷しようとしていて、普通紙を使ってまずはテストをしようと、A4用紙を折って切っていったらだいたいそれっぽいサイズになったのだが、微妙に違う。

A4用紙の折り方か、切り方を間違えたのかと思ったが、やっぱり違う。

調べるとA4を2回半分にしたA6用紙のサイズは105x148mmで、ハガキは100x148mmだった。この5mmの違いは何!?

と思ったのだが、ハガキのサイズは万国共通(万国郵便連合)で決まっているとのこと。

サイズを入れた比較図をパワポでのマウス操作で作ってもみたが、どうせならと手入力SVGで作成してみた。



ほぼ、単に四角を2つ並べるだけだから(初心者でも)簡単だろうと思ったらけっこう手こずったわ…。(かくして、この記事に続く…⇒MDN文書の翻訳

[おまけ]
あと、WordPressにSVGをアップロードしようとしたらセキュリティ関連で蹴られて、プラグインを入れて対応した。プラグインは探すといくつか出てきたのだが、とりあえずSVG Supportを入れてみた。

MDN文書の翻訳

SVGで簡単な図形を描こうとしていたら、思いのほか手こずってMDNの翻訳作業にまでたどり着いてしまった。

翻訳作業をしやすくするユーザスクリプトがあって、基本単語の自動翻訳(置換)などを自動化してくれるらしく、FirefoxでもTampermonkey1) を使えばインストールできて動作ししそうな記述があるのだが、インストールはできて英語版のリビジョン取得くらいはできるのだが、バージョンが古くなってしまったのか、Firefoxへの対応がうまくいっていないのか動作しないみたい。

1) これまで「Tempermonkey」かと思っていたが、「Tamper(改ざん)monkey」だった。

MDN文書には EmbedLiveSample のしくみがあって、スクリプトの動作例を埋め込めて、実際に多数の動作例が既に存在しているのだが、そのサンプルのBlockIDに相当する<h2>タグなどのidがサイト側への保存時に勝手に翻訳したタイトルに合わせて日本語になってしまうので、これに(アドホックに)対処するには現状ではname属性も併記することしかないらしい。(もちろん、日本語に書き換えられたhタグのidに合わせてライブサンプルのBlockIDも日本語にしても動作するが、統一性がなくなるのでよくないですな。)

上記した翻訳援助スクリプトだと、このnameタグ付けも自動化する機能があるようだが、残念ながら動作しなかった。

あと、MDNでのブラウザ上のエディタだと「自動保存しました」などと出てくるが、その保存データの復帰方法が分からない。うっかり別ページを表示させたりすると、それまで作業していたデータが消えてなくなってイチからの作業し直しになってしまう。かといって、毎回保存してしまうと、保存のたびにリビジョンが増えるしその状況で公開状態になってしまう。GitHubも関連している風なのだが、自前保存で作業しておき、ある段階でまとめて更新とかできんのか?

細かいリビジョンが多数発生した際に、ひとまとめにできないかとも問い合わせてみたが、そういう機能はないとのことだった。