def METHOD_NAME(cls, verts, omega, metric='DISTANCE', is_cyclic=False):
    ndim = 3
    n_verts = len(verts)
    verts = np.asarray(verts)
    if is_cyclic:
        verts = np.append(verts, verts[0][np.newaxis], axis=0)
        n_verts += 1
        n_equations = n_verts + 1
    else:
        n_equations = n_verts
    tknots = Spline.create_knots(verts, metric=metric)
    A = np.zeros((ndim*n_equations, ndim*n_equations))
    for equation_idx, t in enumerate(tknots):
        for unknown_idx in range(n_equations):
            i = (unknown_idx // 2) + 1
            if unknown_idx % 2 == 0:
                coeff = cos(omega*i*t)
            else:
                coeff = sin(omega*i*t)
            row = ndim*equation_idx
            col = ndim*unknown_idx
            for d in range(ndim):
                A[row+d, col+d] = coeff
    if is_cyclic:
        equation_idx = len(tknots)
        for unknown_idx in range(n_equations):
            i = (unknown_idx // 2) + 1
            if unknown_idx % 2 == 0:
                coeff = -omega*i*sin(omega*i) # - 0
            else:
                coeff = omega*i*cos(omega*i) - omega*i
            row = ndim*equation_idx
            col = ndim*unknown_idx
            for d in range(ndim):
                A[row+d, col+d] = coeff
    #print(A)
    B = np.empty((ndim*n_equations,1))
    for point_idx, point in enumerate(verts):
        row = ndim*point_idx
        B[row:row+ndim] = point[:,np.newaxis]
    if is_cyclic:
        point_idx = len(verts)
        row = ndim*point_idx
        B[row:row+ndim] = np.array([[0,0,0]]).T
    #print(B)
    x = np.linalg.solve(A, B)
    coeffs = []
    for i in range(n_equations):
        row = i*ndim
        coeff = x[row:row+ndim,0].T
        coeffs.append(coeff)
    coeffs = np.array(coeffs)
    #print(coeffs)
    return SvFourierCurve(omega, np.array([0.0,0.0,0.0]), coeffs)