Python中的偏导数

5 投票
4 回答
33198 浏览
提问于 2025-04-18 14:15

我正在慢慢从C语言转向Python。这次我需要从给定的网格中计算偏导数。我知道如何在C语言中做到这一点,所以目前我只是使用内联适配器,也就是下面的代码:

def dz(x,X,Y,Z,dx):
    y = numpy.zeros((X,Y,Z), dtype='double');
    code = """
            int i, j, k;
            for (i=0; i<X-1; i++){
                for(k=0; k<Y; k++){
                    for (j=0; j<Z; j++){
                        y[i,k,j] = (x[i+1, k, j] - x[i, k, j])/dx;
                        }
                    }
                }
            for (j=0; j<Z; j++){
                for(k=0; k<Y; k++){
                    y[X-1,k,j] = - x[X-1, k, j]/dx;
                    }
                }
        """
    weave.inline(code, ['x', 'y', 'dx', 'X', 'Y', 'Z'], \
                type_converters=converters.blitz, compiler = 'gcc');
    return y;

在这段代码中,xy是三维的numpy数组,正如你所看到的,第二个循环是用来处理边界条件的。当然,我可以用纯Python实现相同的逻辑,但那样代码会效率很低。不过,我想知道是否可以仅用numpy来计算偏导数?如果有人能提供帮助,我会非常感激。

4 个回答

1

numpy.gradient 现在可以支持在单个方向上计算导数了。

a = np.array([[1,2,3],[2,3,5]])
np.gradient(a, axis=0)

这会在轴 0 上给出一个单独的偏导数:

array([[1., 1., 2.],
       [1., 1., 2.]])

参数 axis 用来指定计算导数的方向。

2

在编程中,有时候我们会遇到一些问题,特别是在使用某些工具或库的时候。比如说,当你在写代码时,可能会发现某个功能没有按照你的预期工作。这种情况可能是因为你没有正确使用这个功能,或者是因为它本身存在一些限制。

有些时候,解决这些问题需要查阅文档,看看这个功能的具体用法和注意事项。文档通常会提供一些示例,帮助你理解如何正确使用它。

另外,社区论坛,比如StackOverflow,常常是一个很好的资源。在那里,你可以找到其他开发者遇到的类似问题和解决方案。通过阅读他们的提问和回答,你可以获得一些灵感,帮助你解决自己的问题。

总之,遇到问题时,不要气馁,查阅文档和社区资源,通常能找到解决办法。

def dz(x,dx):
    y = numpy.zeros(x.shape, dtype='double')
    y[:-1] = (x[1:] - x[:-1]) / dx
    y[-1]  = -x[-1] / dx
    return y
2

如果你在使用numpy,这段代码应该和你上面的代码效果一样:

y = np.empty_like(x)
y[:-1] = (x[1:] - x[:-1]) / dx
y[-1] = -x[-1] / dx

如果你想在第二个轴上得到相同的结果,你可以这样做:

y = np.empty_like(x)
y[:, :-1] = (x[:, 1:] - x[:, :-1]) / dx
y[:, -1] = -x[:, -1] / dx
8

np.diff 可能是使用numpy来做这个事情最常见的方法:

y = np.empty_like(x)
y[:-1] = np.diff(x, axis=0) / dx
y[-1] = -x[-1] / dx

你可能还会对np.gradient感兴趣,虽然这个函数是计算输入数组所有维度的梯度,而不是单一的维度。

撰写回答