Untitled

 avatar
unknown
python
2 years ago
1.4 kB
7
Indexable
from numpy import *
import scipy as scipy
import scipy.linalg
import math
import pylab

with open('signal.dat', 'r') as file:
    lines = file.readlines()
    lines = [line.rstrip() for line in lines]

points = []
for point in lines:
    points.append(point.split(', '))

X = [ float(points[i][0]) for i in range(len(points)) ]
Y = [ float(points[i][1]) for i in range(len(points)) ]


A = zeros((200,4))
for i,x in enumerate(X):
    a = array([ math.sin(x), math.cos(x), math.sin(2*x), math.cos(2*x) ])
    A[i,:] = a


ATA = A.T@A
b = A.T@Y

Q,R = scipy.linalg.qr(ATA)
print(f'R  = {R}')

def backward_sub(R, b):
    x = zeros((b.size,1))
    n = b.size - 1
    for row in R[::-1][:]:
        x[n] = b[n]
        for i in range(b.size - 1, n, -1):
            x[n] -= x[i]*R[n][i]
        x[n] = x[n]/R[n][n]
        n -= 1
    return x

x = backward_sub(R,Q.T@b)
y = lambda t : x[0,0]*math.sin(t) + x[1,0]*math.cos(t) + x[2,0]*math.sin(2*t) + x[3,0]*math.cos(2*t)

U, s, VT = scipy.linalg.svd(ATA, full_matrices = False)
S = diag(s)

VTx = backward_sub(S, U.T@b)
xSVD = VT.T@VTx

ySVD = lambda t : xSVD[0,0]*math.sin(t) + xSVD[1,0]*math.cos(t) + xSVD[2,0]*math.sin(2*t) + xSVD[3,0]*math.cos(2*t)


yp = [y(t) for t in X]
ypSVD = [ySVD(t) for t in X]
pylab.plot(X,yp)
pylab.plot(X,ypSVD, 'm')
pylab.plot(X,Y, 'co')
pylab.show()

print(f' x = {x}')
print(f' xSVD = {xSVD}')
Editor is loading...