Как исправить ошибку «объект ‘Mul’ не имеет атрибута ‘sp’ » в Python (используя Sympy

#python #sympy

#python #sympy

Вопрос:

Я создаю программу, которая использует производные для вычисления ошибки.

Я продолжаю получать эту ошибку: объект ‘Mul’ не имеет атрибута ‘sp’.

Решения этой ошибки, которые я нашел до сих пор, заключаются в том, что люди импортируют все из sympy и math (из sympy / math import *), потому что и sympy, и math имеют функцию sin().

Но, как вы можете видеть из моего кода ниже, у меня этого нет, и ошибка все еще появляется, почему?

 import sympy as sp
from math import factorial

def F(x):
  return 4*(x**2) sp.sin(9*x)

sp.init_printing()
x=sp.symbols('x')
def D1(x1):
  return(sp.diff(F(x),x,1).sp.subs(x,x1))

def D2(x1):
  return(sp.diff(F(x),x,2).sp.subs(x,x1))

def D3(x1):
  return(sp.diff(F(x),x,3).sp.subs(x,x1))

def maxD3(x1,x2):
  if(D3(x1)>D3(x2)):
    return D3(x1)
  else:
    return D3(x2)

erro1 = (1/factorial(3))*maxD3(-1,1)*abs((0.3-(-1))*(0.3-1))
erro1 = (1/factorial(3))*maxD3(-1,1)*abs((0.83-(-1))*(0.83-1))

print("Erro f(0.3): ", erro1)
print("Erro f(0.83): ", erro2)

  

Также изменили «из факториала импорта математики» на «импортировать математику как математику», и ошибка также продолжает отображаться.

Я использую Python 3.6.1.

РЕДАКТИРОВАТЬ: полная трассировка

 Traceback (most recent call last):
  File "main.py", line 24, in <module>
    erro1 = (1/math.factorial(3))*maxD3(-1,1)*abs((0.3-(-1))*(0.3-1))
  File "main.py", line 19, in maxD3
    if(D3(x1)>D3(x2)):
  File "main.py", line 16, in D3
    return(sp.diff(F(x),x,3).sp.subs(x,x1))
AttributeError: 'Mul' object has no attribute 'sp'
  

Комментарии:

1. import math as math ничего не делает. Вы присваиваете модулю псевдоним с его собственным именем

2. Пожалуйста, покажите полную обратную трассировку

3. sp.diff(F(x),x,1).sp.subs(x,x1) у меня нет средств для тестирования, но это выглядит не очень хорошо. Зачем снова ссылаться на модуль? Похоже, вы пытаетесь связать операции, которые должны выполняться поэтапно

4. @roganjosh я сделал это перед импортом всего (*) из sympy, поэтому мне пришлось написать like diff(F(x),x,1).subs(x,x1) и это сработало, я просто добавил sp сейчас, потому что мне пришлось импортировать по-другому. Я не думаю, что это проблема

5. Конечно, это другое. Вы связываете операторы и ссылаетесь на модуль. Вы не можете этого сделать.

Ответ №1:

Это исправленная версия вашего кода

 import sympy as sp
from math import factorial

def F(x):
  return 4*(x**2) sp.sin(9*x)

sp.init_printing()
x=sp.symbols('x')
def D1(x1):
  return(sp.diff(F(x),x,1).subs(x,x1)) # subs instead of sp.subs

def D2(x1):
  return(sp.diff(F(x),x,2).subs(x,x1)) # subs instead of sp.subs

def D3(x1):
  return(sp.diff(F(x),x,3).sp.subs(x,x1))

def maxD3(x1,x2):
  if(D3(x1)>D3(x2)):
    return D3(x1)
  else:
    return D3(x2)

erro1 = (1/factorial(3))*maxD3(-1,1)*abs((0.3-(-1))*(0.3-1))
erro2 = (1/factorial(3))*maxD3(-1,1)*abs((0.83-(-1))*(0.83-1)) # erro2 instead of erro1

print("Erro f(0.3): ", erro1)
print("Erro f(0.83): ", erro2)
  

Вывод в моей системе:

 ('Erro f(0.83): ', 0)

('Erro f(0.83): ', 0)
  

Это ожидаемый результат?

Кроме того, вам не нужно импортировать все из sympy. Вы можете просто импортировать то, что вам нужно. Пример:

 >>> from sympy import sin, symbols, diff
>>> x = symbols('x')
>>> f = x**3   sin(x)
>>> print(diff(f, x))
3*x**2   cos(x)
>>> print(diff(f, x).subs(x, 1))
cos(1)   3