我写了一个可区分的Heaviside函数并将其矢量化。但是,输出似乎是奇数和二进制。代码如下:
import numpy as np
import matplotlib.pyplot as plt
def heaviside(x, epis):
if (x>= epis):
y=1
elif (x< -epis):
y=0;
else:
y = 0.5 + x/(2*epis) + np.sin(np.pi*x/epis)/(2*np.pi);
print (x, y);
return y;
x1 = np.linspace(-1, 1, 100);
vheaviside = np.vectorize(heaviside);
y1 = vheaviside(x1, 0.2);
plt.plot(x1, y1, 'b', alpha=0.3)
plt.show()
输入是[-1, 1]
中的数组,输出应该是连续的Heaviside函数。但是,所有输出都是0
或1
。为什么呢?
答案 0 :(得分:3)
您需要指定float
使用vheaviside = np.vectorize(heaviside, [float])
时应该使用的函数的时间:
heaviside
否则,根据文件:
输出类型是通过评估输入的第一个元素
来确定的
在这种情况下是一个整数。或者,请确保y = 1
始终返回浮点数,例如, y = 1.0
与app.js
。
答案 1 :(得分:1)
使用Numpy定义矢量化Heaviside函数的一种更简单,更有效的方法是使用numpy.piecewise
:
def heaviside(x, epis):
return np.piecewise(x, (x>=epis, x<-epis),
(1, 0, lambda x: 0.5 + x/(2*epis) + np.sin(np.pi*x/epis)/(2*np.pi) ) )
答案 2 :(得分:0)
据我所知,只有不连续的一个。试试这个:
def h(x):
if x == 0:
return 0.5
return 0 if x < 0 else 1