优化求解器功能

时间:2019-07-04 19:20:41

标签: r mathematical-optimization solver

我正在尝试设置“ Solver”功能,以将“ 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的值。

2 个答案:

答案 0 :(得分:2)

我假设您的意思是您想求解base = sum/n; extra = sum%n; // initialize the input control variables fileIndex = 0 fileOffset = 0 fileRemain = length of file 0 // initialize the output control variables threadIndex = 0 threadNeeds = base if (threadIndex < extra) threadNeeds++ while (1) { // decide how many bytes can be assigned, and generate some output byteCount = min(fileRemain, threadNeeds) add (file.name, fileOffset, fileOffset+byteCount-1) to the list of ranges // decide whether to advance to the next input and output items threadNeeds -= byteCount fileRemain -= byteCount if (threadNeeds == 0) threadIndex++ if (fileRemain == 0) fileIndex++ // are we done yet? if (threadIndex == n || fileIndex == files.size()) break // if we've moved to the next input item, reinitialize the input control variables if (fileRemain == 0) { fileOffset = 0 fileRemain = length of file } // if we've moved to the next output item, reinitialize the output control variables if (threadNeeds == 0) { threadNeeds = base if (threadIndex < extra) threadNeeds++ } } 等于零的fc的值。我们假设gfc位于fcf0之间。在这种情况下,使用问题中的常量,我们有以下基本R解。 (另外,具有此类功能的软件包包括nleqslv和rootSolve。)

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

f1

给予:

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

2)uniroot ,或者我们可以直接使用$minimum [1] 5.504383 $objective [1] 4.777981e-12

uniroot

给予:

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

3)我们也可以通过重写

来直接解决此问题,而无需使用> u $root [1] 5.504386 $f.root [1] 6.72753e-09 $iter [1] 5 $init.it [1] NA $estim.prec [1] 6.103516e-05 optimize之类的任何功能
uniroot

因此,我们将gfc的第一个术语移至LHS,然后在该术语中将fc隔离开来,将所有其他内容放到RHS中。

gfc(fc) = 0

将其写为:

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

我们只是迭代f。

fc = f(fc)

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

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

图形

我们可以显示解决方案:

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

enter image description here

答案 1 :(得分:2)

您可以使用androidx.preference:1.1.0-alpha05来查找函数等于零的位置:

uniroot