r - 试图反转R中的复杂函数
问题描述
myfnS <- function(S,T,pH,D,f,r,I0) {
f1 <- 0.78*sqrt(S/35)*exp(T/26)
f2 <- 42*exp(T/17)
alpha <- 0.106*((f1*f^2)/(f1^2 + f^2))*exp((pH - 8)/0.56) + 0.52*(1 + T/43)*(S/35)*((f2*f^2)/(f2^2 + f^2))*exp(-D/6) + 0.00049*f^2*exp(-(T/27 + D/16))
TLsph <- (20*log(r*1000, base = 10))
I <- I0 - TLsph - ((alpha)*r)
return(I)
}
我正在尝试插入 I,以获得 r 的值,但我不知道该怎么做。
其他事物的价值保持不变;
for example for (I=50, S=34, T=10.5, pH-8.1, D=0.0395, f=10.3, I0=192)
- 我怎么找到value of r
?
解决方案
在 R 中,我不知道反向运行函数。但是,您可以使用类似于牛顿法的方法r
将50的值归零I
。
首先,需要清理该功能。T
用作参数是一个问题,因为它也是 . 的缩写TRUE
,所以我将其更改为tt
. 我还添加了*
之前隐含的运算符。
myfnS <- function(S,tt,pH,D,f,r,I0) {
f1 <- 0.78*sqrt(S/35)*exp(tt/26)
f2 <- 42*exp(tt/17)
alpha <- 0.106*((f1*f^2)/(f1^2 + f^2))*exp((pH - 8)/0.56) +
0.52*(1 + (tt)/43)*(S/35)*((f2*f^2)/(f2^2 + f^2))*exp(-D/6) +
0.00049*f^2*exp(-(tt/27 + D/16))
TLsph <- (20*log(r*1000, base = 10))
I <- I0 - TLsph - ((alpha)*r)
return(I) }
然后是一种迭代 r 值以接近 50 的 I 的方法。随着 r 上升,I 下降。一旦发现 r 的值在 50 的 1 以内,则返回 r。可以调整此阈值以获得更精确的猜测。
iterateR <- function(I=50, r=1){
if (abs(I - myfnS(r, S=34, tt=10.5, pH=8.1, D=0.0395, f=10.3, I0=192)) < 1) {
return(r)
}
else if(I - myfnS(r, S=34, tt=10.5, pH=8.1, D=0.0395, f=10.3, I0=192) > 1) {
iterateR(r=r-1)
}
else if(I - myfnS(r, S=34, tt=10.5, pH=8.1, D=0.0395, f=10.3, I0=192) < 1) {
iterateR(r=r+1)
}
}
iterateR(I=50, r=1)
#> 47
myfnS(r=47, S=34, tt=10.5, pH=8.1, D=0.0395, f=10.3, I0=192)
#> 50.8514607488626
47 的 r 给出 50.85 的 I
推荐阅读
- visual-studio-2019 - 在 Visual Studio C++ 项目中,是否可以创建像 $(SolutionDir) 这样的项目设置宏?
- html - HTML 元素在刷新时移动
- kubectl - 如何添加自定义 kustomize 变压器?
- azure - Azure Policy 存储帐户诊断日志记录
- django - request.POST.get(variable) 尝试通过 id 接收时返回 None
- prolog - 在序言中使用列表实现多重集
- azure-devops - Azure Pipelines 是否可以使用 sudo 运行 bash 命令?
- python - 使用 pyplor LogLocator 的连续色标和良好范围
- reactjs - S3 bucket next js 私下访问图片
- sql - 如何提高包含部分公共子查询的 SQL 查询性能