У меня возникли проблемы с numpy.linalg.svd при подборе линии, наиболее подходящей для спирали.Я создал идеальную спираль, используя следующее параметрическое уравнение:
import numpy as np
def helix(t):
c = 0.5
r = 5
X = r * np.cos(t)
Y = r * np.sin(t)
Z = c * t
return X, Y, Z
Чтобы рассчитать ось винта этой спирали, я сгенерировал некоторые точки из уравнения спирали, выполняя итерацию и нанося на график диапазон значений t,и вычислили SVD массива:
value = []
matrix = []
for i in range(0,101):
value = helix(i)
matrix.append(value)
array = np.array(matrix)
datamean = list(array.mean(axis=0))
subtracted = array - datamean
uu, ss, vv = np.linalg.svd(subtracted)
Для этой спирали SVD, принадлежащее вектору оси винта, должно быть (0,0,1).Тем не менее, в результате SVD (-0.00331051, -0.0121754,0.99992).Хотя разница между вычисленным вектором и вектором (0,0,1) кажется небольшой, это приводит к резкому отклонению от оси истинного винта при вращении спирали вокруг других осей.Интересно то, что когда я использую 1000 точек вместо 100 точек для определения спирали, для которой рассчитываются SVD, результирующий вектор эффективно (0,0, -1), что является ожидаемым результатом.
Мои два вопроса:
1) Почему numpy.linalg.svd выдает разные значения SVD для разного количества точек, принадлежащих одной и той же параметрической функции?
2)Если есть логическое объяснение 1, какой другой метод я могу использовать, чтобы устранить это смещение?Я работаю с короткими спиралями, и мне нужен метод, чтобы точно рассчитать ось винтов моих спиралей.