numpy 难以获得某个函数曲线下的点

5kgi1eie  于 2023-01-30  发布在  其他
关注(0)|答案(1)|浏览(120)

我试着生成随机点并保留曲线内的点,这有点困难。下面是我的代码:

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()对随机数列表排序,但不知何故,这让事情变得更糟。

tcbh2hod

tcbh2hod1#

您可以尝试以下方法:

def f(x):
    return x/(x**2 + 1)

x=np.random.uniform(a,b,N)
y=np.random.uniform(0,1,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()

原始代码的问题在于y的值是在下面一行给出的a到b的范围内选择的。
y=np.random.uniform(a,b,N)
因为y的所有值都大于函数f生成的值,所以在原始代码中没有任何值落在曲线之下。当函数将x的每个元素除以x**2+1时,值应该在0 - 1之间选择。因此,y的每个值应该是0到1之间的小数。
此外,我们不需要对值进行排序。

相关问题