Напишите функцию для вычисления единичного вектора

Домашнее задание записывается следующим образом:

Напишите функцию с именем 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))

понимание списка new_list = [x**2 for x in connects]

furas 06.07.2019 04:08

это работает: x = sqrt(sum(i**2 for i in connects))unit_vector = [y/x for y in connects]

new-dev-123 06.07.2019 04:09

Вы продолжаете устанавливать добавление в 0 в цикле for. add = 0 должен быть перед циклом.

AAA 06.07.2019 04:09

«Добавить» не следует (повторно) устанавливать на 0 для каждого элемента в цикле. Разделение каждого элемента на длину вектора не может быть выполнено в том же цикле, потому что вы не знаете длину в этом первом цикле.

Michael Butscher 06.07.2019 04:10

Вам нужно сделать минимальный воспроизводимый пример

wjandrea 06.07.2019 04:16

Я удалил 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 06.07.2019 04:16

@lizard2020 Пожалуйста, дайте правильный ответ, если вы решили свою проблему

Akaisteph7 06.07.2019 05:10
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
7
3 113
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

список 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.

Делать «добавить» глобальной переменной не очень хорошая идея, и здесь будут получены неправильные результаты, если функция вызывается несколько раз.

Michael Butscher 06.07.2019 23:28

Другие вопросы по теме