Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何计算场的拉普拉斯函数?_Python_Numpy_Scipy - Fatal编程技术网

Python 如何计算场的拉普拉斯函数?

Python 如何计算场的拉普拉斯函数?,python,numpy,scipy,Python,Numpy,Scipy,我试图用scipy.ndimage.convalve计算二维场a的拉普拉斯函数 但这似乎并没有给我正确的答案。你有没有试过另一种拉普拉斯卷积核,比如[[1,1,1][1,-8,1][1,1,1]]?你有没有试过另一种拉普拉斯卷积核,比如[[1,1,1][1,1][1,1][8,1][1,1][1,1],我的机器上最新的SciPy也能用 我建议您绘制图像ndimage.convolve(…),以查看卷积如何改变图像 例如: image = vstack(arange(-10, 10)**2 for

我试图用scipy.ndimage.convalve计算二维场a的拉普拉斯函数


但这似乎并没有给我正确的答案。你有没有试过另一种拉普拉斯卷积核,比如
[[1,1,1][1,-8,1][1,1,1]]

你有没有试过另一种拉普拉斯卷积核,比如
[[1,1,1][1,1][1,1][8,1][1,1][1,1]
,我的机器上最新的SciPy也能用

我建议您绘制
图像ndimage.convolve(…)
,以查看卷积如何改变图像

例如:

image = vstack(arange(-10, 10)**2 for _ in range(20))
ndimage.convolve(image, stencil, mode='wrap')
屈服

array([[-38,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,...)

这是非常正确的(x**2的二阶导数是2)-除了左边框。

我尝试了你的例子,它确实适用于我机器上最新的SciPy

我建议您绘制
图像ndimage.convolve(…)
,以查看卷积如何改变图像

例如:

image = vstack(arange(-10, 10)**2 for _ in range(20))
ndimage.convolve(image, stencil, mode='wrap')
屈服

array([[-38,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,   2,...)

这是非常正确的(x**2的二阶导数是2)-除了左边框。

我有另一个想法:为了近似拉普拉斯坐标,你是否考虑过你的模板应该除以步长**2,其中步长是网格的步长?只有这样,才能将ndimage.convolve结果与分析结果进行比较

事实上,使用高斯函数,我得到的结果表明ndimage.convalve工作得非常好:

from scipy import ndimage

stencil = numpy.array([[0, 1, 0],[1, -4, 1], [0, 1, 0]])
x = linspace(-10, 10, 100)
y = linspace(-10, 10, 100)
xx, yy = meshgrid(x, y)
image = exp(-xx**2-yy**2)  # Standard deviation in x or y: 1/sqrt(2)

laplaced = ndimage.convolve(image, stencil)/(x[1]-x[0])**2  # stencil from original post
expected_result = -4*image + 8*(xx**2+yy**2)*image  # Very close to laplaced, in most points!

我有另一个想法:为了近似拉普拉斯坐标,您是否考虑过模板应该除以步长**2,其中步长是网格的步长?只有这样,才能将ndimage.convolve结果与分析结果进行比较

事实上,使用高斯函数,我得到的结果表明ndimage.convalve工作得非常好:

from scipy import ndimage

stencil = numpy.array([[0, 1, 0],[1, -4, 1], [0, 1, 0]])
x = linspace(-10, 10, 100)
y = linspace(-10, 10, 100)
xx, yy = meshgrid(x, y)
image = exp(-xx**2-yy**2)  # Standard deviation in x or y: 1/sqrt(2)

laplaced = ndimage.convolve(image, stencil)/(x[1]-x[0])**2  # stencil from original post
expected_result = -4*image + 8*(xx**2+yy**2)*image  # Very close to laplaced, in most points!

5年前我不知道还有人关心

我认为这是因为卷积法只是一种近似,模板基本上是通过有限离散微分来近似二阶导数。增量越小,数值近似值越接近

我根据别人的信息做了一些测试。下面是代码和结果图:

import numpy
import scipy.ndimage.filters as filters
import scipy.signal as signal
import matplotlib.pyplot as plt


stencil=numpy.array([[0,1,0],[1,-4,1],[0,1,0]])

fig=plt.figure(figsize=(10,10),dpi=100)

for ii,jj in enumerate([10,100,1000,10000]):

    x=numpy.linspace(-5,5,jj)
    xx,yy=numpy.meshgrid(x,x)
    step=x[1]-x[0]

    image=numpy.exp(-xx**2-yy**2)

    lap1=filters.laplace(image)/step**2
    #lap2=filters.convolve(image,stencil,mode='wrap')/step**2
    #lap3=signal.convolve2d(image,stencil,mode='same')/step**2
    lap4=4*image*(xx**2+yy**2)-4*image

    ax=fig.add_subplot(2,2,ii+1)
    img=ax.imshow(lap1-lap4)
    ax.set_title('stencil - analytical (dx=%.4f)' %step)
    plt.colorbar(img)

fig.tight_layout()
plt.show()

filters.laplace()
filters.convalve()
signal.convalve2d()
都给出了非常接近的结果(事实上,如果您查看filters.laplace()的源代码,它所做的事情基本上与卷积模具内核相同),因此我只包括
filters.laplace()
一个。 请注意,上面的所有值都没有除以步长的平方


该图显示,增量步长越小,越接近解析解(即
4z(x^2+y^2)-4z

5年前,我不知道还有人关心

我认为这是因为卷积法只是一种近似,模板基本上是通过有限离散微分来近似二阶导数。增量越小,数值近似值越接近

我根据别人的信息做了一些测试。下面是代码和结果图:

import numpy
import scipy.ndimage.filters as filters
import scipy.signal as signal
import matplotlib.pyplot as plt


stencil=numpy.array([[0,1,0],[1,-4,1],[0,1,0]])

fig=plt.figure(figsize=(10,10),dpi=100)

for ii,jj in enumerate([10,100,1000,10000]):

    x=numpy.linspace(-5,5,jj)
    xx,yy=numpy.meshgrid(x,x)
    step=x[1]-x[0]

    image=numpy.exp(-xx**2-yy**2)

    lap1=filters.laplace(image)/step**2
    #lap2=filters.convolve(image,stencil,mode='wrap')/step**2
    #lap3=signal.convolve2d(image,stencil,mode='same')/step**2
    lap4=4*image*(xx**2+yy**2)-4*image

    ax=fig.add_subplot(2,2,ii+1)
    img=ax.imshow(lap1-lap4)
    ax.set_title('stencil - analytical (dx=%.4f)' %step)
    plt.colorbar(img)

fig.tight_layout()
plt.show()

filters.laplace()
filters.convalve()
signal.convalve2d()
都给出了非常接近的结果(事实上,如果您查看filters.laplace()的源代码,它所做的事情基本上与卷积模具内核相同),因此我只包括
filters.laplace()
一个。 请注意,上面的所有值都没有除以步长的平方


该图显示,增量步长越小,越接近解析解(即
4z(x^2+y^2)-4z

这看起来怎么不对劲?你有一个例子来比较吗?我在二维高斯图像上测试这个。所以我有一个数组,在这里我用解析的方法计算了高斯函数的拉普拉斯函数,然后我用数值拉普拉斯函数计算了高斯函数本身。当我计算两者之间的差值时,结果并不接近于0。我似乎记得带拉普拉斯核的卷积只是拉普拉斯变换的近似值……拉普拉斯变换的意思是:d^2(φ)/dx^2+d^2(φ)/dy^2。我使用的模板应该是拉普拉斯的有限差分近似值。它怎么看起来不正确?你有一个例子来比较吗?我在二维高斯图像上测试这个。所以我有一个数组,在这里我用解析的方法计算了高斯函数的拉普拉斯函数,然后我用数值拉普拉斯函数计算了高斯函数本身。当我计算两者之间的差值时,结果并不接近于0。我似乎记得带拉普拉斯核的卷积只是拉普拉斯变换的近似值……拉普拉斯变换的意思是:d^2(φ)/dx^2+d^2(φ)/dy^2。我使用的模板应该是拉普拉斯算子的有限差分近似。我得到了相同的结果,在1d中这对高斯函数有效,但2d高斯函数对我仍然无效。我得到了相同的结果,在一维中,这适用于高斯分布,但二维高斯分布仍然不适用于我。我在处理结果矩阵时确实考虑到了这一点。我想我看到的问题是我使用的网格太小了。我在处理结果矩阵时确实考虑到了这一点。我想我看到的问题是我使用的网格太小。这是一个有用的演示,谢谢。这表明该步骤不包括在功能有用的演示中,谢谢。这表明该步骤不包括在函数中