つるかめ算メモ その1

たまに使う 「数値的に連立方程式を解くアルゴリズム」を忘れちゃったので 思い出すのと検算用に書いてみた
その2は無いかもしれない

「ループを回すと収束して解が求まる」
ってアルゴリズム多いので、ニューラルネットワークでもそういうレイヤーが有ると便利なんじゃないかなーって思いました まる


import numpy as np

def psolve( alist,blist,x):
#数値的に連立方程式を解くよー
for i in range(len(alist)):
a=alist[i]
b=blist[i]
x=x-np.dot(x-b*a,a)*a
return x
def chk(alist,blist,x,err):
#連立方程式に代入して2乗誤差が小さくなったらTrue返す

ret=True
for i in range(len(alist)):
a=alist[i]
b=blist[i]
if np.absolute(np.dot(a,x)-b)>err:
ret=False
break
return ret
#cつる tかめ
c=np.random.randint(1,10)
t=np.random.randint(1,10)
print (c,t)
#係数 一匹あたりの頭の数と 足の数
alist=np.array([ [1,1], [2,4]],dtype=float)
#頭の合計、足の合計
blist=np.array([ c+t, 2*c+4*t] ,dtype=float)
print( blist)
#連立方程式の係数ベクトルのノルムが1になるように正規化して右辺も割る
for i in range(len(alist)):
L=np.linalg.norm(alist[i])
alist[i]/=L
blist[i]/=L

x=np.random.randint(1,10,2).astype(float)
err=1e-5
for i in range(20):
x=psolve(alist,blist,x)
print (i,x, np.round_(x))
#今回は整数解を求めるのでroundで丸めてる
if chk(alist,blist,np.round_(x),err):
break
print("done")