Android Studio: AndroidX対応

なぜかこれまで動作していたアンドロイドアプリで、AndroidX絡みで「ERROR: This project uses AndroidX dependencies, but the ‘android.useAndroidX’ property is not enabled」と出るようになってしまった。

gradle.propertiesファイル内でこれを下記のように有効化しないといけなかった(いけなくなった?)らしい。

#gradle.properties
android.useAndroidX=true
android.enableJetifier=true

リンク

行と列の覚え方

「行列」は縦と横のどれがどれかが分からなくなったら、横書きを基本にして、左から右に移動してそのまま字面のとおり、まずは「行」。

次に、右に移動したまま下に降ろすようなイメージで「列」。これだと忘れない。

(行列の掛け算の際もこの形。$AB$の積で、$A$の行と$B$の列とを掛け合わせる。「行→」×「列↓」で求まる。要素の添え字も行,列の順序で、$i$行$j$列目の要素は$a_{ij}$となる。)

あとは、「列」だけで言うと、運動会でクラスごととかで並ばされているイメージ。

対数関連の公式

(関連記事:常用対数の近似値の算出

対数は「$x$を何乗したら$z$になるか」を求めるものと捉える。
$z=x^y$での$y$を知りたい場合に$y=\log_{x}z$と書く。
$x$を底(base)、$z$を真数(anti-logarithm、逆対数)と呼ぶ。
底が10の場合を常用対数($\log_{10}$)。底が${\rm e}$の場合を自然対数(natural logarithm)と呼び、$\log_{\rm e}$を$\ln$とも書く。

公式

  1. $z=x^y \Leftrightarrow y=\log_x z$,

  2. $x^{\log_x z}=x^y=z$(冪の底と指数にある対数の底が同じ場合は、指数部の対数の真数のみに),

  3. $\log_\underline{x} \underline{x}^y = \log_{x}z =y$(対数の底と真数の冪の底が同じ場合は、真数の指数に),

  4. $x^1=x \Leftrightarrow \log_x x = 1$, $x^0=1 \Leftrightarrow \log_x 1 = 0$,

  5. $z^p=(x^y)^p=\underbrace{x^y\cdot x^y\cdots x^y}_p=x^{\overbrace{y+y+\cdots+y}^p}=x^{py}$
      $\Rightarrow\log_x z^p=\log_x {(x^y)}^p=\log_x x^{py}=py=p\log_x{z}$(真数の指数は係数に出せる)

  6. $z_1=x^a, z_2=x^b; z_1z_2=x^ax^b=x^{a+b}$
      $\Leftrightarrow$
      $\log z_1z_2=\log x^ax^b=\log x^{a+b}$$=(a+b)\log x=a\log x + b\log x$$=\log x^a + \log x^b=\log z_1 + \log z_2$。
      $\log z_1/z_2=\log x^ax^{-b}=\log x^{a-b}$$=(a-b)\log x=a\log x – b\log x$$=\log x^a – \log x^b=\log z_1 – \log z_2$。
      (対数を取ると、乗除が加減算に)

  7. $z=x^y$で両辺の対数を取ると、$\log_a z = \log_a x^y = y\log_a x \Rightarrow y = \displaystyle\frac{\log_a z}{\log_a x}$。
    上式で、対数の底を$x$とすると$y = \displaystyle\frac{\log_x z}{\log_x x}=\displaystyle\frac{\log_x z}{1}=\log_x z$ $\Rightarrow \log_x z=\displaystyle\frac{\log_a z}{\log_a x}$ (対数の底の変換)
    逆に、対数の底を$z$とすると、$y = \displaystyle\frac{\log_z z}{\log_z x}=\displaystyle\frac{1}{\log_z x}$ $\Rightarrow \log_x z=\displaystyle\frac{1}{\log_z x}$(底と真数の入れ替えで逆数に)

  8. $\log_{x^p}z=\displaystyle\frac{\log_x z}{\log_x x^p}=\displaystyle\frac{\log_x z}{p\log_x x}=\displaystyle\frac{\log_x z}{p\cdot 1}=\displaystyle\frac{1}{p}\log_x z=\log_x z^\frac{1}{p}$(底の$p$乗は真数の$1/p$乗)
      $\left(y=\log_{x^p}z\Leftrightarrow (x^p)^y=(x^y)^p=z\Rightarrow x^y=\sqrt[p]{z}=z^{\frac{1}{p}}\Leftrightarrow y=\log_x{z^{\frac{1}{p}}} \right)$

  9. $\log_{x^p}z^p=\displaystyle\frac{\log_a z^p}{\log_a x^p}=\displaystyle\frac{\cancel{p}\log_a z}{\cancel{p}\log_a x}=\displaystyle\frac{\log_a z}{\log_a x}=\log_x z$(底と真数の$p$乗は相殺)
      $\left(上式で底をxとして、\log_{x^p}z^p=\displaystyle\frac{\log_x z^p}{\log_x x^p}=\displaystyle\frac{\cancel{p}\log_x z}{\cancel{p}\log_x x}=\displaystyle\frac{\log_x z}{1}=\log_x z\right)$
      $\left(z^p=(x^p)^y=(x^y)^p \Rightarrow \sqrt[p]{z^p}=\sqrt[p]{(x^y)^p} \Rightarrow z=x^y \right)$

  10. $\log_a b\cdot \log_b c=\displaystyle\frac{\cancel{\log_x b}}{\log_x a}\displaystyle\frac{\log_x c}{\cancel{\log_x b}}=\displaystyle\frac{\log_x c}{\log_x a}=\log_a c$(真数と底の連鎖で相殺)
      $\left(上式で底をaとして、\log_a b\cdot \log_b c=\cancel{\log_a b}\displaystyle\frac{\log_a c}{\cancel{\log_a b}}=\log_a c\right)$

  11. 常用対数から自然対数への変換 $\ln z=\displaystyle\frac{\log_{10}z}{\log_{10}{\rm e}}=\displaystyle\frac{\log_{10}z}{\log_{10}2.718\cdots}=\displaystyle\frac{\log_{10}z}{0.434\cdots}\fallingdotseq 2.3\log_{10}z$

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$

    でも結果は同様。

参考リンク

←Older