python-无法用 sympy 计算任何浮点数的导数
我敢肯定,一旦我发布了这篇文章,我就会参考关于这个问题的每一个 StackOverflow 问题,但是从我所有的挖掘中,我发誓我找不到这个问题的答案。
我似乎无法让 sympydiff()工作。它要么拒绝实际尝试区分表达式,要么吐出那个Cant calculate derivative wrt错误。
到目前为止我的代码:
x = np.arange(0, np.pi * 2, 0.1)
slope = diff(np.cos(x), x)
(我想指出我有比这更多的代码,但我已将其隔离为问题部分。另外,是的,我确实导入并加载了这两个库)
当我运行那个位时,它会抛出一个Cant calculate derivative wrt 1.00000000000000. 所以我的下一个想法是“也许它试图计算关于变量值的导数,而不是实际变量本身”,所以我删除了这个x = np.arange(0, np.pi * 2, 0.1)位,但当然 python 说这个变量是未定义的。所以,我只是给了它一个单一的值 0,但是它说First variable cannot be a number: 0(是的,如果我改变这个值,它只会改变错误中给出的值)。
所以作为最后的尝试,我决定尝试slope = diff(np.cos(x), 'x'),而且令人惊讶的是,这似乎奏效了。但是当我试图让它显示“斜率”实际上等于什么时,它只是说 0,这显然是不正确的。
所以在这一点上,我不知道该怎么办。我花了大约 5 个小时在网上搜索。所有的文档和教程都表明我写得都正确,但这显然不是真的。我不知道我在这里做错了什么。请帮助我,或建议任何其他获取衍生品的方法(最好是象征性的)。
编辑:我实现了 Oscar 的提示,它适用于我设置的测试部分,但是一旦我开始将它与我的代码集成,它再次崩溃,这一次导致'ImmutableDenseNDimArray' object has no attribute 'as_coefficient'错误。
我的代码:
x=np.arange(-np.pi,np.pi,0.01)
n = 127
for i in np.arange(0,n):
an = quad(fc,-np.pi,np.pi)[0] * (1.0/np.pi)
An.append(an)
for i in np.arange(0,n):
bn=quad(fs,-np.pi,np.pi)[0]*(1.0/np.pi)
Bn.append(bn) #putting value in array Bn
for i in np.arange(0,n):
if i==0.0:
symsum += f'An[{i}] / 2'
else:
symsum += f' + (An[{i}] * cos({i} * x) + Bn[{i}] * sin({i} * x))'
print(symsum)
sumf = lambda x: eval(symsum)
sum = sumf(x) #<--error here
ranger = x
x = Symbol('x')
dersymsum = f'{diff(eval(symsum), x)}'
print(dersymsum)
我的测试表明,在 lambda 函数中评估字符串确实会产生一个可行的函数,我通常可以使用相同的np.arange函数在相同的-np.pito范围内评估 x 的np.pi范围。此外,如果我删除 symsum 到 sum 部分的转换,并且只评估导数,它就可以工作,但是如果我把部分放回去,但在推导发生后评估它,通过“ranger”而不是“x” ,它返回相同的错误。很抱歉打扰你们,但我不知道该怎么办。在我看来,没有 np 函数正在评估该函数(因为np.arange应该只指它所做的范围)