「数理演算の基礎」

2019年より着手した「数理再勉強」用の倉庫。

【等差数列】等差数列(arithmetic progression)から一次関数(linear function)へ

今回の投稿の出発点はここ。

等差数列arithmetic progression)あるいは算術数列arithmetic sequenceAS(係数n=1~n)[n]=初項(Initial term)a[1]+(n-1)*公差(common difference)d。その振る舞いは公差d符号の向き(Sign direction)に依って定まる。

  • dの符号が(plus)ならば、その数列の(term)は増加数列(increasing sequence)を構成し無限大Inf発散(divergence)する。
    f:id:ochimusha01:20200105085657p:plain
  • dの符号が(minus)ならば、その数列の(term)は減少数列(decreasing sequence)を構成し無限小-Inf発散(divergence)する。
    f:id:ochimusha01:20200105085511p:plain

なお自明的場合(Trivial Case)としてその総和(sum)S(1~n)[n]=初項a+a[1]+a[2]+a[3]…a[n]n(2*a[1]+(n-1)d)/2によって、算術平均arithmetic meanS[n]/n(a[1] + a[n])/2によって求められる。 

あれ、この振る舞い一次関数linear function)そのものじゃないですか? そちらで公差(common difference)の概念に該当するのは傾きslope)?

f:id:ochimusha01:20200109174140p:plain

1次関数(linear functiony=ax+bの“a”の部分には、

  • 傾き」…直線の傾きの度合い(グラフ上での斜め具合)。直線にしか使えない。
  • 比例定数」…同様に変化の割合が一定である事を前提としている。
  • 変化の割合」…xが増える量に対して、yがどれくらい増えるか。すなわちyの増加量/xの増加量。反比例や曲線にも使える。

という3つの呼び方があるんです。ちなみに“b”の方は切片といいます。

数学における平面上の直線の傾き(slope)あるいは勾配(gradient)は、その傾斜の具合を表す数値である。ただし、鉛直線に対する傾きは定義されない。 

  • 傾きは普通、直線上の2点間の変化の割合、すなわち x の増加量に対する y の増加量の比率として定義される。
    f:id:ochimusha01:20200106032606p:plain
    平面上の直線の傾きは、垂直移動距離を水平移動距離で割ったm = Δy/Δxで定義される。ここで、ギリシャ文字 "Δ"(デルタ)は、数学において「増加量」や「増分」を表す符牒としてよく用いられる。これらの等式から分かるように、鉛直線y軸に平行な直線の傾きは零除算となり定義されない
  • 同値な定義として、傾きmは傾斜角をθとしてm=tan(θ)と書くことができる。
  • 曲線上の微分可能な1点に対しても、傾斜の具合を表す数値(微分係数)が、傾きの考え方により定義できる。

傾きの概念は、地理学および土木工学における斜度や勾配(たとえば道路など)に直接応用される。

コンピューター言語はそもそも概ね直線の傾きを「計測始点のx,y座標」と「計測始点のx,y座標」の組み合わせという形でしか認識出来ません。
統計言語Rによる実装例

#関数設定
slope01<-function(frame){
x0<-Anime_x0[frame]
y0<-Anime_y0[frame]
x1<-Anime_x1[frame]
y1<-Anime_y1[frame]
cx<-c(x0,x1)
cy<-c(y0,y1)
plot(cx,cy,type="b",xlim=c(-1,1),ylim=c(-1,1),main="slope=y incremental / x incremental",xlab="x incremental",ylab="y incremental")
#増分領域の塗り潰し
polygon(c(x0,x1,x1,x0), #x
c(y0,y0,y1,y0), #y
density=c(30), #塗りつぶす濃度
angle=c(45),     #塗りつぶす斜線の角度
col=c(200,200,200))  #塗りつぶす色
#象限枠
abline(h = 0,col=c(200,200,200))
abline(v = 0,col=c(200,200,200))
#xの増分
segments(x0,y0,x1,y0,col=rgb(1,0,0))
#yの増分
segments(x1,y0,x1,y1,col=rgb(0,0,1))
#凡例
textx<-paste0("Δx=",x1-x0)
texty<-paste0("Δy=",y1-y0)
legend("topleft", legend=c(textx,texty), lty=c(1,1),col =c(rgb(1,0,0),rgb(0,0,1)))
}
#アニメーション動作設定
Time_Code<-c(1:80)
Anime_x0<-c(rep(0,length=80))
Anime_x1<-c(seq(0,1,length=10),rep(1,length=20),seq(1,-1,length=20),rep(-1,length=20),seq(-1,0,length=10))
Anime_y0<-c(rep(0,length=80))
Anime_y1<-c(rep(1,length=10),seq(1,-1,length=20),rep(-1,length=20),seq(-1,1,length=20),rep(1,length=10))
#アニメーション
library("animation")
saveGIF({
for (i in Time_Code){
 slope01(i)
}
}, interval = 0.1, movie.name = "slope06.gif")

f:id:ochimusha01:20200106054553g:plain

その振る舞いはトポロジーtopology=位相幾何学)的に「初項(Initial term)=0の原点のみで固定された目盛り付き直線(scaled line)の軌跡」が同心円集合(concentric set)と解釈される両側無限算術数列(Two-sided infinite arithmetic sequence)に酷似しています。実際に重ね合わせてみましょう。

関数y=axの形(傾きaがΔx/Δyで定義される為、関数y=-axとの狭間となるy=0の時点で0除算が発生し計算継続不可能となる)

統計言語Rによる実装例(y=xの実装)

LFX01<-function(index){
#同心円の描画
c0=seq(0,2*pi,length=60)
cx=cos(c0)
cy=sin(c0)
plot(cx,cy,asp=1,type="l",xlim=c(-3,3),ylim=c(-3,3),main="Linear Function of x",xlab="x",ylab="y")
par(new=T)#上書き
plot(cx*2,cy*2,asp=1,type="l",xlim=c(-3,3),ylim=c(-3,3),main="",xlab="",ylab="")
par(new=T)#上書き
plot(cx*3,cy*3,asp=1,type="l",xlim=c(-3,3),ylim=c(-3,3),main="",xlab="",ylab="")
par(new=T)#上書き
plot(cx*4,cy*4,asp=1,type="l",xlim=c(-3,3),ylim=c(-3,3),main="",xlab="",ylab="")
par(new=T)#上書き
plot(cx*5,cy*5,asp=1,type="l",xlim=c(-3,3),ylim=c(-3,3),main="",xlab="",ylab="")
#同心円領域の塗り潰し(x=1)
polygon(cx,#x
cy,#y
density=c(50),#塗りつぶす濃度
angle=c(45),#塗りつぶす斜線の角度
col=c(200,200,200))#塗りつぶす色
#同心円領域の塗り潰し(x=2)
polygon(cx*2,#x
cy*2,#y
density=c(40),#塗りつぶす濃度
angle=c(45),#塗りつぶす斜線の角度
col=c(200,200,200))#塗りつぶす色
#同心円領域の塗り潰し(x=3)
polygon(cx*3,#x
cy*3,#y
density=c(30),#塗りつぶす濃度
angle=c(45),#塗りつぶす斜線の角度
col=c(200,200,200))#塗りつぶす色
#同心円領域の塗り潰し(x=4)
polygon(cx*4,#x
cy*4,#y
density=c(20),#塗りつぶす濃度
angle=c(45),#塗りつぶす斜線の角度
col=c(200,200,200))#塗りつぶす色
#同心円領域の塗り潰し(x=5)
polygon(cx*5,#x
cy*5,#y
density=c(10),#塗りつぶす濃度
angle=c(45),#塗りつぶす斜線の角度
col=c(200,200,200))#塗りつぶす色
abline(h = 0,col=rgb(0,1,0))
abline(v = 0,col=c(200,200,200))
#傾きの描画
for(i in -5:5){
x0<-cx[index]*i
y0<-cy[index]*i
x1<-cx[index]*(i+1)
y1<-cy[index]*(i+1)
polygon(c(x0,x1,x1,x0),#x
c(y0,y0,y1,y0),#y
density=c(30),#塗りつぶす濃度
angle=c(45),#塗りつぶす斜線の角度
col=rgb(0,1,0))#塗りつぶす色
#xの増分
segments(x0,y0,x1,y0,col=rgb(1,1,0))
#yの増分
segments(x1,y0,x1,y1,col=rgb(0,1,1))
}
par(new=T)#上書き
axp=c(0,cx[index]*1,cx[index]*2,cx[index]*3,cx[index]*4,cx[index]*5)
ayp=c(0,cy[index]*1,cy[index]*2,cy[index]*3,cy[index]*4,cy[index]*5)
plot(axp,ayp,asp=1,type="o",xlim=c(-3,3),ylim=c(-3,3),col=rgb(0,0,1),main="",xlab="",ylab="")
par(new=T)#上書き
axm=c(0,cx[index]*-1,cx[index]*-2,cx[index]*-3,cx[index]*-4,cx[index]*-5)
aym=c(0,cy[index]*-1,cy[index]*-2,cy[index]*-3,cy[index]*-4,cy[index]*-5)
plot(axm,aym,asp=1,type="o",xlim=c(-3,3),ylim=c(-3,3),col=rgb(1,0,0),main="",xlab="",ylab="")
#凡例
textx<-paste0("Δx=",cx[index])
texty<-paste0("Δy=",cy[index])
legend("topleft", legend=c(textx,texty), lty=c(1,1),col =c(rgb(1,1,0),rgb(0,1,1)))
}

#アニメーション動作設定
Time_Code<-seq(1,29,by=2)
#アニメーション
library("animation")
saveGIF({
for (i in Time_Code){
 LFX01(i)
}
}, interval = 0.1, movie.name = "LFX001.gif")

f:id:ochimusha01:20200109202327g:plain
関数x=ayの形(傾きaがΔy/Δxで定義される為、関数x=-ayとの狭間に該当するx=0で0除算が発生し計算継続不可能となる)

統計言語Rによる実装例(x=yの形での実装)

 LFY01<-function(index){

#同心円の描画

c0=seq(0,2*pi,length=60)
cx=cos(c0)
cy=sin(c0)
plot(cx,cy,asp=1,type="l",xlim=c(-3,3),ylim=c(-3,3),main="Linear Function of Y",xlab="x",ylab="y")
par(new=T)#上書き
plot(cx*2,cy*2,asp=1,type="l",xlim=c(-3,3),ylim=c(-3,3),main="",xlab="",ylab="")
par(new=T)#上書き
plot(cx*3,cy*3,asp=1,type="l",xlim=c(-3,3),ylim=c(-3,3),main="",xlab="",ylab="")
par(new=T)#上書き
plot(cx*4,cy*4,asp=1,type="l",xlim=c(-3,3),ylim=c(-3,3),main="",xlab="",ylab="")
par(new=T)#上書き
plot(cx*5,cy*5,asp=1,type="l",xlim=c(-3,3),ylim=c(-3,3),main="",xlab="",ylab="")
#同心円領域の塗り潰し(x=1)
polygon(cx,#x
cy,#y
density=c(50),#塗りつぶす濃度
angle=c(45),#塗りつぶす斜線の角度
col=c(200,200,200))#塗りつぶす色
#同心円領域の塗り潰し(x=2)
polygon(cx*2,#x
cy*2,#y
density=c(40),#塗りつぶす濃度
angle=c(45),#塗りつぶす斜線の角度
col=c(200,200,200))#塗りつぶす色
#同心円領域の塗り潰し(x=3)
polygon(cx*3,#x
cy*3,#y
density=c(30),#塗りつぶす濃度
angle=c(45),#塗りつぶす斜線の角度
col=c(200,200,200))#塗りつぶす色
#同心円領域の塗り潰し(x=4)
polygon(cx*4,#x
cy*4,#y
density=c(20),#塗りつぶす濃度
angle=c(45),#塗りつぶす斜線の角度
col=c(200,200,200))#塗りつぶす色
#同心円領域の塗り潰し(x=5)
polygon(cx*5,#x
cy*5,#y
density=c(10),#塗りつぶす濃度
angle=c(45),#塗りつぶす斜線の角度
col=c(200,200,200))#塗りつぶす色

abline(h = 0,col=c(200,200,200))
abline(v = 0,col=rgb(0,1,0))
#傾きの描画
for(i in -5:5){
x0<-cx[index]*i
y0<-cy[index]*i
x1<-cx[index]*(i+1)
y1<-cy[index]*(i+1)
polygon(c(x0,x0,x1,x0),#x
c(y0,y1,y1,y0),#y
density=c(30),#塗りつぶす濃度
angle=c(45),#塗りつぶす斜線の角度
col=rgb(0,1,0))#塗りつぶす色
#xの増分
segments(x0,y0,x1,y1,col=rgb(1,1,0))
#yの増分
segments(x0,y0,x0,y1,col=rgb(0,1,1))
}
par(new=T)#上書き
axp=c(0,cx[index]*1,cx[index]*2,cx[index]*3,cx[index]*4,cx[index]*5)
ayp=c(0,cy[index]*1,cy[index]*2,cy[index]*3,cy[index]*4,cy[index]*5)
plot(axp,ayp,asp=1,type="o",xlim=c(-3,3),ylim=c(-3,3),col=rgb(0,0,1),main="",xlab="",ylab="")
par(new=T)#上書き
axm=c(0,cx[index]*-1,cx[index]*-2,cx[index]*-3,cx[index]*-4,cx[index]*-5)
aym=c(0,cy[index]*-1,cy[index]*-2,cy[index]*-3,cy[index]*-4,cy[index]*-5)
plot(axm,aym,asp=1,type="o",xlim=c(-3,3),ylim=c(-3,3),col=rgb(1,0,0),main="",xlab="",ylab="")
#凡例
textx<-paste0("Δx=",cx[index])
texty<-paste0("Δy=",cy[index])
legend("topleft", legend=c(textx,texty), lty=c(1,1),col =c(rgb(1,1,0),rgb(0,1,1)))
}
#アニメーション動作設定
Time_Code<-c(seq(45,59,by=2),seq(1,15,by=2))
#アニメーション
library("animation")
saveGIF({
for (i in Time_Code){
 LFY01(i)
}
}, interval = 0.1, movie.name = "LFY001.gif")

f:id:ochimusha01:20200109203411g:plain
確かに考え方として等価といえそうなんです?