无法计算任何带有符号的浮点的导数



我敢肯定,一旦我发布了这篇文章,我会被问到的每个StackOverflow问题所引用,但从我所有的挖掘中,我发誓我找不到答案。

我似乎无法让症状的diff()发挥作用。它要么拒绝实际尝试区分表达式,要么抛出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函数中计算字符串确实会产生一个可行的函数,我通常可以在x的范围内使用相同的np.arange函数,在相同的-np.pinp.pi的范围内计算该函数。此外,如果我去掉了符号和到和部分的转换,只计算导数,它是有效的,但如果我把部分放回,但在导数发生后计算它,通过"ranger"而不是"x",它会返回相同的错误。很抱歉打扰了你们,但我不知道该怎么办。在我看来,没有np函数可以被评估(因为np.arange应该只指它所做的范围)

如果你想要符号导数,那么NumPy在这方面不起作用:

In [7]: import sympy
In [8]: x = sympy.Symbol('x')
In [9]: sympy.diff(sympy.cos(x), x)
Out[9]: -sin(x)

https://docs.sympy.org/latest/tutorial/intro.html#what-是符号计算

最新更新