2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 [Python] Использование методов all и аny
Сообщение15.03.2016, 17:09 
Здравствуйте. В python (X,Y) пытаюсь построить график при помощи matplotlib.
Код:
import matplotlib.pyplot as plt
from math import *
from numpy import *
def X(t):
   gm1 = -0.006534391013910179
   gm2 = -0.2754656089860898
   cstar=10
   ts = 80
   k = 0.05
   if 0<=t<=ts:
      return e**(gm1*t)/gm1**2-(t/gm1+1//gm1**2)
   elif t> ts:
      X1 = (k/cstar)*(e**(gm1*ts)/gm1**2)-(ts/gm1+1/gm1**2)
      X2 = (k*ts/cstar)*(e**(gm1*(t-ts))-1)
      return X1 + X2
   else:
      return 0
t = linspace(0,100,10)
y = X(t)
plt.plot(t,y)
plt.savefig('X_15.03.2016.png')

При вызове python получаю следующее:
Код:
Traceback (most recent call last):
  File "adv_pr.py", line 19, in <module>
    y = X(t)
  File "adv_pr.py", line 10, in X
    if 0<=t<=ts:
ValueError: The truth value of an array with more than one element is ambiguous.
Use a.any() or a.all()

Понимаю, что мне предлагают использовать методы a.all() или a.any(), но как?
Новой переменной присвоить результат сравнения и использовать на ней один из этих методов?

 
 
 
 Re: построение графика при помощи matplotlib
Сообщение16.03.2016, 15:46 
Аватара пользователя
Вы ведь понимаете смысл предупреждения «The truth value of an array with more than one element is ambiguous»? Это значит, что результат сравнения всего массива с True неоднозначен и неопределим. Вам предлагается изменить эту операцию таким образом, чтобы сравнение стало разрешимым и однозначным. Вместо неопределимого «сравнения всего массива с True» мы можем сравнить с истиной каждый из его элементов и:
а) либо сказать, что результат равен True, если равно True хотя бы одно из сравнений (это a.any(), логическое ИЛИ)
б) либо сказать, что результат равен True, если все сравнения элементов массива выдают True (это a.all(), логическое И).
Надеюсь, это объяснение было не слишком сумбурным.

 
 
 
 Re: построение графика при помощи matplotlib
Сообщение16.03.2016, 16:48 
Аватара пользователя
Кстати, эти два метода — не единственные, какие можно придумать.

 
 
 
 Re: [Python] Использование методов all и аny
Сообщение23.03.2016, 23:34 
Проблема в том, что функция ожидает одно значение аргумента, а к ней обращаются с целым массивом, надеясь, что она векторизована. Есть два способа исправить ситуацию. Первый - плохой, тупо сделать
Код:
y=map(X,t)

Второй - хороший, векторизовать функцию, например:
Код:
   return piecewise(t, [0<=t<=ts,t>ts],
                    [lambda t: e**(gm1*t)/gm1**2-(t/gm1+1//gm1**2),
                     lambda t: (k/cstar)*(e**(gm1*ts)/gm1**2)-(ts/gm1+1/gm1**2) +
                               (k*ts/cstar)*(e**(gm1*(t-ts))-1)])

 
 
 [ Сообщений: 4 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group