diff --git a/__pycache__/quickmap.cpython-36.pyc b/__pycache__/quickmap.cpython-36.pyc index 5941b8d85c574f82e1cb81064e894656e422ef5d..25d45a96a0002e31058294169d422e749b843198 100644 Binary files a/__pycache__/quickmap.cpython-36.pyc and b/__pycache__/quickmap.cpython-36.pyc differ diff --git a/quickmap.py b/quickmap.py index 13f8d60a5176511b8098470d59f6246efdcb10f4..b8863c2f69917b69ab7d7656bd2ddfc1ec1dc8a4 100644 --- a/quickmap.py +++ b/quickmap.py @@ -17,10 +17,11 @@ def dotMultiply(vctA, vctB): ans += a * b return ans -def GetMap(parrX, parrY, windowSizeX=12, windowSizeY=8, extendXRate=1, line=False, passO=False, maxXPower=1): +def GetMap(parrX, parrY, windowSizeX=12, windowSizeY=8, extendXRate=1, extendYRate=1, line=False, passO=False, maxXPower=1, inverseK=False): print('Generic-GetMap by Recolic.') arrX, arrY = parrX, parrY - maxX = max(arrX) * extendXRate + maxX, maxY = max(arrX) * extendXRate, max(arrY) * extendYRate + minX, minY = min(arrX) * extendXRate, min(arrY) * extendYRate # Do calculate # y = [k0 k1 k2 ...] dot [x^0 x^1 x^2 ...] print('Your input: ', arrX, '|', arrY) @@ -33,14 +34,18 @@ def GetMap(parrX, parrY, windowSizeX=12, windowSizeY=8, extendXRate=1, line=Fals vctX[0] = 0 return dotMultiply(k, vctX) - def lossFunc(k, x, y): return lineFunc(k, x) - y + def lossFunc(k, x, y): return abs(lineFunc(k, x) - y) # Fire! if line: kInit = [1 for _ in range(maxXPower + 1)] kInit[0] = 0 # guarantee passO. - kFinal, _ = leastsq(lossFunc, kInit, args=(X, Y)) - print('Fit line done. k=', kFinal) + if inverseK: + kFinal, _ = leastsq(lossFunc, kInit, args=(Y, X)) + print('Fit line done. k^-1=', kFinal) + else: + kFinal, _ = leastsq(lossFunc, kInit, args=(X, Y)) + print('Fit line done. k=', kFinal) else: print('Drawing map without fitting a line...') @@ -51,8 +56,12 @@ def GetMap(parrX, parrY, windowSizeX=12, windowSizeY=8, extendXRate=1, line=Fals plt.figure(figsize=(windowSizeX, windowSizeY)) plt.scatter(X, Y, color="red", label="Sample Point", linewidth=3) if line: - px = numpy.linspace(0, maxX, 1000) - py = dotMultiply(kFinal, [px ** power for power in range(maxXPower + 1)]) + if inverseK: + py = numpy.linspace(minY, maxY, 1000) + px = dotMultiply(kFinal, [py ** power for power in range(maxXPower + 1)]) + else: + px = numpy.linspace(minX, maxX, 1000) + py = dotMultiply(kFinal, [px ** power for power in range(maxXPower + 1)]) plt.plot(px, py, color="orange", label="Fitting Line", linewidth=2) plt.legend() plt.grid() diff --git a/test.py b/test.py index 86b6559847537ff0239e0e3c0d13f5db9f9f2046..e65e2ac798c07dd3af26ef0667a8e25b895e0581 100644 --- a/test.py +++ b/test.py @@ -3,6 +3,5 @@ import quickmap yrc=[-6.77, -6.78, -6.78, -6.76, -6.73, -6.73, -6.72, -6.70, -6.69, -6.67, -6.60, -6.45, -6.37, -6.20, -5.99, -5.77, -5.45, -5.07, -3.52, -2.87, -2.36, -2.08, -1.77, -1.55, -1.40, -1.26, -0.97, -0.84, -0.64] xrc=[0.0, 2.0, 4.0, 10.0, 20.0, 22.0, 25.0, 30.0, 33.0, 35.0, 37.0, 38.0, 38.5, 39.0, 39.6, 40.0, 40.5, 41.0, 43.0, 44.0, 45.0, 46.0, 47.0, 48.0, 49.0, 50.0, 53.0, 55.0, 60.0] -for i in range(15): - quickmap.GetMap(xrc, yrc, line=True, maxXPower=i, extendXRate=1) +quickmap.GetMap(xrc, yrc, line=True, maxXPower=16, inverseK=True)