# 19/10/08刷新
座標2点もしくは3点から、関数y=f(x)へフィッティングするための係数をnumpyで連立方程式を計算する方法です。その後、適当な複数のXをその関数へぶちこんで、X,Yデータをcsvファイル出力するまでを行う。


▼本プログラム
行列含む数値計算はnumpyを使用し、数値データだけでなく行列データを操作するにはpandasを使用することで圧倒的に楽になる。
import numpy as np
import pandas as pd
def funcA(Xa, Ya, Xb, Yb):
a = (Yb - Ya)/(Xb - Xa)
b = Yb - a * Xb
print("############ function A")
print('a={0}, b={1}'.format(a, b))
return a, b
def exec_funcA(coefficient, inputX):
Y = coefficient[0] * inputX + coefficient[1]
print("exec_funcA")
print(Y)
return Y
def funcB(Xa, Ya, Xb, Yb):
myXset = np.array([Xa, Xb])
myYset = np.array([Ya, Yb])
coefficient = np.polyfit(myXset, myYset, 1)
print("############ function B")
print('a, b =' + str(coefficient))
Y_func = np.poly1d(coefficient)
print(Y_func)
return Y_func
def funcC(Xa, Ya, Xb, Yb, Xc, Yc):
myXset = np.array([Xa, Xb, Xc])
myYset = np.array([Ya, Yb, Yc])
coefficient = np.polyfit(myXset, myYset, 2)
print("############ function C")
print('a, b, c =' + str(coefficient))
Y_func = np.poly1d(coefficient)
print(Y_func)
return Y_func
def exec_funcBorC(Y_func, inputX):
Y = Y_func(inputX)
print("exec_funcBorC")
print(Y)
return Y
def writeFunc(outname, myVal):
tmp_list = ['Y_' + outname + '=', str(myVal), '\n']
with open("output.txt", "a") as f:
f.writelines(tmp_list)
def calc(filename, myfunc, X_list):
print('substitute X for Y in the equation')
print("set X")
X_np = np.array(X_list)
print(X_np)
Y_np = myfunc(X_np)
print(Y_np)
X_np2 = X_np[None,:].T
Y_np2 = Y_np[None,:].T
XY_np = np.concatenate([X_np2, Y_np2], axis=1)
print("XY_numpy")
print(XY_np)
XY_list = XY_np.tolist()
print("XY_list")
print(XY_list)
df = pd.DataFrame(data=XY_list, columns=['x', 'y'])
print("XY_pandas")
print(df)
df.to_csv(filename + "_output2.csv", header=True, index=False, encoding="utf-8")
if __name__ == '__main__':
Xa = 15.8
Ya = 0
Xb = 23.4
Yb = -1.2e18
Xc = 25.8
Yc = -1.7e18
inputX = 27
X_list = [-2, 0, 1.58, 2.1, 2.34, 3, 7, 14.2, 18, 22, 27, 30]
coefficient = funcA(Xa, Ya, Xb, Yb)
outputY = exec_funcA(coefficient, inputX)
writeFunc("funcA", outputY)
myfuncB = funcB(Xa, Ya, Xb, Yb)
outputY = exec_funcBorC(myfuncB, inputX)
writeFunc("funcB", outputY)
myfuncC = funcC(Xa, Ya, Xb, Yb, Xc, Yc)
outputY = exec_funcBorC(myfuncC, inputX)
writeFunc("funcC", outputY)
myXY = calc("myfuncB", myfuncB, X_list)
myXY = calc("myfuncC", myfuncC, X_list)
グラフ化するには下記リンク先を参照
hk29.hatenablog.jp
以上