非线性方程的最小化

时间:2016-08-19 23:45:13

标签: estimation optimization

我对R比较陌生,所以如果我的问题没有得到很好的表达,或者有过多的细节,我会道歉。我在这里做的是采用天然存在的C12和C13气体同位素,它们在各自的馏分(F12和F13)上以线性速率(P)产生,总和为1.然后两种同位素气体在C13为k12,C13为k13。然后我想用最小化函数求解P和k12。

方程是:

方程1:conc.12 =((F12 * P)/ k12) - (((F12 * P)/ k12)-c12zero)exp(-k12(t-t0))

方程2:conc.13 =((F13 * P)/ k13) - (((F13 * P)/ k13)-c13zero)exp(-k13(t-t0))

方程3:求和平方误差=总和(((conc.12-c12meas)/0.07)^ 2)+ sum(((zh-c13-c13meas)/0.07)^ 2)

< conc.12和conc.13是在时间t的两种同位素的估计浓度 c12meas和c13meas是在时间t测量的两种同位素的浓度

t0是初始时间点

F12和F13是总和为1的分数

k12和k13是两种同位素的指数衰减系数,k13 = k12 / 1.06

P是12CH4和13CH4的线性生产率

具有已知近似参数的玩具数据集的数据如下:

时间c12meas c13meas

1 109.7000 19.35660
2 118.9150 18.74356
3 127.6693 18.15943
4 135.9858 17.60285
5 143.8865 17.07253 6 151.3922 16.56722
7 158.5226 16.08575
8 165.2964 15.62698
9 171.7316 15.18986
10 177.8450 14.77336
11 183.6528 14.37650
12 189.1701 13.99837
13 194.4116 13.63807
14 199.3911 13.29476
15 204.1215 12.96765
16 208.6154 12.65597
17 212.8847 12.35899
18 216.9404 12.07602
19 220.7934 11.80639
20 224.4537 11.54949

请注意,实际中的行长度相同,上面的问题与将它们粘贴到Web门户中有关。

  1. 我首先尝试使用以下代码解决这些方程:

      error.func <- function (k12, P) {  
      t <- Time
      t0 <-Time[1]
      c12zero=c12meas[1]
      c13zero=c13meas[1]
      k13=k12/1.06
      F12=0.98
      F13=1-F12
      ratio.12<- (F12*P)/k12
      exp.12<- exp(-k12*(t-t0))
      conc.12<-ratio.12 - ((ratio.12-c12zero)*exp.12)
      ratio.13<- (F13*P)/k13
      exp.13<- exp(-k13*(t-t0))
      conc.13<- ratio.13 - ((ratio.13-c13zero)*exp.13)
      error <- sum(((conc.12-c12meas)/0.07)^2)
      +sum(((conc.13-c13meas)/0.07)^2)
      return (error)
        }
      fit.model <- optim(k12=.05, P = 15, error.func)
    
  2. 这是R中的错误代码: &#34;优化错误(k12 = 0.05,P = 15,error.func):   不能强迫类型&#39;关闭&#39;到'&#39; double&#39;类型的向量 另外:警告信息: 在optim(k12 = 0.05,P = 15,error.func):   Nelder-Mead的一维优化是不可靠的: 使用&#34;布伦特&#34;或直接优化()&#34;

    我对此的解释是,optim函数不能同时求解多个方程,所以我尝试了solnp函数。

      isotopes2<- function(x) {
      t=Time
      t0<-Time[1]
      c12zero=c12meas[1]
      c13zero=c13meas[1]
      k13=x[1]/1.06
      F12=0.98
      F13=1-F12
      ratio.12<- (F12*x[2])/x[1]
      exp.12<- exp(-x[1]*(t-t0))
      conc.12<-ratio.12 - ((ratio.12-c12zero)*exp.12)
      ratio.13<- (F13*x[2])/k13
      exp.13<- exp(-k13*(t-t0))
      conc.13<- ratio.13 - ((ratio.13-c13zero)*exp.13)
        }
    
      error.func <- function (x) {
      t <- Time
      t0<-Time[1]
      c12zero=c12meas[1]
      c13zero=c13meas[1]
      k13=x[1]/1.06
      F12=0.98
      F13=1-F12
      ratio.12<- (F12*x[2])/x[1]
      exp.12<- exp(-x[1]*(t-t0))
      conc.12<-ratio.12 - ((ratio.12-c12zero)*exp.12)
      ratio.13<- (F13*x[2])/k13
      exp.13<- exp(-k13*(t-t0))
      conc.13<- ratio.13 - ((ratio.13-c13zero)*exp.13)
      error <- sum(((conc.12-c12meas)/0.07)^2)
      +sum(((conc.13-c13meas)/0.07)^2)
      return (error)
        }
      x0 <- c(0.05,15)
      constraint = c(0)
      fit <- solnp (x0, fun = isotopes2, eqfun = error.func, eqB=0)
    

    我收到以下错误消息: &#34;错误: solnp - &gt;错误:目标函数返回长度大于1的值!

0 个答案:

没有答案