问题描述
我有这个等式:
f(x) = i * ln(j * x + k)
有以下两个条件:f(0) = 6
和f(1) = 12
经过数小时的研究,我找不到如何优化参数i
,j
和k
的条件,这些参数符合RStudio的条件。
我知道如何使用Excel进行操作,但是我想成功使用R进行操作。
有人知道用R解决此问题吗?
解决方法
我可以为您提供蒙特卡洛方法 所以: 经过数学计算,您会发现:
i = log(k)/ 6
k = exp(72 * log(j + k))
因此您应用了蒙特卡洛方法:
a=data.frame(k=round(runif(1000000,-2,2),4),j=round(runif(1000000,4))
a$k2=round(exp(72*log(a$j+a$k)),4)
a=a[-which(is.na(a$k2)==TRUE),] # you delete the NA coz of negatif number in log
library(tidyverse) # to use "near" function
a[which(near(a$k,a$k2,0.001)==TRUE),]
,
优化
将f
定义为问题中的函数,除了我们明确列出所有自变量,并将ss
定义为残差平方和。然后使用任意值i最小化ss
(因为我们有两个方程式和3个未知数)。下面,我们以i = 10作为输入,展示j和k(在输出的par
组件中)的解决方案。
f <- function(x,i,j,k) i * log(j * x + k)
ss <- function(p,i) (f(x = 0,i = i,j = p[1],k = p[2]) - 6)^2 +
(f(x = 1,j= p[1],k = p[2]) - 12)^2
optim(1:2,ss,i = 10)
给予:
$par
[1] 1.497972 1.822113
$value
[1] 9.894421e-09
$counts
function gradient
59 NA
$convergence
[1] 0
$message
NULL
nlsLM
或者,我们可以使用非线性最小二乘法。由于我们不需要定义ss
,但确实需要一个包,因此它的指定稍微容易些。由于nlsLM
不能很好地处理零残留问题,因此我们在R的核心中使用nls
而不是nls
。
library(minpack.lm)
nlsLM(y ~ f(x,k),data = list(y = c(6,12),x = 0:1,i = 10),start = c(j = 1,k = 2))
给予:
Nonlinear regression model
model: y ~ f(x,k)
data: list(y = c(6,i = 10)
j k
1.50 1.82
residual sum-of-squares: 0
Number of iterations to convergence: 4
Achieved convergence tolerance: 1.49e-08
,
鉴于您可以根据k求解i和j的约束:
f(0) = 6
=> i*ln( j*0 + k) = 6
=> i*ln(k) = 6
=> i = 6/ln(k)
f(1) = 12
=> i*ln( j*1 + k) = 12
=> (6/ln(k))*ln(j+k) = 12
=> ln(j+k) = 2*ln(k)
=> j+k = k*k
=> j = k*k-k
所以
f(x) = (6/ln(k))*ln( (k*(k-1)*x + k)
作为支票
f(0) = (6/ln(k))*ln( (k*(k-1)*0 + k)
= (6/ln(k))*ln(k) = 6
f(1) = (6/ln(k))*ln( (k*(k-1)*1 + k)
= (6/ln(k))*ln( k*k)
= (6/ln(k))*2*ln(k)
= 12
但是我不明白您要优化什么。