【问题标题】:Solving equations in R similar to the Excel solver parameters function在 R 中求解方程,类似于 Excel 求解器参数函数
【发布时间】:2015-05-16 11:13:00
【问题描述】:

我有一个关于在 R 中求解函数的可能性的问题,并使用 excel 做同样的事情。

但是我想用 R 来展示 R 对我的同事更好:)

这是等式:

f0<-1e-9
t_pw<-30e-9
a<-30.7397582453682
c<-6.60935546184612

P<-1-exp((-t_pw)*f0*exp(-a*(1-b/c)^2))

我想找到P&lt;-0.5b 值。在 Excel 中,我们可以通过选择 P 值列并将其设置为 0.5,然后使用求解器参数函数来实现。

我不知道哪种方法最好?或者有其他方法吗?

谢谢。

【问题讨论】:

  • 请参阅包 BBktsolve 以获取两个示例。或stats:optim
  • @CarlWitthoft:使用你的包我得到“不成功的收敛”和几个警告:“函数返回一个标量。函数 BBoptim 或 spg 更好。”有任何想法吗?谢谢
  • @vonjd 那么,跟随警告并尝试其他功能怎么样?您的数据可能接近单一或噪音过大,可能需要进行一些试验才能得到答案(更不用说有效答案了)
  • @CarlWitthoft:感谢您的快速回复。我用你的包尝试了上面的例子,但它可能定义不明确。所以 BB 和 ktsolve 不能按照你在评论中的建议使用?
  • 如果@Ben 提供的解决方案是正确的,您应该编辑您的问题以避免混淆。谢谢。

标签: r excel function solver


【解决方案1】:

我强烈怀疑你的等式应该包含-t_pw/f0,而不是-t_pw*f0,并且t_pw 应该是3.0e-9,而不是30e-9

 Pfun <- function(b,f0=1e-9,t_pw=3.0e-9,
                  a=30.7397582453682,
                  c=6.60935546184612) {
               1-exp((-t_pw)/f0*exp(-a*(1-b/c)^2))
           }

然后@Lyzander 的uniroot() 建议工作正常:

 u1 <- uniroot(function(x) Pfun(x)-0.5,c(6,10))

这里的估计值为 8.05。

 par(las=1,bty="l")
 curve(Pfun,from=0,to=10,xname="b")
 abline(h=0.5,lty=2)
 abline(v=u1$root,lty=3)

【讨论】:

    【解决方案2】:

    如果你想解方程,最简单的方法是使用 base-R 中的uniroot

    f0<-1e-9
    t_pw<-30e-9
    a<-30.7397582453682
    c<-6.60935546184612
    
    func <- function(b) {
        1-exp((-t_pw)*f0*exp(-a*(1-b/c)^2)) - 0.5
    }
    
    #interval is the range of values of b to look for a solution
    #it can be -Inf, Inf
    > uniroot(func, interval=c(-1000, 1000), extendInt='yes')
    Error in uniroot(func, interval = c(-1000, 1000), extendInt = "yes") : 
      no sign change found in 1000 iterations
    

    正如您在上面看到的,我的 unitroot 函数失败了。这是因为您的方程没有单一的解决方案,也很容易看到。 exp(-0.0000000000030 * &lt;positive number between 0-1&gt;) 实际上(非常接近)1,所以你的等式变为 1 - 1 - 0.5 = 0 不成立。您也可以通过绘图看到相同的结果:

    curve(func) #same result for curve(func, from=-1000, to=1000)
    

    在这个函数中,任何 b 的结果都是 -0.5。

    因此,一种快速完成的方法是uniroot,但可能适用于不同的方程式。

    还有一个工作示例:

    myfunc2 <- function(x) x - 2 
    
    > uniroot(myfunc2, interval=c(0,10))
    $root
    [1] 2
    
    $f.root
    [1] 0
    
    $iter
    [1] 1
    
    $init.it
    [1] NA
    
    $estim.prec
    [1] 8
    

    【讨论】:

    • 是的,但我可以使用 excel_ 获得b 的解决方案?
    • 仅当您优化时。 excel中的求解器进行优化,即找到b的值最小化或最大化函数。这与求解方程完全不同。如果你想最小化/最大化然后使用optim 作为:optim(1, func, method='Brent', upper=100, lower=1)。 Optim 默认最小化,将等式的符号更改为最大化。在这种情况下,您的函数对任何 b 产生相同的结果,这意味着解决方案将始终是上限。在 optim 的输出中,$par 是使函数最小化的 b 值。
    • 是的,我正在寻找 optim 函数。另一方面,b 的值应该是 8.5,但 optim(1, func, method='Brent', upper=100, lower=1) 给出的上限值是 `100?
    • 对于b 的任何值,您的函数都会返回相同的值-0.5。因此,没有任何值可以最小化您的功能。因此, optim 仅将上限作为best 解决方案返回,因为它尝试从下限到上限开始的值。它在检查 b=100 时停止,并且由于在找到最小值方面没有发现任何改进,因此将其返回为 optimum 值。我不知道为什么 excel 会给出 8.5 的结果,但这让我认为你在问题中复制了错误的函数。如果不是,excel 可能会以不同的方式迭代 b 的值。
    • 谢谢你的解释。我检查了功能,它完全一样。也许是擅长以其他方式做到这一点。无论如何,谢谢。
    猜你喜欢
    • 1970-01-01
    • 2020-10-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多