使用polyroot()或寻找其他方法来计算P[实根]

使用polyroot()或寻找其他方法来计算P[实根],r,R,假设A、B和C是独立的随机变量,每个都均匀分布在0,1上。 AX^2+BX+C有实根的概率是多少 我发现概率是2544 如何使用R验证您的答案是否正确?R中的命令是否有助于确定这一点 你需要写一个程序来计算p[实根]吗?有人告诉我,使用polyroot所需的CPU时间是您对此问题的分析解决方案(即5+6log2/36)所建议的更直接的方法的40倍 此外,除非你精通浮点运算,否则你会得到一个微妙的错误结果。请注意,R中的此类计算量实际上无法验证此类数学结果;它只能证实这一点,也就是说,您希望代码输

假设A、B和C是独立的随机变量,每个都均匀分布在0,1上。 AX^2+BX+C有实根的概率是多少

我发现概率是2544

如何使用R验证您的答案是否正确?R中的命令是否有助于确定这一点

你需要写一个程序来计算p[实根]吗?有人告诉我,使用polyroot所需的CPU时间是您对此问题的分析解决方案(即5+6log2/36)所建议的更直接的方法的40倍

此外,除非你精通浮点运算,否则你会得到一个微妙的错误结果。请注意,R中的此类计算量实际上无法验证此类数学结果;它只能证实这一点,也就是说,您希望代码输出和数学不会相互矛盾


如果是这样的话,有没有更有效的方法来实现这个结果?

实际上,您不需要多根,只需检查判别式即可

mean(replicate(100000, {
    coef = runif(3)  
    delta = coef[2]^2 - 4*coef[1]*coef[3] # b^2 - 4ac
    delta>0
}))
如果你坚持使用polyroot

mean(replicate(100000, {
    coef = runif(3)  
    roots = polyroot(coef)
    all.equal(Im(roots),c(0,0))==TRUE
}))

在我的计算机上,第一种方法用了0.688秒,第二种方法用了9.923秒。实际上,你不需要多根,只要检查判别式就可以了

mean(replicate(100000, {
    coef = runif(3)  
    delta = coef[2]^2 - 4*coef[1]*coef[3] # b^2 - 4ac
    delta>0
}))
如果你坚持使用polyroot

mean(replicate(100000, {
    coef = runif(3)  
    roots = polyroot(coef)
    all.equal(Im(roots),c(0,0))==TRUE
}))

在我的计算机上,第一种方法用了0.688秒,第二种方法用了9.923秒

为什么需要polyroot?检查一下判别式。事实上,有一个定理我已经记不起来了,经过这么多年,它给出了任何多项式的实根和虚根的所有可能数,基于系数中符号变化的计数。对于所有的实系数,虚根都是成对的,这并不奇怪。为什么需要多根呢?检查一下判别式。事实上,有一个定理我已经记不起来了,经过这么多年,它给出了任何多项式的实根和虚根的所有可能数,基于系数中符号变化的计数。对于所有的实数系数,虚数根成对出现,这并不奇怪。如果我使用polyroot,我想知道命令是什么。你也可以给我看一下吗?只是想了解为什么它们在运行时间方面不同…第二组命令需要花那么多时间做什么?在第二种方法中,额外的时间用于计算精确的根,这是没有必要的,因为判别式已经可以指示根是否为真。另外。。。你能评论一下什么是all.equalmroots,c0,0==真平均值吗?Imroots返回根的虚部,这个命令检查根是否有0虚部,即它们是否为真。如果我使用polyroot,我想知道这个命令是什么。你也可以给我看一下吗?只是想了解为什么它们在运行时间方面不同…第二组命令需要花那么多时间做什么?在第二种方法中,额外的时间用于计算精确的根,这是没有必要的,因为判别式已经可以指示根是否为真。另外。。。你能评论一下all.equalImroots,c0,0==真平均值是什么吗?Imroots返回根的虚部,这个命令检查根是否有零虚部,即它们是否为真。