R:使用优化求解非线性方程
R: solving non linear equation using optimise
所以我正在尝试求解一个包含 3 个未知因子的方程式。我决定使用 nlm。
我定义了我的函数 F,它将 3 个参数放在一个向量中,我试图找到的是验证以下等式的向量 X:
F(X)-F(X1)-F(X2)-F(X3)=0
所以我将 nlm 应用于 LHS。但我得到了一些奇怪的结果,而不是让 LHS 接近于零的解决方案,它给出了使 LHS 收敛到 -infinite
的解决方案
任何人都可以指出我正确的方向。
提前谢谢大家:)
rm(list=ls())
Ta <- 30 #commun parameter
c <- 0.09 #commun parameter
Delta_T <- c( 10, 20, 30 ) #vector containing X1(1), X2(1) and X3(1)
tetha <- c( 0.9, 1.1, 1.5 ) #vector containing X1(2), X2(2) and X3(2)
t <- c( 300, 400, 100 )
N <- t/tetha #vector containing X1(3), X2(3) and X3(3)
F <- function(X){ #definition of function F
x <- X[1]
y <- X[2]
N <- X[3]
N*(min(c(y,2))/2)^1/3*x^1.9*exp(-1414/(x+Ta+273))*(1+c*(x/20)^2.1*(2/min(y,2))^1/3)
}
S <- vector("numeric",length(t)) #creation of F(X1) F(X2) and F(X3)
for (i in 1:length(t)) {
S[i]=F(c(Delta_T[i],tetha[i],N[i]))
}
Eq <- function(X){ #creation of F(X)-F(X1)-F(X2)-F(X3)
F(X)-sum(S)}
p <- c(min(Delta_T),min(tetha),min(N))
Sol = nlm(Eq,p)
编辑:所以我找到了问题的解决方案,而不是写
Eq <- function(X){ #creation of F(X)-F(X1)-F(X2)-F(X3)
F(X)-sum(S)}
我将 abs() 应用于函数 Eq
Eq <- function(X){ #creation of F(X)-F(X1)-F(X2)-F(X3)
abs(F(X)-sum(S)) }
我没有得到令人满意的结果,错误接近于 0,但 X[2] 比 2 大得多,因为 min(2,X[2])
所以我找到了这个问题的解决方案,我没有使用函数 nlm
来求解我的非线性方程,而是使用了包 nloptr
中的函数 auglag
。
Eq <- function(X){ #creation of F(X)-F(X1)-F(X2)-F(X3)
F(X)-sum(S)}
p <- c(min(Delta_T),min(tetha),min(N))
Sol = auglag(p,Eq,hin = Eq)
auglag
是一个非常强大的非线性优化算法。结果非常令人满意,因为我收到错误 10e-7
所以我正在尝试求解一个包含 3 个未知因子的方程式。我决定使用 nlm。
我定义了我的函数 F,它将 3 个参数放在一个向量中,我试图找到的是验证以下等式的向量 X:
F(X)-F(X1)-F(X2)-F(X3)=0
所以我将 nlm 应用于 LHS。但我得到了一些奇怪的结果,而不是让 LHS 接近于零的解决方案,它给出了使 LHS 收敛到 -infinite
的解决方案任何人都可以指出我正确的方向。
提前谢谢大家:)
rm(list=ls())
Ta <- 30 #commun parameter
c <- 0.09 #commun parameter
Delta_T <- c( 10, 20, 30 ) #vector containing X1(1), X2(1) and X3(1)
tetha <- c( 0.9, 1.1, 1.5 ) #vector containing X1(2), X2(2) and X3(2)
t <- c( 300, 400, 100 )
N <- t/tetha #vector containing X1(3), X2(3) and X3(3)
F <- function(X){ #definition of function F
x <- X[1]
y <- X[2]
N <- X[3]
N*(min(c(y,2))/2)^1/3*x^1.9*exp(-1414/(x+Ta+273))*(1+c*(x/20)^2.1*(2/min(y,2))^1/3)
}
S <- vector("numeric",length(t)) #creation of F(X1) F(X2) and F(X3)
for (i in 1:length(t)) {
S[i]=F(c(Delta_T[i],tetha[i],N[i]))
}
Eq <- function(X){ #creation of F(X)-F(X1)-F(X2)-F(X3)
F(X)-sum(S)}
p <- c(min(Delta_T),min(tetha),min(N))
Sol = nlm(Eq,p)
编辑:所以我找到了问题的解决方案,而不是写
Eq <- function(X){ #creation of F(X)-F(X1)-F(X2)-F(X3)
F(X)-sum(S)}
我将 abs() 应用于函数 Eq
Eq <- function(X){ #creation of F(X)-F(X1)-F(X2)-F(X3)
abs(F(X)-sum(S)) }
我没有得到令人满意的结果,错误接近于 0,但 X[2] 比 2 大得多,因为 min(2,X[2])
所以我找到了这个问题的解决方案,我没有使用函数 nlm
来求解我的非线性方程,而是使用了包 nloptr
中的函数 auglag
。
Eq <- function(X){ #creation of F(X)-F(X1)-F(X2)-F(X3)
F(X)-sum(S)}
p <- c(min(Delta_T),min(tetha),min(N))
Sol = auglag(p,Eq,hin = Eq)
auglag
是一个非常强大的非线性优化算法。结果非常令人满意,因为我收到错误 10e-7