我有一个关于在 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), 0, 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, a = 0.10, 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, 0.10), 0, 1e3)
abline(h = 0)
points(xzero$root, 0, col = "blue", pch = 16)