Python ValueError abs массива - PullRequest
       0

Python ValueError abs массива

0 голосов
/ 13 декабря 2011

Я новичок в python и не смог понять, как это исправить. Я пытаюсь сделать итерацию для каждого значения в массиве и вернуть массив окончательных значений. e - одиночное значение, введенное пользователем, а M - массив переменной длины. Я пытаюсь зациклить итерацию для каждого значения E, пока оно не решит близко уравнение Кеплера, M = E-e * sin (E), а затем вернуть готовый массив каждого E для данного M.

def eccano(e, M):
   E=M
   for i in range(0,len(M)):
       while abs(E-e*sin(E)-M[i]) > 10**(-4):
           E=E-((E-e*sin(E)-M[i])/(1-e*cos(E)))
   return E

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "ME.py", line 7, in eccano
    while abs(E-e*sin(E)-M[i]) > 10**(-4):
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

Любой совет? Спасибо!

Ответы [ 3 ]

1 голос
/ 13 декабря 2011

Не уверен, что вы на самом деле пытаетесь сделать, но проблема в следующем:

while abs(E-e*sin(E)-M[i]) > 10**(-4):

Все эти операции в abs () работают поэлементно в массивах numpy, поэтому вы делаете некоторые вещи, заканчивающиеся массивом, беря абсолютное значение каждого элемента в этом массиве, затем сравнивая с 10 ** (- 4) и заканчивая массивом логических значений. Он жалуется, что не может оценить это как «True» или «False», потому что это массив, который, вероятно, содержит значения True и False.

0 голосов
/ 14 декабря 2011

Это похоже на реализацию метода Ньютона-Рафсона . Я не могу дать конкретную помощь, потому что я не знаю, что это за функция, но вот как я могу написать пример на странице Википедии:

import numpy as np

def newtons(start_value, threshold):
   x = start_value

   stop = False
   while stop == False:
      x_previous = x
      # x -= function / first derivative of function
      x -= (np.cos(x) - x**3 )/ (-np.sin(x) - 3 * x**2)

      if np.abs(x - x_previous) < threshold:
         stop = True

   return x


print newtons(0.5, 0.0001)

Дайте нам знать, если это то, что вы пытаетесь сделать, что такое e и M, и какова конкретная функция.

0 голосов
/ 13 декабря 2011

Abs возвращает заданный тип, поэтому вам нужно либо выбрать E[i], либо использовать операцию типа sum, либо просто указать i в E.
Например:

abs(np.array([-1, 2, -4])) = array([1, 2, 4])

Если вы хотите, чтобы 2-норма abs(E-e*sin(E)-M[i]) была больше 10^-4, вы должны написать:

np.linalg.norm(abs(E-e*sin(E)-M[i]),2) > 10**(-4)

Если вы ищете что-то еще в условном цикле, добавьте немного больше информации. Прямо сейчас невозможно сделать вывод, что вы хотите.

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