如何通过20个点的坐标,构造一个高斯函数?已知这20个点的坐标,请给出代码范例
时间: 2023-12-10 15:39:54 浏览: 75
构造高斯函数可以使用以下公式:
$$f(x,y) = A\,\exp\left[-\frac{(x-x_0)^2+(y-y_0)^2}{2\sigma^2}\right]$$
其中 $A$ 为振幅,$x_0$ 和 $y_0$ 为中心点坐标,$\sigma$ 为标准差。为了通过20个点的坐标来构造高斯函数,可以采用最小二乘法进行拟合。
下面是一个 Python 的示例代码,可以通过给定的20个点坐标,拟合出高斯函数:
```python
import numpy as np
from scipy.optimize import curve_fit
# 定义高斯函数
def gauss(x, y, A, x0, y0, sigma):
return A * np.exp(-((x-x0)**2 + (y-y0)**2)/(2*sigma**2))
# 生成20个点的坐标
x = np.linspace(-10, 10, 5)
y = np.linspace(-10, 10, 5)
X, Y = np.meshgrid(x, y)
Z = np.zeros_like(X)
for i in range(len(x)):
for j in range(len(y)):
Z[i][j] = gauss(X[i][j], Y[i][j], 2, 0, 0, 1) + np.random.normal(0, 0.1) # 加上随机噪声
# 定义拟合函数
def fit_func(xy, A, x0, y0, sigma):
x, y = xy
return gauss(x, y, A, x0, y0, sigma)
# 进行拟合
xy = np.vstack([X.ravel(), Y.ravel()])
popt, pcov = curve_fit(fit_func, xy, Z.ravel(), p0=[1, 0, 0, 1])
# 输出拟合结果
print("A = {:.3f}, x0 = {:.3f}, y0 = {:.3f}, sigma = {:.3f}".format(*popt))
# 生成拟合的高斯函数
Z_fit = gauss(X, Y, *popt)
# 可视化结果
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(X, Y, Z)
ax.plot_surface(X, Y, Z_fit)
plt.show()
```
这段代码将生成一个 $5 \times 5$ 的网格,然后在每个网格点上生成一个高斯分布加上一些随机噪声,最后使用最小二乘法拟合出原始高斯分布的参数。最终结果是一个三维图像,其中蓝色的曲面是原始高斯分布,红色的曲面是拟合结果。
由于每次运行程序生成的随机噪声都不同,因此每次运行程序得到的结果也可能不同。
阅读全文