优化问题求解具有两个条件的4个参数的方程

问题描述

我有这个等式:

f(x) = i * ln(j * x + k)

有以下两个条件:f(0) = 6f(1) = 12

经过数小时的研究,我找不到如何优化参数ijk的条件,这些参数符合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

但是我不明白您要优化什么。