2014-06-17 1 views
1

У меня возникли проблемы с поиском сложного решения из сложного массива, предоставленного polyroot().R - Поиск некомплексного решения из функции «polyroot»() с «Im()»

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') 

ли какое-нибудь смешное округление происходит? Я бы предпочел решение, которое не связано с потоком () или что-нибудь подобное. У любого из вас эксперты R есть идеи? Приветствия, парни и девушки!

ответ

3

Вы можете использовать определенную ошибку или порог:

Re(roots)[abs(Im(roots)) < 1e-6] 
[1] 23.01673 

Графически:

enter image description here

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

Обратите внимание на абсурдно малую мнимую часть первого корня. Это проблема округления, которая, к сожалению, распространена, когда компьютеры выполняют операции с плавающей запятой. Хотя это немного безвкусный, попробуйте

which(round(Im(roots), 12) 

который будет округлить его до 12 знаков после запятой (более точно, чем вы, вероятно, нужно).

+2

проверить функцию 'zapsmall' –

 Смежные вопросы

  • Нет связанных вопросов^_^