Как вернуть наибольшее значение из массива с соответствующим углом

1

Для последней части моего кода мне нужно вывести максимальную скорость и угол, на котором скорость макс, но нам не разрешено использовать функцию max. Мой код:

#This program calculates and plots the position and velocity of a piston
import numpy as np 
import matplotlib.pyplot as plt

def piston_position(r,l,a):
    #input: r = radius (cm), l = length (cm), a = angle (radians)
    #output: x = position (cm)
    x = (r * np.cos(a) + ((l**2) - (r**2) * (np.sin(a)**2)**0.5))
    return x

def piston_velocity (r, l, a, w):
    #input: r = radius (cm), l = length (cm), a = angle (radians), w = angular velocity (radians/seconds)
    #output: v = velocity (cm/s)
    v = (-r * w * np.sin(a) - ((r**2 * w * np.sin(a) * np.cos(a))/((l**2 - r**2 *np.sin(a)**2)**0.5)))
    return v 

a = np.linspace(0,360,30)
x1 = piston_position(3,15,a)
v1 = piston_velocity(3,15,a,100)
x2 = piston_position(5,15,a)
v2 = piston_velocity(5,15,a,100)

plt.figure(1)
plt.subplot(211)
plt.plot(a,x1, 'b^--', label ='r=3cm', mfc = 'r', color = "black")
plt.plot(a,x2, 'bs--', label ='r=5cm', mfc = 'b', color = "black")
plt.title ("Subplot for Position")
plt.ylabel ("Position (cm)")
#plt.xlabel ("Angle (degrees)") --- Note: caused an overlap in text
plt.legend()

plt.subplot(212)
plt.plot(a,v1, 'b^--', label ='r=3cm', mfc = 'r', color = "black")
plt.plot(a,v2, 'bs--', label ='r=5cm', mfc = 'b', color = "black")
plt.title ("Subplot for Velocity")
plt.ylabel ("Velocity (cm/s)")
plt.xlabel ("Angle (degrees)")
plt.legend()
plt.show() 

a3 = np.array(a)
v3 = sorted(piston_velocity(3,15,a3,100))
v4 = piston_velocity(5,15,a3,100)
for i in range(0,len(v3)):
    print((int(a3[i])),int(v3[i]))

С кодом я возвращаю все значения угла и скорость, и я не уверен, как выводить только максимальную скорость с соответствующим углом.

Я ценю помощь!

Теги:
arrays
max

2 ответа

0

Соберите все ваши кортежи скорости /agle в список.

Создайте свою собственную функцию max - python - это язык программирования:

def getMax(iterab):
    """Returns the larges number (or > / __ge__(self,a,b) is defined) value) from iterab"""
    c = iterab[0] # make sure it has content
    for other in iterab[1:]:
        if other > c:
            c = other

    return other

def getMaxTuple(tupsIter,idx=0):
    """Returns the tuple from tupsIter with the larges value on position idx"""
    c = tupsIter[0]
    for other in tupsIter[1:]:
        if other[idx] > c[idx]:
            c = other

    return other

Распечатайте их:

print(getMax(range(2,5)))  # 4

print(getMaxTuple( [ (a,a**3) for a in range(10) ],1 ))  # (9,729)
0

Самый простой способ - получить индекс максимального значения (хотя обычно я бы пошел на np.argmax):

index = 0
value = v1[0]
for i in range(len(v1)):
     if v1[i] > value:
          index = i
          value = v1[i]

Затем вы можете получить угол, используя:

angle = a[index]

Это возвращает максимальную скорость v1: 305.9m/s с углом 111.7, что кажется довольно точным по сравнению с графиком.

  • 0
    Я вижу, что вы там делали, и именно это я и хотел сделать изначально, однако там говорится, что мы не должны использовать встроенную функцию max, и именно здесь я сталкиваюсь с проблемами. Однако, спасибо!
  • 0
    @ Томас, ты прав! Я только прочитал название и написал кое-что ... Позвольте мне добавить более хорошее решение.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню