首页 > 解决方案 > 优化求解器函数

问题描述

我正在尝试设置一个“求解器”函数以将“gfc”的值优化为零改变(并找到)下面等式中的变量“fc”。给出了参数。

f0 = 6
f1 = 1
k = 2
ft = 0.3

gfc = ft-((f0-fc)/k)+((f1/k)*ln((fc-f1)/(f0-f1)))

在Excel上求解这个函数,发现fc=5.504的值。

标签: rmathematical-optimizationsolver

解决方案


我假设你的意思是你想解决等于零的fc值。gfc我们假设介于和fc之间。在这种情况下,使用问题中的常量,我们有以下基本 R 解决方案。(具有此类功能的其他软件包包括 nleqslv 和 rootSolve。)f0f1

1)优化我们可以最小化gfc^2:

gfc <- function(fc) ft-((f0-fc)/k)+((f1/k)*log((fc-f1)/(f0-f1)))
optimize(function(x) gfc(x)^2, c(f0, f1))

给予:

$minimum
[1] 5.504383

$objective
[1] 4.777981e-12

2) uniroot或者我们可以直接使用uniroot

u <- uniroot(gfc, c(f0, f1))

给予:

> u
$root
[1] 5.504386

$f.root
[1] 6.72753e-09

$iter
[1] 5

$init.it
[1] NA

$estim.prec
[1] 6.103516e-05

3)我们也可以直接解决这个问题,无需任何功能,如optimizeuniroot通过重写

gfc(fc) = 0

在这里,我们将 gfc 的第一个术语移至 LHS,然后在该术语中隔离 fc,将其他所有内容放在 RHS 上。

 fc = f0 - k*(ft + ((f1/k)*log((fc-f1)/(f0-f1))))

把它写成:

fc = f(fc)

我们只是迭代 f。

f <- function(fc) f0 - k*(ft + ((f1/k)*log((fc-f1)/(f0-f1))))
fc <- (f0 + f1)/2  # starting value
for(i in 1:10) fc <- f(fc)

fc
## [1] 5.504386

4)蛮力另一种方法是在许多点上评估gfc,然后选择gfc^2最少的那个。将区间细分得越细,答案就越准确。

s <- seq(f0, f1, length = 100000)
g <- gfc(s)
s[which.min(g^2)]
## [1] 5.504395

图形

我们可以展示解决方案:

curve(gfc, f0, f1)
abline(h = 0, v = u$root, lty = 2)
axis(1, u$root, round(u$root, 3))

在此处输入图像描述


推荐阅读