我无法从 polyroot()提供的复杂数组中找到非复杂的解决方案。
coef1 = c(-10000,157.07963267949,0,0.523598775598299)
roots=polyroot(coef1)
返回
##[1] 23.01673- 0.00000i -11.50837+26.40696i -11.50837-26.40696i
我希望索引没有虚构部分。在这种情况下:
roots[1]
## [1] 23.01673-0i
我将在循环中应用此过程,并希望使用 Im()来隔离非复杂的解决方案,但是,当我尝试使用时:
Im(roots)
## [1] -2.316106e-23 2.640696e+01 -2.640696e+01
因此不能使用类似的东西:
which(Im(roots)==0)
返回
##integer(0)
我确信根据以下情节有一个真正的根源:
plot(function(x) -10000 + 157.07963267949*x + 0.523598775598299*x^3,xlim=c(0,50))
abline(0,0,col='red')
是否有一些有趣的四舍五入?我更喜欢不涉及 ceiling()或类似的解决方案。你们中的任何一位R专家有什么想法吗?干杯,伙计们和加尔斯!
答案 0 :(得分:3)
您可以使用某个错误或阈值:
Re(roots)[abs(Im(roots)) < 1e-6]
[1] 23.01673
以图形方式:
curve(-10000 + 157.07963267949*x + 0.523598775598299*x^3,xlim=c(0,50))
abline(0,0,col='red')
real_root <- Re(roots)[abs(Im(roots)) < 1e-6]
text(real_root,1,label=round(real_root,2),adj=c(1,-1),col='blue')
答案 1 :(得分:1)
注意第一个根的荒谬的小虚部。这是一个舍入问题,不幸的是,当计算机进行浮点运算时,它很常见。虽然它有点不合适,但试试
which(round(Im(roots), 12)
将它舍入到12位小数(比你可能需要的精度更高)。