我正在编写一个使用导数来计算错误的程序。
我一直收到此错误:'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'
答案 0 :(得分:0)
这是您的代码的更正版本
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