英文:
Solving a system of non-linear equations with only one unknown
问题
I is equal to P1 - P2 = 0
P1 <- (mu_L[i]^(-1)(w_L/delta)^delta)
P2 <- (mu_H[i]^(-1)(w_H/alpha)^alpha)
task <- seq(0.01,1, by = 0.01)
alpha <- 0.55
delta <- 0.83
mu_H <- task
mu_L <- 1-task
L_L <- 0.8
L_H <- 0.2
Y <- 40000
I_start <- 0.5
I <- I_start
w_H <- alpha * I * (Y / L_H)
w_L <- delta*(1-I)*(Y / L_L)
In the definition of I, it is the task (i) in which the price of low-skill production minus the price of high-skill production is zero. the value of mu is dependent on the industry and by finding for which value of mu, the equation equals zero, one can find which industry I is. mu high is equal to i, while mu low is (1-i). i indicating the task from a uniform distribution between 0 and 1.
I have written a for loop to account for the dynamic modeling but cannot figure out how to pin down I in this, all non-linear system solvers require two unknowns for two equations and I cannot figure out how to code it in such a way that it is equal to zero as a condition.
I have tried the following approaches:
using range:
range2 <- seq(0.01,1, by = 0.001)
range <- (1 - range2)
range[which(range^(-1)(w_L/delta)^delta == range2^(-1)(w_H/alpha)^alpha)]
The issue is that the answer lies between step 14 and 15, and as the steps are too large there is no exact match found. Also not when I increase the steps to 1e-8, at some point I get an error that there are too many steps. If I could add a tolerance level here that might be the solution, however, I don't know how I can do that. I tried it like this:
r <- range^(-1)(w_L/delta)^delta - range2^(-1)(w_H/alpha)^alpha
rr <- ifelse(r<0.01, print(TRUE), print(FALSE))
data.r <- data.frame(r, rr)
length(unique(data.r$rr))
but the tolerance might be too small, at the same time, the difference must be between 0 and 1, as the mu is limited between 0 and 1. So I feel that a tolerance of 0.01 is not asking too much. In theory, that should work.
I tried the nleqslv package, but it gives me answers outside of the range [0,1].
dslnex <- function(x) {
y <- numeric(2)
y1 <- (x1^(-1)(w_L/delta)^delta)
y[2] <- (x[2]^(-1)(w_H/alpha)^alpha)
y
}
xstart=c(0.5, 0.5)
nleqslv(xstart, dslnex, control = list())
I am hoping to find for which value of mu such that the two equations for price are equal to each other so I can pin down the task (i) in which this is.
英文:
I am trying to pin down the barrier between high-skill technology and low-skill technology industries in the Task-Based model of the labor market. This takes place in the task in which the price of production is equal to each other.
I is equal to P1 - P2 = 0
P1 <- (mu_L[i]^(-1)*(w_L/delta)^delta)
P2 <- (mu_H[i]^(-1)*(w_H/alpha)^alpha)
It is part of a dynamic problem in which wage is dependent on I and I on wage. The relevant further equations are wage high and low: wage high and wage low. L_L, the labour supply linked to low and high-skill is based on data and around 0.8 for L_L and 0.2 for L_H. Y is for now set on 40,000 also based on data.
task <- seq(0.01,1, by = 0.01)
alpha <- 0.55
delta <- 0.83
mu_H <- task
mu_L <- 1-task
L_L <- 0.8
L_H <- 0.2
Y <- 40000
I_start <- 0.5
I <- I_start
w_H <- alpha * I * (Y / L_H)
w_L <- delta*(1-I)*(Y / L_L)
In the definition of I, it is the task (i) in which the price of low-skill production minus the price of high-skill production is zero. the value of mu is dependent on the industry and by finding for which value of mu, the equation equals zero, one can find which industry I is. mu high is equal to i, while mu low is (1-i). i indicating the task from a uniform distribution between 0 and 1.
I have written a for loop to account for the dynamic modelling but cannot figure out how to pin down I in this, all non-linear system solvers require two unknown for two equations and I cannot figure out how to code it in such a way that it is equal to zero as a condition.
I have tried the following approaches:
using range:
range2 <- seq(0.01,1, by = 0.001)
range <- (1 - range2)
range[which(range^(-1)*(w_L/delta)^delta == range2^(-1)*(w_H/alpha)^alpha)]
The issue is that the answer lies between step 14 and 15, and as the steps are too large there is no exact match found. Also not when I increase the steps to 1e-8, at some point I get an error that there are too many steps. If I could at a tolerance level here that might be the solution, however, I dont know how I can do that. I tried it like this:
r <- range^(-1)*(w_L/delta)^delta - range2^(-1)*(w_H/alpha)^alpha
rr <- ifelse(r<0.01, print(TRUE), print(FALSE))
data.r <- data.frame(r, rr)
length(unique(data.r$rr))
but the tolerance might be too small, at the same time, the difference must be between 0 and 1, as the mu is limited between 0 and 1. So I feel that a tolerance of 0.01 is not asking too much. In the theory that should work.
I tried the nleqslv package but it gives me answers outside of the range [0,1].
dslnex <- function(x) {
y <- numeric(2)
y[1] <- (x[1]^(-1)*(w_L/delta)^delta)
y[2] <- (x[2]^(-1)*(w_H/alpha)^alpha)
y
}
xstart=c(0.5, 0.5)
nleqslv(xstart, dslnex, control = list())
I am hoping to find for which value of mu such that the two equations for price are equal to each other so I can pin down the task (i) in which this is.
答案1
得分: 1
以下是翻译好的部分:
你可以使用 uniroot()
来实现这个功能:
f <- function(x) {
(1/x)*(w_L/delta)^delta - (1/(1-x))*(w_H/alpha)^alpha
}
uniroot(f, c(1e-2, 1))
解决方案:
$root
[1] 0.888271
$f.root
[1] -1.03622
$iter
[1] 9
$init.it
[1] NA
$estim.prec
[1] 6.103516e-05
如果需要更高精度,可以减小容差:uniroot(f, c(1e-2, 1), tol = 1e-8)
可以得到一个根为 0.8882506。
英文:
You can use uniroot()
for this:
f <- function(x) {
(1/x)*(w_L/delta)^delta - (1/(1-x))*(w_H/alpha)^alpha
}
uniroot(f, c(1e-2, 1))
Solution:
$root
[1] 0.888271
$f.root
[1] -1.03622
$iter
[1] 9
$init.it
[1] NA
$estim.prec
[1] 6.103516e-05
For more precision (if you need it) you can reduce the tolerance: uniroot(f, c(1e-2, 1), tol = 1e-8)
gives a root at 0.8882506
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论