Python (sympy) TypeError: невозможно объединить объекты 'str' и 'Add' - PullRequest
1 голос
/ 15 декабря 2010

Я пытаюсь использовать сгенерированное мной уравнение, используя sympy.Eq(func, var) в лямбда-выражении.Кажется, он возвращает список объектов Add, который я не знаю, как использовать.Я попытался ввести тип str перед использованием eval, и я попытался from sympy import I, что, я думаю, как-то связано с проблемой.

Вот код и сообщение об ошибке:

py solid.py -vy = (x-1.0) (x-3.0) * 2 1.0 3.0-ось y - метод диска


Вот пример работы:

import sys
import argparse
import math
from scipy import integrate
from sympy import Symbol, Eq, solve, I
import numpy
import pylab

parser = argparse.ArgumentParser(description='Find the volume of the solid of rotation defined. Use * for multiplication and ** to raise a power. Bounds are set equal to the implicit variable. Trailing .0\'s must be used for constants, and parentheses must be escaped ( e.g. \(x-2\) ). Answers are accurate to 6 decimals')
parser.add_argument('var', choices='xy', help='x|y')
parser.add_argument('=', metavar='=', choices='=')
parser.add_argument('equation', help='continous function')
parser.add_argument('a', type=float, help='bound \'a\'')
parser.add_argument('b', type=float, help='bound \'b\'')
parser.add_argument('-axis', choices='xy', help='axis of revolution (default == x)')
parser.add_argument('-m', choices='ds', help='method (disk/shell)')
parser.add_argument('-g', action='store_true', help='show graph')
parser.add_argument('-v', action='store_true', help='verbose (for debugging)')
args = parser.parse_args()


y = Symbol('y')
x =  Symbol('x')

def solve_for_implicit(func, var):
  if var == 'x':
      equation = Eq(eval(func), x)
      func = solve(equation, y)
  else:
      equation = Eq(eval(func), y)
      func = solve(equation, x)

  return func

def volume(var, func, a, b, axis=None, method=None):
  if axis == None: axis = 'x'
  if method == 's': method = 'shell'
  if method == 'd': method = 'disk'

  if var == axis and axis == 'x':
      if args.v: print 'x = y about x'

      if not method == 'disk':
          pass
      else:
          pass

  elif var == axis and axis == 'y':
      # SHELL METHOD
      if args.v: print 'y = x about y'
      if not method == 'disk':
          # this is what should be used for y = x about y
          if args.v: print 'using SHELL method'
          func = eval('lambda x: ' + 'x*(' + func + ')')
          integral = integrate.quad(func, a, b)
          if args.v: print 'integral from', a, 'to', b, '=', integral[0]
          answer = 2 * math.pi * integral[0]
          if args.v: print '2*pi*', integral[0], '=', answer
      else:
          func = solve_for_implicit(func, var)
          print func[0]
          func = eval('lambda y: ' + '(' + str(func[0]) + ')**2')
          integral = integrate.quad(func, a, b)
          if args.v: print 'integral=', integral[0]
          answer = math.pi * integral[0]

  elif not var == axis and axis == 'y':
      # DISK METHOD
      if args.v: print 'x = y about y -- '
      if not method == 'shell':
          pass
      else:
          pass

  elif not var == axis and axis == 'x':
      # DISK
      if args.v: print 'y = x about x --',
      if not method == 'shell':
          pass
      else:
          pass

  return answer


print volume(args.var, args.equation, args.a, args.b, args.axis, args.m)
if args.g: graph(args.equation, args.a, args.b)

Трассировка (последний вызов был последним):
Файл "solid.py", строка 136, в томе для печати(args.var, args.equation, args.a, args.b, args.axis, args.m) Файл «solid.py», строка 75, в объеме func = eval ('lambda y:' + '('+ func [0] + ') ** 2') TypeError: невозможно объединить объекты 'str' и 'Add'

, и когда я пытаюсь вписать его в str (), сначала я получаю следующее:

Файл «solid.py», строка 136, в томе для печати (args.var, args.equation, args.a, args.b, args.axis, args.m) Файл «solid».py ", строка 76, по объему: интеграл = integrate.quad (func, a, b) Файл" /usr/lib/python2.6/dist-packages/scipy/integrate/quadpack.py ", строка 185,in quad retval = _quad (func, a, b, args, full_output, epsabs, epsrel, limit, points) Файл "/usr/lib/python2.6/dist-packages/scipy/integrate/quadpack.py", строка 249, в _quad вернуть _quadpack._qagse (func, a, b, args, full_output, epsabs, epsrel, limit) quadpack.error: Поставляемая функция также не возвращает допустимое значение с плавающей точкой.

также, print func[0] дает:

2.33333333333333 + (0.296296296296298 - y / 2 + (-0.0877914951989024 + (0.592592592592595 - y) 2/4) (1/2)) (1/3) * (1/2 - I * 3 (1/2) / 2) + 0,444444444444444 / ((1/2 - I * 3 * (1/2) / 2) (0,296296296296298 - у / 2 + (-0,0877914951989024 + (0,592592592592595 - у) 2/4) (1/2)) ** (1/3))

всем спасибо за помощь, извините за то, что не предоставили полный скрипт раньше.

1 Ответ

1 голос
/ 15 декабря 2010

«Я пытался привести тип к astr перед использованием eval, и я попытался использовать sympy import I, который, я думаю, как-то связан с проблемой»

Да, без сомнения, именно в этом проблема. Я уверен, что у Numpy есть документация о том, как использовать объекты Add. Преобразование их в строки и последующая их оценка определенно не являются правильным решением.

Кроме чтения документации, вы также можете проверить объекты с помощью dir (func), чтобы увидеть, какие функции и атрибуты у него есть. В интерпретаторе также есть отличная функция справки, поэтому вы можете набрать help (func) и получить информацию.

...