问题描述
enter image description here我对解决R中的函数的可能性有疑问,但是知道答案确实有助于更好地理解R。
0.10 =(1 /(1 +((((1.04e + 19 *((T / 300)^(3/2)))/(4e + 16)) exp((-(0.045) /(0.0259(T/300))))))))
如何在R中求解此表达式并找到T的值?
解决方法
您的方程式没有解决方案。要看到此定义函数,定义为正实数,
f <- function(T) (1/(1+(((1.04e+19*((T/300)^(3/2)))/(4e+16))*exp((-(-0.045)/(0.0259*(T/300)))))))
并定义一个函数f(x) - a
,以便求解方程f(x) - a = 0
。
g <- function(x,a) f(x) - a
现在绘制第二个函数。
curve(g(x,0.10),1e3)
如图所示,g(x,0.10) = f(x) - 0.10
的所有值均为正,f(x) != 0.10
的所有值均为x
。
从分析上讲,如果函数永不更改,则符号没有根。由于该函数是连续的,因此我们要做的就是检查其值0
附近和最大值。
g(.Machine$double.eps,0.10)
#[1] -0.1
最大值由optimise
确定。
optimise(g,c(0,1e3),a = 0.10,maximum = TRUE)
#$maximum
#[1] 347.4904
#
#$objective
#[1] -0.09931205
两个值均为负,这确认了图形显示的内容。
编辑
上面所说的一切都是对的,但显然函数的表达是错误的。使用正确的表达式,可以用uniroot
找到根。请注意,问题图像中给出的解决方案是通过反复试验找到的,下面的解决方案是通过数值方法找到的,但是它们是相同的解决方案。
f <- function(T) {
numer <- 1.04e19*(T/300)^(3/2) / 4e16
numer <- numer * exp(-0.045/(0.0259*T/300))
numer <- 1 + numer
1/numer
}
g <- function(x,a) f(x) - a
xzero <- uniroot(g,interval = c(0,1e3))
xzero
#$root
#[1] 192.9487
#
#$f.root
#[1] -1.149569e-10
#
#$iter
#[1] 13
#
#$init.it
#[1] NA
#
#$estim.prec
#[1] 6.103516e-05
curve(g(x,1e3)
abline(h = 0)
points(xzero$root,col = "blue",pch = 16)