Skip to content
Prev 305103 / 398506 Next

Solving a system of two equations

On 10-09-2012, at 01:22, berg1546 wrote:

            
You can use package nleqslv for solving systems of nonlinear equations.
Example for your system:

library(nleqslv)

theta<-c(180,135,90)/(2*pi)
x<-c(0,0,15)
y<-c(20,0,0)

f <- function(par) {
    fval  <- numeric(length(par))
    x_loc <- par[1]
    y_loc <- par[2]

    fval[1] <- -sum((y_loc-y)*(sin(theta)*(x_loc-x)-cos(theta)*(y_loc-y))/(((x_loc-x)^2+(y_loc-y)^2)^0.5)^3)
    fval[2] <- -sum((x_loc-x)*(sin(theta)*(x_loc-x)-cos(theta)*(y_loc-y))/(((x_loc-x)^2+(y_loc-y)^2)^0.5)^3)

    fval
}

nleqslv(c(17,17), f)

I haven't got a clue about good starting values.
I get the impression is that your system is quite sensitive.
nleqslv finds a solution but it is very different from the starting value. It's up to you to verify the correctness of your system.

You can simplify the computation in your function by computing the common subexpressions only once

f1 <- function(par) {
    fval  <- numeric(length(par))
    x_loc <- par[1]
    y_loc <- par[2]
    
    A <- (sin(theta)*(x_loc-x)-cos(theta)*(y_loc-y))
    B <- (((x_loc-x)^2+(y_loc-y)^2)^0.5)^3
    C <- A/B
    fval[1] <- -sum((y_loc-y)*C)
    fval[2] <- -sum((x_loc-x)*C)

    fval
}    


Berend