- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写一个简短的程序来近似高斯函数f(x)= exp(-x ^ 2/2)的定积分,我的代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
double gaussian(double x) {
return exp((-pow(x,2))/2);
}
int main(void) {
srand(0);
double valIntegral, yReal = 0, xRand, yRand, yBound;
int xMin, xMax, numTrials, countY = 0;
do {
printf("Please enter the number of trials (n): ");
scanf("%d", &numTrials);
if (numTrials < 1) {
printf("Exiting.\n");
return 0;
}
printf("Enter the interval of integration (a b): ");
scanf("%d %d", &xMin, &xMax);
while (xMin > xMax) { //keeps looping until a valid interval is entered
printf("Invalid interval!\n");
printf("Enter the interval of integration (a b): ");
scanf("%d %d", &xMin, &xMax);
}
//check real y upper bound
if (gaussian((double)xMax) > gaussian((double)xMin))
yBound = gaussian((double)xMax);
else
yBound = gaussian((double)xMin);
for (int i = 0; i < numTrials; i++) {
xRand = (rand()% ((xMax-xMin)*1000 + 1))/1000.00 + xMin; //generate random x value between xMin and xMax to 3 decimal places
yRand = (rand()% (int)(yBound*1000 + 1))/1000.00; //generate random y value between 0 and yBound to 3 decimal places
yReal = gaussian(xRand);
if (yRand < yReal)
countY++;
}
valIntegral = (xMax-xMin)*((double)countY/numTrials);
printf("Integral of exp(-x^2/2) on [%.3lf, %.3lf] with n = %d trials is: %.3lf\n\n", (double)xMin, (double)xMax, numTrials, valIntegral);
countY = 0; //reset countY to 0 for the next run
} while (numTrials >= 1);
return 0;
}
double randomNumber = rand() / (double) RAND MAX;
'/'
之后使用
'%'
而不是
"rand()"
?
最佳答案
数学和编程方面的代码中都有一些逻辑错误/讨论要点。
首先,只是为了摆脱它,我们在这里谈论的是标准高斯,即
除了line 6
上的高斯定义,省略了
标准化术语。考虑到您似乎期望的输出,这似乎是有目的的。很公平。但是,如果您要计算实际积分,这样实际上无限范围(例如[-1000,1000])的总和为1,则需要该项。
我的代码在逻辑上正确吗?
没有。您的代码有两个逻辑错误:一个是line 29
(即if
语句),另一个是line 40
(即valIntegral
的计算),这是第一个逻辑错误的直接后果。
对于第一个错误,请考虑以下图表以了解原因:
您的蒙特卡洛过程有效地考虑了一定范围内的有界框,然后说:“我将点随机放置在此框内,然后计算随机落在曲线下的点总数中所占的比例;然后对整数进行估算边界框本身的面积乘以该比例”。
现在,如果两者
和
位于均值(即0)的左侧,则if
语句将框的上限(即yBound
)正确设置为
使得框的最高边界包含该曲线的最高部分。因此,例如,要估算范围[-2,-1]的积分,您可以将上限设置为
。
同样,如果两者
和
位于平均值的右边,那么您可以将yBound
正确设置为
但是,如果
,您应该将yBound
都设置为
也不
,因为0点高于两者!因此,在这种情况下,您的yBound
应该只是在高斯峰的峰值,即
(如果您使用的是非标准化高斯,则其值为'1')。
因此,正确的if
语句如下:
if (xMax < 0.0)
{ yBound = gaussian((double)xMax); }
else if (xMin > 0.0)
{ yBound = gaussian((double)xMin); }
else
{ yBound = gaussian(0.0); }
line 40
的正确代码应为:
valIntegral = yBound * (xMax-xMin) * (((double)countY)/numTrials);
yBound
为1) 。那么,为什么您仍然得到“错误”的输出?
randomNumber
代码怎么了?
rand()
函数返回[0,
RAND_MAX
]范围内的整数,其中
RAND_MAX
是系统特定的(请看
man 3 rand
)。
%
)的工作方式如下:考虑范围[-0.1,0.3]。此范围跨越0.4个单位。 0.4 * 1000 + 1 =401。对于从0到
RAND_MAX
的随机数,对
rand()
以
401
取模为模,将始终产生范围为[0,400]的随机数。如果再将其除以1000,则会得到[0,0.4]范围内的随机数。将此值添加到您的xmin偏移量(此处为-0.1)中,您将获得[-0.1,0.3]范围内的随机数。
RAND_MAX
不一定能被401整除,因此导致
RAND_MAX
的该范围的顶部代表了一些比较的数字给别人。
rand()
除以
RAND_MAX
函数的结果。
这可以有效地将返回的随机数归一化为[0,1] 范围。这是一件更直接的事情,并且避免了模偏置。
double randomNumber(void) {
return rand() / (double) RAND_MAX;
}
xRand = randomNumber() * (xMax-xMin) + xMin;
yRand = randomNumber() * yBound;
double gaussian(double x) {
return exp((-pow(x,2.0))/2.0) / sqrt(2.0 * M_PI);
}
randomNumber()
方法在“有效无限”范围内(例如[-1000,1000])给出了正确的结果1,而取模方法则倾向于给出大于1的数字。
关于c - C错误输出中高斯函数f(x)= exp(-x ^ 2/2)的蒙特卡洛积分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44224292/
如果我在 sympy 中使用 simplify() 函数,log((exp(x)+1)/exp(x)) 会简化为 log (1+exp(-x)),但是,当我阅读文档时,简化函数“可能会不必要地慢”,我
我正在创建一个 Validator类(class)。我正在尝试实现 Linq SelectMany我的验证器的扩展方法能够使用 Linq 查询组合表达式并验证最终结果,即使基础值发生变化也是如此。 下
我正在尝试编写一个程序来计算 exp(-x) 和 exp(x) 的泰勒级数最多 200 次迭代,对于大 x。 (exp(x)=1+x+x^2/2+...). 我的程序非常简单,看起来应该可以完美运行。
我正在看书,看到这段代码: public Animal getWinner(List animals) { return animals == null || animals.size() =
我正在将脚本从 matlab 复制到 C++ 函数中。但是,对于 exp 函数,我不断得到不同的结果。例如,以下片段: std::complex final_b = std::exp(std::com
我不太了解 Python,但下面的代码片段结果是 0.367879441171 from math import exp window = 10000 td = 1 print exp(-td/win
为什么/何时使用其中一种?我刚刚遇到了一个问题,我在使用一个时收到警告,而在使用另一个时没有警告。 例子: tableView.tableHeaderView = label; // worked [
这个问题在这里已经有了答案: java.lang.Math.log replaced by intrinsic call, why not java.lang.Math.exp()? (1 个回答)
我正在将一些 Python 代码转换为 C 代码。 下面的复数输出上的 Python NumPy exp (6.12323399574e-17-1j) 为 k=1、l=4。 numpy.exp(-2.
我正在尝试学习或生成任何代码来学习字符串day("26.02.2009") --->给我“星期三” 我需要C#中的静态datefunction。 例如: datetime Str_day= Retur
[编辑:整个事情有一个非常简单的解决方案:矩阵使用单数据类型而不是默认的双数据类型] 我刚刚注意到 matlab 中的一个有点奇怪的(我认为)行为,想知道是什么导致了它。我有一个 10000x500
我创建了一个运行良好的网站,但我想添加干净的 url,如 exp.com/sec1 而不是 exp.com/#sec1,我有点用 History.pushState 实现了它,但是当有人重新加载链接将
我目前正在听一个关于自动语音识别 (ASR) 的讲座。最后一讲是关于矢量量化(VQ)和k最近邻(kNN)以及二叉树和高斯混合模型(GMMs)。 据讲师介绍,VQ只是通过计算GMM的一个近似值来加速GM
在 oracle 中,我们有 exp效用。我们将其用作 exp username/password@database .这里我们可以使用提供主机和端口详细信息来导出到远程数据库表吗?如果是,提供这些的
如何使用 at-exp 来包含 blew 原始字符串: package foo } import ( 我是这样写的,但是不能包含“}”字符: #lang at-exp racket/base
我试图了解 http://gruntthepeon.free.fr/ssemath/sse_mathfun.h 中 exp_ps() 的实现或 http://software-lisc.fbk.eu/
我正在使用模板类 ( Pol ) 来计算多项式,并希望使用成员函数 ( .exp() ) 将多项式 P 转换为其指数 e^P。 重载指数函数工作正常,编译器选择原始指数 exp(double)如果T
在python中,我们说万物皆对象, 例如:表达式x
您认为可以使用多个线程来计算指数函数吗?我有一个代码,瓶颈是 long double expl( long double ) 的计算。所有其余的都已经并行化了。我尝试了几种近似值,但到目前为止没有任何
我正在尝试将 exp(x) 函数扩展为泰勒级数。这是代码: double CalcExp(){ double eps = 0.0000000000000000001; double elem = 1.
我是一名优秀的程序员,十分优秀!