将锥形半环面拟合到 python 中的散点图

Fitting a coned semi torus surface to a scatter plot in python

所以也许这更像是一个数学问题,但我有点卡在这个问题上。我有一个散点图,正在尝试为其拟合一个曲面。使用两个高斯函数 相当 很好,但它并不完美,因为我知道原始数据来自环面,所以我想强制拟合使用具有强度的椭圆。

我目前创建的如下图:

你可以看到它的效果还不错,但它并没有给我想要的完美圆环形状。我现在向您展示我目前正在使用的和已经尝试过的拟合函数。

生成绘图:

# Our function to fit is going to be a sum of two-dimensional Gaussians
def gaussian(x, y, x0, y0, xalpha, yalpha, A):
    return A * np.exp( -((x-x0)/xalpha)**2 -((y-y0)/yalpha)**2)

# This is the callable that is passed to curve_fit. M is a (2,N) array
# where N is the total number of data points in Z, which will be ravelled
# to one dimension.
def _gaussian(M, *args):
    x, y = M
    arr = np.zeros(x.shape)
    for i in range(len(args)//5):
       arr += gaussian(x, y, *args[i*5:i*5+5])
    return arr

还有我试过的其他人:

def distancefromellips(x, y, h, a, k, b):
    xfact = (x-h)**2/a**2
    yfact = (x-k)**2/b**2
    return abs(xfact-yfact-1)

def distanceandgauss(x,y,h,a,k,b,x0, y0, xalpha, yalpha, A):
    return distancefromellips(x, y, h, a, k, b) * gaussian(x, y, x0, y0, xalpha, yalpha, A)

def _ellipseG(M, *args):
    x, y = M
    arr = np.zeros(x.shape)
    for i in range(len(args)//9):
       arr += distanceandgauss(x, y, *args[i*9:i*9+9])
    return arr

告诉我你的想法。也许解决方案只是更多的高斯? TIA.

解决方法是在极坐标中使用函数。 “锥形环面”只是 R 上的高斯分布,在 theta 上有一些变化。函数如:

def polarf(x, y, a, b, c, d, A, B, C, lamb):
    r = np.sqrt(x**2 + y**2)
    #print(r)
    theta = np.arctan(y/x)
    #print(theta.min())
    return a * np.cos(theta*A) * np.exp(-(((r-b+B*np.cos(theta))**2)/c)) * (C*(np.exp(-lamb)*(lamb**r))/scipy.special.gamma(r+1)) #Standard best fit so far

提供这样的图像效果很好: