我试着生成随机点并保留曲线内的点,这有点困难。下面是我的代码:
import numpy as np
import matplotlib.pyplot as plt
N=eval(input("Enter the number of points used for integration:"))
a,b=eval(input("Enter the range of integration:"))
def f(x):
return x/(x**2 + 1)
x=np.random.uniform(a,b,N)
y=np.random.uniform(a,b,N)
a=np.linspace(a,b,N)
A=[f(j) for j in x]
xx=x.tolist()
yy=y.tolist()
xx.sort()
yy.sort()
X=[]
Y=[]
for i in range(N):
if yy[i]<A[i]:
Y.append(yy[i])
X.append(xx[i])
plt.plot(a,f(a),color='black',label="given function")
plt.grid()
plt.scatter(X,Y)
plt.legend()
plt.show()
但是我得到的只是一个分布在整个网格中的分布,我在for循环中特别使用了if来表示我的条件,这是怎么回事?
我试着生成随机数,它们保留曲线下的那些,我所期望的正是这样,我试着用sort()对随机数列表排序,但不知何故,这让事情变得更糟。
1条答案
按热度按时间tcbh2hod1#
您可以尝试以下方法:
原始代码的问题在于
y
的值是在下面一行给出的a到b的范围内选择的。y=np.random.uniform(a,b,N)
因为
y
的所有值都大于函数f
生成的值,所以在原始代码中没有任何值落在曲线之下。当函数将x
的每个元素除以x**2+1
时,值应该在0 - 1之间选择。因此,y的每个值应该是0到1之间的小数。此外,我们不需要对值进行排序。