Search code examples
ryacas

Solving an algebraic equation


I'm trying to solve this equation: ((2300+1900*1)+(x+2300+1900*1)*0.002)/(600-400) =1

Is there a way to do this with R?

ATTEMPT with incorrect solution:

library(Ryacas)
eq <- "((2300+1900*1)+(x+2300+1900*1)*0.002)/(600-400) ==1 "
# simplify the equation:
library(glue)
yac_str(glue("Simplify({eq})"))
library(evaluate)
evaluate(eq,list(x=c(0,1,10,100,-100)))

evaluate() just returns the equation:

"((2300+1900*1)+(x+2300+1900*1)*0.002)/(600-400) ==1 " 

The answer for the equation is −2004200


Solution

  • Here is a base R solution.
    Rewrite the equation in the form of a function, use curve to get two end points where the function has different signs and put uniroot to work.

    f <- function(x) ((2300+1900*1)+(x+2300+1900*1)*0.002)/(600-400) - 1
    curve(f, -1e7, 1)
    uniroot(f, c(-1e7, 1))
    #$root
    #[1] -2004200
    #
    #$f.root
    #[1] 0
    #
    #$iter
    #[1] 1
    #
    #$init.it
    #[1] NA
    #
    #$estim.prec
    #[1] 7995800
    

    Following the discussion in the comments to the question, here is a general solution. The function whose roots are to be found now accepts an argument params in order to pass the values of rent, salary, number of workers, price, unit cost and capital cost. This argument must be a named list.

    f <- function(x, K = 1, params) {
      A <- with(params, rent + salary*workers)
      with(params, (A + (x + A)*capitalcost)/(price - unitcost) - K)
    }
    
    params <- list(
      rent = 2300, 
      salary = 1900, 
      workers = 1, 
      price = 600, 
      unitcost = 400, 
      capitalcost = 0.002
    )
    curve(f(x, params = params), -1e7, 1)
    uniroot(f, c(-1e7, 1), params = params)