Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Solving an algebraic equation

Tags:

r

yacas

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

like image 570
RIckHenr Avatar asked Apr 11 '26 02:04

RIckHenr


2 Answers

It sounds like you want to Solve() for x rather than merely simplifying ... ? The following code solves the equation, strips off the x== from the solution, and evaluates the expression:

eq2 <- gsub("x==","",yac_str(glue("Solve({eq},x)")))
[1] "{(-0.80168e6)/0.4}"
eval(parse(text=eq2))
[1] -2004200
like image 154
Ben Bolker Avatar answered Apr 13 '26 21:04

Ben Bolker


1) Ryacas Use the Ryacas package solve as shown below. (Thanks to @mikldk for improvement to last line.)

library(Ryacas)
eq <- "((2300+1900*1)+(x+2300+1900*1)*0.002)/(600-400) ==1 "  # from question

res <- solve(ysym(eq), "x")
as_r(y_rmvars(res))  # extract and convert to R
## [1] -2004200

if eq has R variables in it, here h is referenced in eq2, then use eval to evaluate the result.

h <- 2300
eq2 <- "((h+1900*1)+(x+2300+1900*1)*0.002)/(600-400) ==1 "  # from question
res2 <- solve(ysym(eq2), "x")
eval(as_r(y_rmvars(res2)))
## [1] -2004200

2) Ryacas0 or using eq from above with the Ryacas0 package:

library(Ryacas0)

res <- Solve(eq, "x")
eval(Expr(res)[[1:3]]) # convert to R
## [1] -2004200

3a) Base R In light of the fact that this is a linear equation and the solution to the following where A is the slope and B is the intercept:

A * x + B = 0

is

x = - B / A

if we replace x with the imaginary 1i and then move the rhs to the lhs we have that B and A are the real and imaginary parts of that expression. No packages are used.

r <- eval(parse(text = sub("==", "-", eq)), list(x = 1i))
-Re(r) / Im(r)
## [1] -2004200

3b) If we move the rhs to lhs then B equals it at x=0 and A equals the derivative wrt x so another base R solution would be:

e <- parse(text = sub("==", "-", eq))
- eval(e, list(x = 0)) / eval(D(e, "x"))
## [1] -200420
like image 36
G. Grothendieck Avatar answered Apr 13 '26 21:04

G. Grothendieck



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!