gpt4 book ai didi

r - 如何在 R 中解决这样的符号函数

转载 作者:行者123 更新时间:2023-12-02 07:30:37 25 4
gpt4 key购买 nike

对于有经验的人来说这应该很简单。我想用 R 解方程。我知道你可以解使用 Solve() 的不同线性/二次方程。

但是我有这样的东西:

1/20 = 1/8 * (1/(12+x)) + 1/4*(1/(40+x)) + 3/4*(1/(50+x))

在这种情况下,我该如何解决 x?它不能用手完成。必须像 TI83 那样涉及一些数值方法来解决这个问题。

在 R 中是否有一种简单快捷的方法可以在不编写代码行的情况下执行此操作?谢谢!

最佳答案

正如你所说,确实有根。首先是绘制函数:

f <- function(x) {1/20 - 1/8 * (1/(12+x)) + 1/4*(1/(40+x)) + 3/4*(1/(50+x))}
x <- seq(-100,100)
par(mar=c(2,2,1,2)) # this just minimizes plot margins
plot(x,f(x), type="l")
abline(0,0,col="blue",lty=2)

很明显,f(x)确实跨越 0,几次。

下一步是估计交叉点。一种方法是寻找符号的变化:

x <- seq(-75,0,0.001)
y <- sign(f(x)) # vector of +1 or -1
plus.to.minus <- which(diff(y)<0) # diff(y)<0 when f crosses from (+) to (-)
minus.to.plus <- which(diff(y)>0) # diff(y)>0 when f crosses from (-) to (+)
# first two roots are (+) to (-); third is (-) to (+)
lower <- c(plus.to.minus[1:2],minus.to.plus[3])
roots <- sapply(lower,function(i)uniroot(f,interval=c(x[i],x[i+1]))$root)
lapply(roots,function(x) points(roots,c(0,0,0),col="red",pch=16))
roots
# [1] -67.38961 -41.72593 -10.38446

此代码尝试查找 x其中 f(x)更改符号。 f(x)实际上有两个原因可以改变符号:根或渐近线。在您的情况下,有三个根和三个渐近线。这里的成功取决于 x 的增量是否足够小,这样您就不会完全错过交叉点。根据上图,看起来 0.001 已经足够小了。

在这里,y是一个矢量,它在 x 处包含 f 的符号(+1 或 -1)在 -75 和 0 之间,增量为 0.001。通过检查上图选择限制 (-75,0)。我们可以直观地看到有三个根。前两个从 (+) 交叉到 (-),第三个从 (-) 交叉到 (+)。因此,我们确定发生交叉的 x 的索引(使用 which(...) ),然后创建一个包含 plus.to.minus 的前两个元素的向量和 minus.to.plus 的第三个元素.然后我们调用uniroot(...)使用 increment=c(x[i],x[i+1])其中 i是适当交叉点的索引。

最后,我们绘制结果以确认我们确实找到了根。这非常重要 - 总是,总是绘制结果。结果是 uniroot(...)会在有渐近线的地方找到一个“根”,所以你必须确保你找到了真正的根。

关于r - 如何在 R 中解决这样的符号函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22183174/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com