Как построить функцию массива или альтернативу? - PullRequest
1 голос
/ 26 октября 2019
plt.plot(time,phi(time))

не работает ... почему? Значение истинности массива с более чем одним элементом неоднозначно. Используйте a.any () или a.all () "

Ответы [ 2 ]

1 голос
/ 26 октября 2019

Я не думаю, что вы хотите вычислить phi(time), я думаю, что вы хотите вычислить phi(t), где t - это каждый элемент time.

Важный раздел здесь:

def phi(t):
    # ...
    for time in np.arange(0,t,delta_t):

np.arange() принимает число в качестве второго аргумента, поэтому ваша функция phi() должна принимать число. Однако вы вызываете его с помощью массива:

time = np.arange(0, t_max+delta_t2 , delta_t2)
print(time)

plt.plot(time,phi(time))

Вы можете либо циклически проходить через time, вызывая phi(t) для каждого элемента, либо векторизовать вашу функцию phi(), чтобы получить массив. Второй вариант, вероятно, будет работать быстрее, но не всегда легко понять, как это сделать.

0 голосов
/ 27 октября 2019

Я думаю, что вам нужны некоторые рекомендации по отладке и предоставлению информативного вопроса.

Вот ваш код с несколькими исправлениями синтаксиса.

In [3]: g = 9.81; l = 2; mu = 0.1 
   ...:  
   ...: PHI_0 = np.pi / 3; PHI_PUNKT_0 = 0 
   ...:  
   ...: def berrechne_phi_zwei_punkt(phi, phi_punkt): 
   ...:    return -mu * phi_punkt - (g/l) * np.sin(phi) 
   ...:  
   ...: def phi(t): 
   ...:    phi = PHI_0 
   ...:    phi_punkt = PHI_PUNKT_0 
   ...:    delta_t = 0.001 
   ...:    for time in np.arange(0,t,delta_t): 
   ...:     phi_zwei_punkt = berrechne_phi_zwei_punkt( 
   ...:       phi, phi_punkt 
   ...:     ) 
   ...:     phi += phi_punkt * delta_t 
   ...:     phi_punkt += phi_zwei_punkt * delta_t 
   ...:    return phi 
   ...:  
   ...: delta_t2 = 0.1 
   ...: t_max = 10 
   ...: time = np.arange(0, t_max+delta_t2 , delta_t2)                          
In [4]: time                                                                    
Out[4]: 
array([ 0. ,  0.1,  0.2,  0.3,  0.4,  0.5,  0.6,  0.7,  0.8,  0.9,  1. ,
        1.1,  1.2,  1.3,  1.4,  1.5,  1.6,  1.7,  1.8,  1.9,  2. ,  2.1,
        2.2,  2.3,  2.4,  2.5,  2.6,  2.7,  2.8,  2.9,  3. ,  3.1,  3.2,
        3.3,  3.4,  3.5,  3.6,  3.7,  3.8,  3.9,  4. ,  4.1,  4.2,  4.3,
        4.4,  4.5,  4.6,  4.7,  4.8,  4.9,  5. ,  5.1,  5.2,  5.3,  5.4,
        5.5,  5.6,  5.7,  5.8,  5.9,  6. ,  6.1,  6.2,  6.3,  6.4,  6.5,
        6.6,  6.7,  6.8,  6.9,  7. ,  7.1,  7.2,  7.3,  7.4,  7.5,  7.6,
        7.7,  7.8,  7.9,  8. ,  8.1,  8.2,  8.3,  8.4,  8.5,  8.6,  8.7,
        8.8,  8.9,  9. ,  9.1,  9.2,  9.3,  9.4,  9.5,  9.6,  9.7,  9.8,
        9.9, 10. ])

phi ссингл прекрасно работает:

In [5]: phi(1)                                                                  
Out[5]: -0.46063859245390176

Но с массивом time выдает ошибку:

In [6]: phi(time)                                                               
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-6-cdd824beb99b> in <module>
----> 1 phi(time)

<ipython-input-3-bc74d5ec1a6c> in phi(t)
     10    phi_punkt = PHI_PUNKT_0
     11    delta_t = 0.001
---> 12    for time in np.arange(0,t,delta_t):
     13     phi_zwei_punkt = berrechne_phi_zwei_punkt(
     14       phi, phi_punkt

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

Вы должны были дать нам full трассировка / сообщение об ошибке. Это помогает случайным читателям сосредоточиться на проблеме. Это должно помочь вам сосредоточиться. Дон Киркби понял все правильно.

Давайте попробуем это arange само по себе:

In [7]: np.arange(0, time, 0.001)                                               
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-7-b37c7a8fd737> in <module>
----> 1 np.arange(0, time, 0.001)

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

arange ожидает stop, start и step. Все должны быть скалярами, а не массивами. Ошибка указывает, что в какой-то момент это тестируемый размер значения stop, либо он больше, чем start, либо относительно некоторого промежуточного значения. Если вы делаете `

Сравнение массива дает логический массив:

In [9]: 2 <= np.arange(3)                                                       
Out[9]: array([False, False,  True])

Такой массив нельзя использовать в контексте Python, который ожидает скалярное логическое значение, такое как ifили and. Именно такая ситуация вызывает ошибку ambiguity. Здесь это происходит внутри скомпилированной функции arange, поэтому диагностировать ее немного сложнее. В любом случае, проблема заключается в использовании массива в качестве аргумента arange. Я не собираюсь догадываться, почему вы используете два arange, один снаружи phi и один внутри него. Вам нужно разобраться с этим самостоятельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...