Rezolvarea unei ecuații simple în R (Programare, R)

Magnus Metz a intrebat.

Am o întrebare probabil foarte simplă cu privire la posibilitatea de a rezolva funcții în R, dar să știu răspunsul m-ar ajuta foarte mult să înțeleg mai bine R.

Am următoarea ecuație:

0=-100/(1+r)+(100-50)/(1+r)^2+(100-50)/(1+r)^3+…(100-50)/(1+r)^10

Cum pot rezolva această ecuație în R găsind variabila r?

Am încercat ceva de genul acesta:

n <- c(2:10)
0 = -100/(r+1)+sum((100-50)/((1+r)^n))

Dar am primit un mesaj de eroare:

Error in 0 = -100/(r + 1) + sum((100 - 50)/((1 + r)^n)) : 
invalid (do_set) left-hand side to assignment

Care este problema și cum pot găsi r?

3 răspunsuri
Hans Roggeman

Există o mulțime de biblioteci de optimizare și de căutare a rădăcinilor pentru R link aici. Dar în R nativ:

fnToFindRoot = function(r) {
  n <- c(2:10)
  return(abs(-100/(r+1)+sum((100-50)/((1+r)^n))))
}
# arbitrary starting values
r0 = 0
# minimise the function to get the parameter estimates
rootSearch = optim(r0, fnToFindRoot,method = 'BFGS', hessian=TRUE)
str(rootSearch)
fnToFindRoot(rootSearch$par)

Această funcție este foarte volatilă. Dacă sunteți dispus să puneți rădăcina între paranteze, probabil că vă este mai bine cu uniroot:

fnToFindRoot = function(r,a) {
  n <- c(2:10)
  return((-100/(r+1)+sum((100-50)/((1+r)^n)))-a)
}
str(xmin <- uniroot(fnToFindRoot, c(-1E6, 1E6), tol = 0.0001, a = 0))

a este acolo pentru a putea căuta o rădăcină la orice valoare arbitrară.

Comentarii

  • Biblioteca lui Grothendieck este foarte bine închegată. Eu aș verifica-o și aș dezrobi. Răspunsul la optimizare este din cauza faptului că am făcut prea multe din acestea în ultima vreme. –  > Por Hans Roggeman.
  • Nu optim face un lucru greșit atunci când se dorește găsirea rădăcinii (zero) a funcției? optim încearcă să găsească minimul, nu? –  > Por Martin Ueding.
G. Grothendieck

Încearcă bisecția. Aceasta converge către r = 0.4858343 în 25 de iterații:

library(pracma)
bisect(function(r) -100/(1+r) + sum(50/(r+1)^seq(2, 10)), 0, 1)

dând:

$root
[1] 0.4858343

$f.root
[1] 8.377009e-07

$iter
[1] 25

$estim.prec
[1] 1.490116e-08

Rain Song

Fie x = 1/(1+r), , astfel încât ecuația ta ar trebui să fie:

0-100x + 50x^2 + 50x^3 + … + 50x^10 = 0.

apoi în R:

x <- polyroot(c(0, -100, rep(50, 9)))
(r <- 1/x - 1)

Iată răspunsul:

 [1]        Inf+      NaNi  0.4858344-0.0000000i -1.7964189-0.2778635i
 [4] -0.3397136+0.6409961i -0.3397136-0.6409961i -1.4553556-0.7216708i
 [7] -0.9014291+0.8702213i -0.9014291-0.8702213i -1.7964189+0.2778635i
[10] -1.4553556+0.7216708i

Tags: