我试图创建蒙特卡洛模拟,可用于推导出对集成问题的估计(总结下面积 曲线)。不知道现在该做什么,我被困住了
"为了解决这个问题,我们为0和1之间的x和y生成一个数字(比方说n)随机数对,对于每一对,我们看到点(x,y)是否高于或低于线。我们计算这种情况发生的次数(比如c)。曲线下面积计算为c / n"
真的很困惑请帮忙谢谢
Function MonteCarlo()
Dim a As Integer
Dim b As Integer
Dim x As Double
Dim func As Double
Dim total As Double
Dim result As Double
Dim j As Integer
Dim N As Integer
Console.WriteLine("Enter a")
a = Console.ReadLine()
Console.WriteLine("Enter b")
b = Console.ReadLine()
Console.WriteLine("Enter n")
N = Console.ReadLine()
For j = 1 To N
'Generate a new number between a and b
x = (b - a) * Rnd()
'Evaluate function at new number
func = (x ^ 2) + (2 * x) + 1
'Add to previous value
total = total + func
Next j
result = (total / N) * (b - a)
Console.WriteLine(result)
Console.ReadLine()
Return result
End Function
答案 0 :(得分:0)
您正在曲线下使用MC区域的拒绝方法。
这样做:
将x的范围分为例如100个等间距,非重叠的分档。
对于你的函数y = f(x)=(x ^ 2)+(2 * x)+ 1,生成例如对于10,000个x =(b - a)* Rnd()。
计算每个bin中的y值的数量,并除以10,000以获得“bin概率”。 - > P(X)。
接下来,随机模拟函数的正确方法是使用rejection方法,如下所示:
4A。使用x =(b - a)* Rnd()
绘制随机x值4b中。绘制随机均匀U(0,1)。如果U(0,1)小于p(x),则向bin添加计数。
4c中。继续执行步骤4a-4b 10000次。
现在,您可以使用rejection方法模拟y = f(x)函数。
总的来说,你需要在你做你想做的事情之前掌握这些方法,因为它听起来你在箱数,模拟等方面几乎没有经验。曲线下的区域总是使用这种方法,所以只需要有创意进行整合使用MC。
看看有关MC集成的一些好教科书。