Я думаю, что вам нужны некоторые рекомендации по отладке и предоставлению информативного вопроса.
Вот ваш код с несколькими исправлениями синтаксиса.
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
и один внутри него. Вам нужно разобраться с этим самостоятельно.