r - 优化求解器函数
问题描述
我正在尝试设置一个“求解器”函数以将“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的值。
解决方案
我假设你的意思是你想解决等于零的fc
值。gfc
我们假设介于和fc
之间。在这种情况下,使用问题中的常量,我们有以下基本 R 解决方案。(具有此类功能的其他软件包包括 nleqslv 和 rootSolve。)f0
f1
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)我们也可以直接解决这个问题,无需任何功能,如optimize
或uniroot
通过重写
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))
推荐阅读
- javascript - 能够在音频播放器上选择起点和终点
- excel - MSBI Merge:如何将 Excel 文件与 SSIS 中的测试文件合并?
- python - 获取streamlit中上传文件的原名
- azure - 如何从事件网格中获取成功部署 Azure 模板的事件
- c# - 如何在检查器中创建文本/字符串容器以添加描述/信息文本以及如何适应并将其转换为 ui 文本组件?
- python - 什么是实现图像跟随光标快速移动的好方法?
- amazon-web-services - 为什么我的 aws-cli 构建在构建时可以在中间容器上工作,但不能在最终容器上工作?
- java - 为什么 startActivityForResult 没有显示在回收器视图适配器中?
- swift - SwiftUI AnyTransition.animation 在使用 .offset 时不会覆盖动画参数
- javascript - 如何从 React Element 获取我的 React 组件对象