2018年
7月
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31

setup diary

2007|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|06|08|11|
2015|01|02|03|04|05|06|07|08|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|

2018-07-14 Rで複雑なfitting

_ optimizeとoptim

Rをつかって複雑な式でfittingをやることがある。線形の場合にはlmを、非線型の場合にはnlsを使えば良い。しかし、単純な関数で表せなかったり、媒介変数で表されるような場合には、これらは使えない。どうしたら良いかを考えていたら、fittingとの差を表すような関数を定義して、それを最小化すれば良いことに気がついた。例えば、xをax^2で近似するときの最適なaを求める場合には、差を表す関数を定義して、optimizeでその関数と変数の範囲を指定して、最小値を求めれば良い。

x<-0:10/10
f<-function(a){return(sum((x-a*x^2))^2)}
res<-optimize(f,c(0,2))
res$minimum

二変数の場合には、optimを使う。このとき、関数の引数はベクトルとして与え、optimには初期値をベクトルとして与える必要がある。

x<-0:10/10
f<-function(a){return(sum((x-a[1]*x^2-a[2]))^2)}
res<-optim(c(0,0),f)
res$par

ここでの例は、単純で通常の方法でもできるだろうが、複雑なfittingではこれが有効になった。


2018-07-15 ESP8266のmicropythonでSPI

_ micropythonでadt7310を読む

micropythonで温度測定するために、adt7310を使う方法を模索してみた。adt7310のpinとesp8266は以下のように接続した。

1 SCK  D5 14
2 DOUT D6 12
3 DIN  D7 13
4 CS   D8 15

まず、初期化は以下のように行う。

from machine import Pin,SPI
spi=SPI(baudrate=1000000,sck=Pin(14),mosi=Pin(13),miso=Pin(12),firstbit=SPI.MSB,polarity=1,phase=1)
cs=Pin(15, Pin.OUT)
cs(1)

ここで、polarityはclockが何もしていない時にはhighであることを示し、phaseはclockが元に戻るedgeで読み取りを行うことを示す。 adt7310のモードの設定は、以下のように行う。

cs(0)
#spi.write(bytearray([1<<3,0xa0])) #one shot
spi.write(bytearray([1<<3,0x80])) #continuous
cs(1)

そして、温度の読み取りは

cs(0)
spi.write(bytearray([0x40|2<<3]))
ret=spi.read(2)
cs(1)
(ret[0]*256+ret[1])/128

とすれば良い。本当は符号の処理も行わないといけないけど、零下になることはまず無いので、良しとしよう。bytearrayの扱いもよく分かっていないけど、まあ良いか。