Function 从0(在边缘)到1(在中心)的类似渐晕图的函数,没有尖角

Function 从0(在边缘)到1(在中心)的类似渐晕图的函数,没有尖角,function,math,Function,Math,我有一张图片,在左上角有一个标准化坐标-1,-1,在中间有0,0,在右下角有1,我想要一个函数来输出一个0,一个1。我试过一些fx,y=1-maxabsx,absy,但会产生尖角: 什么函数能产生更圆的输出,而不是像金字塔一样的函数?找到了它。我必须使用这样的二次方程: fx,y=-1/sqrt2*x**2-1/sqrt2*y**2+1 这就产生了这样一个很好的小插曲 找到了。我必须使用这样的二次方程: fx,y=-1/sqrt2*x**2-1/sqrt2*y**2+1 这就产生了这样一个很好的

我有一张图片,在左上角有一个标准化坐标-1,-1,在中间有0,0,在右下角有1,我想要一个函数来输出一个0,一个1。我试过一些fx,y=1-maxabsx,absy,但会产生尖角:


什么函数能产生更圆的输出,而不是像金字塔一样的函数?

找到了它。我必须使用这样的二次方程:

fx,y=-1/sqrt2*x**2-1/sqrt2*y**2+1

这就产生了这样一个很好的小插曲


找到了。我必须使用这样的二次方程:

fx,y=-1/sqrt2*x**2-1/sqrt2*y**2+1

这就产生了这样一个很好的小插曲


由于您似乎并不关心沿边缘的无限衰减,正如您所发现的,抛物线绝对是一种可能的选择。事实上,任何单调函数都可以通过将其应用于半径来生成该类型的圆锥体:

f(r) = 1 - r/sqrt(2)
r = sqrt(x^2 + y^2)
这就形成了一个线性圆锥。你的答案相当于

f(r) = 1 - (r/sqrt(2))^2
你可以增加r的力量,只要你想得到类似的结果,中心区域更分散,下降幅度更大。使用小于1的力量会使中心的山峰变得尖锐

在这种情况下,更典型的函数是高斯函数。您不一定在角点处有零,但这是一个普遍存在的函数,您可能应该了解:

f(r) = exp(-0.5*(r/s)^2)

这里是排列的标准偏差,它决定了峰值的宽度。

因为你似乎不关心沿边缘的无限衰减,正如你所发现的,抛物线绝对是一种可能的选择。事实上,任何单调函数都可以通过将其应用于半径来生成该类型的圆锥体:

f(r) = 1 - r/sqrt(2)
r = sqrt(x^2 + y^2)
这就形成了一个线性圆锥。你的答案相当于

f(r) = 1 - (r/sqrt(2))^2
你可以增加r的力量,只要你想得到类似的结果,中心区域更分散,下降幅度更大。使用小于1的力量会使中心的山峰变得尖锐

在这种情况下,更典型的函数是高斯函数。您不一定在角点处有零,但这是一个普遍存在的函数,您可能应该了解:

f(r) = exp(-0.5*(r/s)^2)

这里是排列的标准偏差,确定峰值的宽度。

您的函数使用到原点的平方距离。更平滑的版本将使用距离本身。还请注意,您的公式-1/sqrt2*x**2-1/sqrt2*y**2+1可以简化为1-x**2+y**2/2

这里比较了左边的平方距离、中间的距离和右边@Madphestics提出的公式。图像被放大一点,以便更好地说明边界附近正在发生的事情。等高线图用于显示如何平滑这些值:

import numpy as np
import matplotlib.pyplot as plt

k = 1.2
x, y = np.meshgrid(np.linspace(-k, k, 100), np.linspace(-k, k, 100))

sqrt2 = np.sqrt(2)
fig, axes = plt.subplots(nrows=2, ncols=3, figsize=(12, 6))
for i, axrow in enumerate(axes):
    for j, ax in enumerate(axrow):
        if j == 0:
            f = -(1 / sqrt2 * x) ** 2 - (1 / sqrt2 * y) ** 2 + 1  # f =  1 - (x**2 + y**2) / 2
        elif j == 1:
            f = 1 - np.sqrt(x * x + y * y) / sqrt2
        else:
            s = 0.65
            f = np.exp(-0.5 * (np.sqrt(x * x + y * y) / s) ** 2)
        img = ax.imshow(f, cmap='Greys_r', extent=[-k, k, -k, k], vmin=0, vmax=1)
        if i == 0:
            img = ax.contour(x, y, f, levels=np.linspace(0, 1, 11), cmap='inferno_r')
        ax.axhline(1, color='red', ls=':')
        ax.axhline(-1, color='red', ls=':')
        ax.axvline(1, color='red', ls=':')
        ax.axvline(-1, color='red', ls=':')
        plt.colorbar(img, ax=ax)
plt.tight_layout()
plt.show()

您的函数使用到原点的平方距离。更平滑的版本将使用距离本身。还请注意,您的公式-1/sqrt2*x**2-1/sqrt2*y**2+1可以简化为1-x**2+y**2/2

这里比较了左边的平方距离、中间的距离和右边@Madphestics提出的公式。图像被放大一点,以便更好地说明边界附近正在发生的事情。等高线图用于显示如何平滑这些值:

import numpy as np
import matplotlib.pyplot as plt

k = 1.2
x, y = np.meshgrid(np.linspace(-k, k, 100), np.linspace(-k, k, 100))

sqrt2 = np.sqrt(2)
fig, axes = plt.subplots(nrows=2, ncols=3, figsize=(12, 6))
for i, axrow in enumerate(axes):
    for j, ax in enumerate(axrow):
        if j == 0:
            f = -(1 / sqrt2 * x) ** 2 - (1 / sqrt2 * y) ** 2 + 1  # f =  1 - (x**2 + y**2) / 2
        elif j == 1:
            f = 1 - np.sqrt(x * x + y * y) / sqrt2
        else:
            s = 0.65
            f = np.exp(-0.5 * (np.sqrt(x * x + y * y) / s) ** 2)
        img = ax.imshow(f, cmap='Greys_r', extent=[-k, k, -k, k], vmin=0, vmax=1)
        if i == 0:
            img = ax.contour(x, y, f, levels=np.linspace(0, 1, 11), cmap='inferno_r')
        ax.axhline(1, color='red', ls=':')
        ax.axhline(-1, color='red', ls=':')
        ax.axvline(1, color='red', ls=':')
        ax.axvline(-1, color='red', ls=':')
        plt.colorbar(img, ax=ax)
plt.tight_layout()
plt.show()

你说的更全面的输出是什么意思?如果没有尖锐的边缘,absx==Absyth这是非常主观的,那么我已经发布了一个答案…别忘了选择一个答案你说的更全面的输出是什么意思?如果没有尖锐的边缘,absx==Absyth这是非常主观的,我发布了一个答案…别忘了选择答案是的,x^2+y^2=r^2是一个半径为r的圆的方程,半径为r,原点为。不过,我没有得到斧头的标签。原点应该在中心@安德烈亚斯雷杰布兰德。这些只是matplotlib像素坐标。原点在中心,角点在+/-1,+/-1,如问题中所述是的,x^2+y^2=r^2是半径为r的圆关于原点的方程式。不过,我没有得到斧头的标签。原点应该在中心@安德烈亚斯雷杰布兰德。这些只是matplotlib像素坐标。原点在中心,角点在+/-1,+/-1,如问题中所述。从概念上讲,将平方根保留在括号中是很好的,因为它表示角点处值的缩放。从概念上讲,将平方根保留在括号中是很好的,因为它表示角点处值的缩放。