绘制曲面,其中 Z 取决于 X 和 Y 的向量

Plot surface where Z depends on a vector of X and Y

我目前正在开发一个小的 python 脚本,该脚本可用于通过径向基函数方法对点进行插值。因此,我想绘制一个表面,其中 Z 值由取决于 X 和 Y 的向量计算。

我需要实现的公式如下所示:

我目前的做法如下:

import numpy as np
import matplotlib.pyplot as plt 

def phi(x):
    return np.exp(- np.power(x, 2))

fig = plt.figure(figsize=(8,7))
ax = fig.add_subplot(projection='3d')

x = np.arange(0, 6, 0.25)
y = np.arange(0, 6, 0.25)
X, Y = np.meshgrid(x, y)

Z = 0.49 * phi(np.linalg.norm(np.array([[1,1], [X,Y]]))) + \
    0.79 * phi(np.linalg.norm(np.array([[2,3], [X,Y]]))) + \
    0.39 * phi(np.linalg.norm(np.array([[4,2], [X,Y]])))

surf = ax.plot_surface(X, Y, Z, cmap='viridis')

plt.xlim(0, 6)
plt.ylim(0, 6)
plt.show()

我传递给 phi() 函数的参数似乎有问题,但我不确定是什么。 那么如何正确计算Z值呢?

注意:我找到了类似的 ,但答案对我的情况没有帮助。

这是重构现有内容的一种方法:

import numpy as np
import numpy.linalg as la
import matplotlib.pyplot as plt 

def phi(x):
    return np.exp(-np.power(x, 2))

fig, ax = plt.subplots(figsize=(8, 7))

x = y = np.arange(0, 6, 0.25)
X, Y = np.meshgrid(x, y)
xy = np.stack([X.flat, Y.flat]).T

Z = (0.49 * phi(la.norm(np.array([[1, 1]]) - xy, axis=1)) +
     0.79 * phi(la.norm(np.array([[2, 3]]) - xy, axis=1)) +
     0.39 * phi(la.norm(np.array([[4, 2]]) - xy, axis=1))
    )

surf = ax.imshow(Z.reshape(X.shape))
plt.show()

这会产生:

正如@Mateo Vial 在评论中提到的,最简单的方法是使用毕达哥拉斯公式计算范数。工作代码如下所示:

import numpy as np
import matplotlib.pyplot as plt 

def phi(x):
    return np.exp(- np.power(x, 2))

fig = plt.figure(figsize=(8,7))
ax = fig.add_subplot(projection='3d')

x = np.arange(0, 6, 0.25)
y = np.arange(0, 6, 0.25)
X, Y = np.meshgrid(x, y)

Z = 0.49 * phi(np.sqrt((1-X)**2+(1-Y)**2)) + \
    0.79 * phi(np.sqrt((2-X)**2+(3-Y)**2)) + \
    0.39 * phi(np.sqrt((4-X)**2+(2-Y)**2))

surf = ax.plot_surface(X, Y, Z, cmap='viridis')

plt.xlim(0, 6)
plt.ylim(0, 6)
plt.show()

现在结果是具有径向基函数的良好插值。