Домашнее задание записывается следующим образом:
Напишите функцию с именем unitVec, которая определяет единичный вектор в направлении линии, соединяющей две точки (A и B) в пространстве. Функция должна принимать на вход два вектора (списка), каждый с координатами точки в пространстве. На выходе должен быть вектор (список) с компонентами единичного вектора в направлении от A к B. Если точки A и B имеют по две координаты каждая (т. е. лежат в плоскости xy), то выходной вектор должен иметь две элементы. Если точки A и B имеют по три координаты каждая (т. е. лежат в общем пространстве), выходной вектор должен состоять из трех элементов.
У меня в основном написан весь код, но я не могу понять, как возвести в квадрат каждый элемент в списке с именем connects[].
Чтобы вычислить единичный вектор, программа вычтет элементы вектора B из соответствующих элементов вектора A и создаст новый список (connects[]) с этими значениями. Затем каждый из этих элементов нужно возвести в квадрат и все их нужно сложить вместе. Затем из этого числа будет взят квадратный корень, и каждый элемент в connects[] будет разделен на это число и сохранен в новом списке, который будет единичным вектором. Я пытаюсь добавить квадраты элементов в connects [], используя строку
add = add + (connects[i]**2)
но я знаю, что это возвращает список только дважды. Остальная часть моего кода в порядке, мне просто нужна помощь в возведении этих элементов в квадрат.
from math import *
vecA = []
vecB = []
unitV = []
connects = []
vec = []
elements = int(input("How many elements will your vectors contain?"))
for i in range(0,elements):
A = float(input("Enter element for vector A:"))
vecA.append(A)
B = float(input("Enter element for vector B:"))
vecB.append(B)
def unitVec(vecA,vecB):
for i in range(0,elements):
unit = 0
add = 0
connect = vecB[i] - vecA[i]
connects.append(connect)
add = add + (connects[i]**2)
uVec = sqrt(add)
result = connects[i]/uVec
unitV.append(result)
return unitV
print("The unit vector connecting your two vectors is:",unitVec(vecA,vecB))
это работает: x = sqrt(sum(i**2 for i in connects))
unit_vector = [y/x for y in connects]
Вы продолжаете устанавливать добавление в 0 в цикле for. add = 0
должен быть перед циклом.
«Добавить» не следует (повторно) устанавливать на 0 для каждого элемента в цикле. Разделение каждого элемента на длину вектора не может быть выполнено в том же цикле, потому что вы не знаете длину в этом первом цикле.
Вам нужно сделать минимальный воспроизводимый пример
Я удалил add = 0
из цикла и понимаю почему, а потом попытался использовать new_list = [x**2 for x in connects]
, но в итоге получил пустой список. Затем я попробовал x = sqrt(sum(i**2 for i in connects)) unitV = [y/x for y in connects]
и получил ошибку «TypeError: объект «список» не может быть вызван»
@lizard2020 Пожалуйста, дайте правильный ответ, если вы решили свою проблему
список python предназначен для общего использования, и его арифметическая операция отличается от векторной операции. например, [1,2,3]*2 — это операция репликации вместо векторного скалярного умножения, так что результатом будет [1,2,3,1,2,3] вместо [2,4,6]. Я бы использовал массив numpy, который предназначен для числового массива и обеспечивает векторные операции.
import numpy as np
a = [1,2,3]
# convert python list into numpy array
b = np.array(a)
# vector magnitude
magnitude = np.sqrt((b**2).sum()) # sqrt( sum(b_i^2))
# or
magnitude = (b**2).sum()**0.5 # sqrt( sum(b_i^2))
# unit vector calculation
unit_b = b/magnitude
Вам нужно изменить свою функцию на следующее:
def unitVec(vecA,vecB):
add = 0
for i in range(0, elements):
unit = 0
connect = vecB[i] - vecA[i]
connects.append(connect)
add = add + (connect**2)
uVec = sqrt(add)
unitV = [val/uVec for val in connects]
return unitV
Вы не можете сделать все в одном цикле for, так как вам нужно добавить все различия, прежде чем вы сможете получить квадратный корень. Тогда вы можете разделить различия на это uVec
.
Делать «добавить» глобальной переменной не очень хорошая идея, и здесь будут получены неправильные результаты, если функция вызывается несколько раз.
понимание списка
new_list = [x**2 for x in connects]